grafana-mongodbプラグインを試す


# はじめに
Enterprise版高すぎてオフィシャルのmongodbプラグインに手が出ないので、非公式の[プラグイン](https://github.com/JamesOsgood/mongodb-grafana)を使おうとしたらいろいろハマったので備忘録です。
2022/2/28時点の情報です。

開発環境として一時的に（手作業こみで）動かせばよいだけなので、自動構築とか自動起動まではしてません。

主にやったことは３つ。
* unsigned pluginを読み込めるようにiniファイルに設定
* datastore作成はpluginから選択して作成
* id/passを渡してくれなかったのでproxyサーバで書き換え

## GrafanaをDockerで立てる

お好きな方法で。
自分の場合は既に作成している開発環境のMongoDBコンテナに接続したかったので、docker-composeに下記のように追加しました。

```
  grafana:
    image: grafana/grafana:8.4.2
    ports:
      - '13000:3000'
      - '3333:3333'
    environment:
      - 'GF_SECURITY_ADMIN_PASSWORD=xxxx'
    volumes:
      - ./grafana_data:/var/lib/grafana
```

## pluginを導入する
* pluginsフォルダにmongodb-grafanaを格納
grafanaのcontainer_nameを確認して接続し、コンテナ内で作業します。

```
host$ docker ps 
host$ docker exec -it -u 0 grafana /bin/bash

container-bash$ cd /var/lib/grafana/plugins/
container-bash$ wget https://github.com/JamesOsgood/mongodb-grafana/archive/refs/heads/master.zip
container-bash$ unzip master.zip
container-bash$ mv mongodb-grafana-master/ mongodb-grafana/
```

* mongodb-grafanaに必要なモジュールをインストール
指定されているnodeのバージョンが古い（6.10.0）ので、念の為、古いものに入れ替えました。気持ち新し目の8.17にしましたが、ここは依存モジュールなどが動くなら任意のなるべく新しいものでよさそうです。

```
container-bash$ cd /var/lib/grafana/plugins/mongodb-grafana/
container-bash$ apk add --update npm
container-bash$ npm install -g n
container-bash$ n 8.17.0
container-bash$ hash -r
container-bash$ npm install --save --legacy-peer-deps
container-bash$ npm audit fix --save --legacy-peer-deps
```

* grafana.iniを編集してallow_loading_unsigned_pluginsに追加

```
container-bash$ vi /etc/grafana/grafana.ini

# 下記の行をコメントアウトを消して、設定を追加する
allow_loading_unsigned_plugins = mongodb-grafana-datasource
```

* このあたりでいったんGrafanaを再起動してpluginを読み込ませます
docker-composeつかってるならdown & upでもOK。


## mongodb-grafanaのなかにあるmongodb-proxyサーバを起動する

このプラグインは、MongoDBに対してProxyサーバ経由でアクセスするので、それを起動します。
datasourceでid/passを含む指定をしても渡してくれなかったので今回はproxyサーバで強制的に接続情報を書き換えてしまってます。
セキュリティ上は問題のある対応なので、運用環境で使う場合は注意が必要。すくなくとも、このproxyサーバを外部に公開される環境でつかうのはNG。

* /var/lib/grafana/plugins/mongodb-grafana/dist/server/config/default.jsonに下記のmongourlを追加
user, password, mongodbhostは自分の環境のものを入れます。

パネルをつくったりするときに「command aggregate requires authentication」とかエラーが出る場合は、ここで指定する認証情報が間違ってる可能性があります。
[issue](https://github.com/JamesOsgood/mongodb-grafana/issues/66)みてると、けっこうここでハマってる人が多そう（自分も最初そう思ってた......ちゃんと認証情報を渡していると）


```
{
    "server":
    {
      "mongoUrl": "mongodb://[user]:[password]@[mongodbhost]:27017",
      "port": 3333,
      "logRequests": false,
      "logQueries": false,
      "logTimings": false
    }
}
```


* /var/lib/grafana/plugins/mongodb-grafana/dist/server/mongodb-proxy.jsを下記のように編集します。


```
function runAggregateQuery( requestId, queryId, body, queryArgs, res, next )
{
  // MongoClient.connect(body.db.url, function(err, client) 
  MongoClient.connect( serverConfig.mongoUrl, function(err, client) 
  {

```

* proxyサーバを起動しておきます。

手作業で起動するので、containerを起動するたびにこちらを実行する必要があります。自動起動したい場合には後述するようにcontainer分割したりしたほうがよいでしょう。

```
host$ docker ps 
host$ docker exec -it -u 0 grafana /bin/bash

container-bash$ cd /var/lib/grafana/plugins/mongodb-grafana/dist/server
container-bash$ node mongodb-proxy.js
```

## Grafanaからdatasourceを作成

ここは、Grafana初期ユーザなどでログインし、画面で作業します。

* pluginsから選択してCreate a MongoDB data sourceボタンをクリックして作成

残念ながらdatasourceからプラグインを選択しても反応してくれません。焦らずpluginsからみつけて作成。
（一回つくってしまったものはデータソースから編集できます）

![スクリーンショット 2022-02-27 1.32.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23612/dfe9fe2c-8fd7-91bb-71c3-b32a1f38caab.png)

* datasourceを設定する

localhost:3333はproxyサーバの設定。これを別コンテナとかで立てる場合は、ここを変更します。
MongoDB detailsに情報を設定します（MongoDB URLは前述の通りProxyサーバで書き換えちゃいますが）。

![スクリーンショット 2022-02-28 10.59.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23612/0947d2c8-9b97-b377-e2fe-538e05d6f7fc.png)

これでだいたいいけるはず。
あとはmongodb-grafanaのexamplesとかを見ながらpanelを設定してみてください。


# 最後に

ローカル開発用なので、いったんここまで。
運用に乗せるにはセキュリティまわりをちゃんとしないとまずいんですが、proxyサーバへのアクセスをなんらかのかたちで絞るとか、pluginsをもうちょっとカスタマイズしてなんとかできそうな範囲なんじゃないかな、と。

proxyサーバは別のコンテナたてたいっていう人は、この[issue](https://github.com/JamesOsgood/mongodb-grafana/issues/121)もあったりしたので、参考にしてみてください。


# 参考

https://github.com/JamesOsgood/mongodb-grafana

https://hevodata.com/learn/grafana-mongodb/#10