mackerel-plugin-odfe (Open Distro for Elasticsearch)を作った話


## はじめに
先月、Amazonが[Open Distro for Elasticsearch](https://opendistro.github.io/for-elasticsearch/) (以下、**ODFE**)を発表してしばらく経ちました。そろそろ使ってる人もいますよね。
使ってるとなれば、監視が必要になるわけです。

[Mackerel](https://mackerel.io/) には公式プラグイン [mackerel-plugin-elasticsearch](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-elasticsearch) がありますが、こちらは標準的なElasticsearchが対象のプラグインです。
記事執筆時点(2019/04/08)では、ODFEにはODFE特有の挙動があり、それに合わせたプラグインが必要でした。

それを作りましたという記事です。

## mackerel-plugin-odfe プラグインの紹介

### リポジトリ

`mackerel-plugin-odfe` プラグインはこちらです。

* https://github.com/etsxxx/mackerel-plugin-odfe/

リポジトリのREADMEにも書いていますが、 `mackerel-plugin-odfe` は、公式のプラグイン [mackerel-plugin-elasticsearch](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-elasticsearch) をforkして、下記の変更を加えたプラグインです。

なぜ公式にプルリクエストしないのかって？

実装も挙動もElasticsearchとあまりに共通点が多いけれど、別物として扱わないとそれはそれで問題になりそうな箇所が幾つもあったからです。その分岐を考えたコードやテスト環境を整えるのも面倒でした。

以上より、 **手抜きの結果として** 別のリポジトリにアップロードしています。

OSSの精神に反しますよね・・・
せめて更新内容がわかりやすいように、この記事に記しておきます。

### インストール
インストールする場合は、 `mkr` インストール済みの環境であれば、以下でOKです。

```bash:インストール
sudo mkr plugin install etsxxx/mackerel-plugin-odfe
```

mackerel-agentの設定ファイルに以下のように追記しましょう。（パスやオプションは注意）

```toml:mackerel-agent.conf
[plugin.metrics.elasticsearch]
command = "/path/to/mackerel-plugin-odfe -scheme=https"
env = { ES_USER = "USERNAME", ES_PASSWORD = "PASSWORD" }
```

*※ 使い方について、詳しくはREADME or ヘルプを見てください。*


設定が正しければ、以下のようなメトリックが出力されるはずです。（一部メトリックをスクリーンショットしています）
![Mackarel_Example.png](https://qiita-image-store.s3.amazonaws.com/0/82212/ce6ad21e-e084-b305-bd11-b06f59c11126.png)


### 権限について

せっかくユーザー認証しているのに、Adminユーザーを使ってしまったら権限分離の観点でイマイチですね。
Securityプラグインで、以下のようなユーザー/ロールを作りましょう。

Roleメニューより、新規に「`monitor`」ロールを作ります。権限は以下の通り。

* Cluster Permissions:
  * Permissions: Action Groups	: `CLUSTER_MONITOR`

![ClusterPermissions.png](https://qiita-image-store.s3.amazonaws.com/0/82212/43db9c46-06da-4fae-d466-12d9a4f29a0c.png)


* Index Permissions:
  * Index and Document type: `*.*` 
  * Permissions: Action Groups: `INDICES_MONITOR`

![IndexPermissions.png](https://qiita-image-store.s3.amazonaws.com/0/82212/9c81b2af-478e-4047-348f-fdb7da820dcd.png)


*※ 今後必要な権限が変わることもあるかもしれませんが、本記事執筆時点では上記でOKでした。*

その後 `User` メニューで「`monitor`」ユーザーを作り、 `Role Mappings` メニューで先程の `monitor` ロールとマップしましょう。

`mackerel-agent.conf` の `ES_USER` と `ES_PASSWORD` を、そのユーザー情報で置き換えればOKです。


### 実装上の変更点

v0.0.1時点では、公式のElasticsearchプラグインと以下の部分で実装が異なります。

* Basic認証用のオプション/環境変数を追加:
  * ODFEはSecurityプラグインによる **Basic認証が有効化されている** ため。
  * 環境変数で渡す方法を推奨しますが、引数でも渡せます。
* `-scheme=https` 時の証明書チェックを **有効化** するオプション `-secure` を追加:
  * つまり、デフォルトでは証明書をチェックしません。
  * mackerel-agentはODFEと同一ホストで動作させることが多いと思います。その場合、アクセス先ElasticsearchのURLは `https://localhost:9200/` となることが想像されます。これでは多くの場合、証明書をチェックする意味がないためです。
  * 外部公開用のURL経由でアクセスする場合 or 別ホストのElasticsearchをチェックする場合は、 `-secure` オプションを付けましょう。
* 取得するメトリックが異なる:
  * 例えば、ODFE特有のスレッド情報 `threads_opendistro_monitor_runner`  などを追加しています。
* 取得対象の情報が存在しないときのログを [ERROR](https://github.com/mackerelio/mackerel-agent-plugins/blob/v0.55.1/mackerel-plugin-elasticsearch/lib/elasticsearch.go#L133) ではなく [INFO](https://github.com/etsxxx/mackerel-plugin-odfe/blob/v0.0.1/lib/elasticsearch.go#L156) へ:
  * 大した差ではないですが、少しだけ静かにしています。

差分はあるものの、マイナーチェンジと言っても差し支えない内容であり、互換的に利用できるとは思います。（実際、オプションやREADMEのExample記述も互換にしています）

## おわりに
以上で、Open Distro for Elasticsearch用のMackerelプラグイン `mackerel-plugin-odfe` の紹介でした。
Mackerel公式ElasticsearchプラグインがODFEに対応するまでの間の「繋ぎ」として機能するかと思います。