[DevSecOps] #4 Prometheus + MongoDB監視導入手順
Tags: devops, security
Published: 2020-08-06 04:39:26

# Prometheus + MongoDB監視導入手順

## ①はじめに
当記事は前提として、Prometheusサーバがすでに構築されていることを前提とする。詳しい構築手順は別資料参照(#Prometheus+Grafana監視基盤導入手順)

## ②Installing the MongoDB exporter

**MongoDB** exporter は右に記載のGitからCloneできる Percona’s GitHub [here](https://github.com/percona/mongodb_exporter).

goやdockerを使ってインストールを行うことができるが今回は環境の依存性を考慮してバイナリファイルを実行する形式について説明をする。

また、下記のバイナリファイルを実施するにあたりMongoDB自体にも設定を行う必要がある。

まずはインストール。

```shell
$ mkdir mongodb-exporter
$ cd mongodb-exporter
$ wget https://github.com/percona/mongodb_exporter/releases/download/v0.7.1/mongodb_exporter-0.7.1.linux-amd64.tar.gz
```

次に解凍をして。

```shell
$ tar xvzf mongodb_exporter-0.7.1.linux-amd64.tar.gz
```

おそらく右のファイルが解凍されると思う: **mongodb_exporter, LICENSE, README.md, CHANGELOG.md**.

サービスを実行していくにあたり、Prometheusにもモニタリング用のユーザを作成する必要があるがこちらは(#Prometheus+Grafana監視基盤導入手順)で実施済みのため割愛する。

```shell
$ sudo useradd -rs /bin/false prometheus
$ sudo mv mongodb_exporter /usr/local/bin/
```

## ③MongoDBの設定

MongoDB監視を行うにあたり、exporterがDBにアクセスできるようにモニタリングユーザ作成と、環境変数のパスを通してやる必要がある。（デフォルトポートをしようしていない場合はそれも設定する。）

MongoDB認証は**–auth flag**をMongoShellから立ててやる必要がある。デフォルトでは未設定なので、以下のように実行していく。まずはMongoのプロセスが生きているかを確認する。

```shell
$ ps aux | grep mongod
mongodb  13468  1.1  6.9 1490632 281728 ? Ssl  Jan05 2838:27 /usr/bin/mongod --unixSocketPrefix=/run/mongodb --config /etc/mongodb.conf
```

mongoコマンドでMongoインスタンスにログインする。

```shell
$ mongo --port 27017
```

Exiporter用に **administrator account**をcluster monitor roleを付与して作成する。

```shell
use admin
db.createUser(
  {
    user: "mongodb_exporter",
    pwd: "password",
    roles: [
        { role: "clusterMonitor", db: "admin" },
        { role: "read", db: "local" }
    ]
  }
)
```

正しく作成されていれば、以下のメッセージが出力される。

```shell
Successfully added user: {                        
        "user" : "mongodb_exporter",              
        "roles" : [                               
                {                                 
                        "role" : "clusterMonitor",
                        "db" : "admin"            
                },                                
                {                                 
                        "role" : "read",          
                        "db" : "local"            
                }                                 
        ]                                         
}                                                 
```

MongoDB instanceを再起動する。

```shell
$ db.adminCommand( { shutdown: 1 } )
$ exit
$ sudo mongod --auth --port 27017 --config /etc/mongodb.conf &
```

次に**MongoDB URI** を以下のように変更する。 

```shell
$ export MONGODB_URI=mongodb://mongodb_exporter:password@localhost:27017
```

## ④MongoDB exporterサービス起動設定を行う

*/lib/systemd/system*へ移動し、サービスファイルを作成する。

```shell
$ cd /lib/systemd/system/
$ sudo touch mongodb_exporter.service
```

```shell
[Unit]
Description=MongoDB Exporter
User=prometheus

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/mongodb_exporter

[Install]
WantedBy=multi-user.target
```

上記でサービス起動をデーモン化

```shell
$ sudo systemctl daemon-reload
$ sudo systemctl start mongodb_exporter.service
```

これで、サーバリスタート時でも再起動が自動でかかる。

Percona’s **MongoDB exporter** は port 9216で動作するので、一旦動いているか確認する。以下のようにメトリックスの情報が取れていればOK

```　shell
$ sudo curl http://localhost:9216/metrics
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
...
```

## ⑤ メトリクス取得に関する起動オプション

Prometheusから起動を確認できたら次は起動オプションについて説明する。

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/2ry61pqx6wwqsjn00m4l.png)

先ほどはサービスファイルを作成して起動をした。だが起動時にうまく環境変数を読み込めない等の事象が散見される為、以下のように念の為環境変数指定の起動オプションを実施する。

サンプルだが以下のような、コマンド例となる。

```shell
$ ./mongodb_exporter --mongodb.uri=mongodb://user:passward@127.0.0.1:27017 &
```

**--mongodb.uriオプションで渡せる引数はmongo環境変数の内容である。またこのときBasic認証をオンにしていると、Prometheusからexporterにアクセスする時に引数を指定してアクセスをしないとならない為、必ず$HTTP_AUTHがNullであることを確認する。**

## ⑥ダッシュボード作成

別紙で説明した通り、データソースをインポートして、ダッシュボードのソースを指定する。

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/srm5luosmi1tuj32t8xm.png)

既存のダッシュボードを使いたい場合は、Jsonをさらにインポート

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/eugwd9ucat7nersif1hs.png)

インポートした後に、クエリの設定をしてやればDB監視の、ダッシュボードが作成できる。

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/wnn37lsujjxcmxbst8jy.png)