Prometheusのexporterを作ってニフクラRDBを監視する



この記事は[富士通クラウドテクノロジーズ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fjct)の4日目です。

昨日は @riow の[「勘違いして定時前に帰ってしまったので再発防止策を考えてみた」](https://qiita.com/riow/items/a9f322941f704fe2e659)でした。再発防止策として「次から気をつける」といったやり方ではなく、スクリプトを書いて対策を打つという考え方が素晴らしいですね。ちなみに、弊社はフレックスタイム制があるので早めに帰っても大丈夫です。

## はじめに

私は普段、ニフクラRDBなどを担当しており、業務の中で多数のホストを管理しています。管理するホストが多くなってくると、それらのモニタリングをどのように行うかは常に付きまとう悩みのひとつです。

近頃、モニタリング基盤としての[Prometheus](https://prometheus.io/)の話を聞く機会が増えてきました。[Prometheus 2.0もつい最近リリース](https://prometheus.io/blog/2017/11/08/announcing-prometheus-2-0/)されましたね。

Prometheusの便利な機能の一つとして、exporterという仕組みがあります。exporterは既にあるものを使ってもいいですし、自前で任意のメトリクスを取得する機構をexporterとして作ることもできます。今回はそのPrometheus exporterを自作し、ニフクラRDBのメトリクスをPrometheusに連携してみたいと思います。

ニフクラRDBではもともとモニタリングの機能があり、特に何もしなくてもコントロールパネルを開けば簡単にメトリクスを閲覧することもできます。ですが、今回はあえてPrometheusのexporterの勉強もかねて作ってみました。たとえば、既にPrometheusの環境があり、同じ環境でニフクラRDBも監視したくなった際には有用でしょう。


## Prometheus exporterの自作にあたって

exporterを作る上で、公式の 「[Writing exporters](https://prometheus.io/docs/instrumenting/writing_exporters/)」 を一読しておくとよいでしょう。また、既に実装されている [他のexporterの一覧](https://prometheus.io/docs/instrumenting/exporters/) も参考になります。特に、[Prometheus GitHub organization](https://github.com/prometheus) 配下にある公式の exporter 実装がとても参考になります。他には [「resque_exporter 書いた（その手の平は尻もつかめるさ）」](http://moznion.hatenadiary.com/entry/2016/05/22/230934) も参考にさせていただきました。

exporterの実装自体は自由度が高く、Prometheusが解釈できる所定のレスポンスを返すWebサーバを作ればよいだけです。言語に縛りもありません。現状、Best Practiceとして公式ドキュメント以外にまとまったものは見当たらなかったので、ソースを読まなければならず、実装方法に悩んでしまうことはあるかもしれません。あと、言語に縛りがないとはいいましたが、基本的には、公式の [prometheus/client_golang](https://github.com/prometheus/client_golang) を使ってgolangで実装するのがもっとも簡単だと思います。

## nifcloud_exporterを作った

ということで、 [nifcloud_exporter](https://github.com/heriet/nifcloud_exporter) という ニフクラ用のexporterを作ってみました。やっていることは、golangでニフクラAPIを叩いて、取得したメトリクスをexporterとして返却しているだけです。実装にあたっては、類似のAPIからメトリクスを取得する方式の他のexporter実装も参考にしました。（[percona/rds_exporter](https://github.com/percona/rds_exporter) など）

### 使い方

まず、下記のような `config.yml` を用意します。これは、nifcloud_exporterがニフクラのAPIを叩くために必要な情報です。

```
---

rdb:
  - name: <適当な環境名。例えばstagingとか>
    region: <リージョン>
    accessKeyId: <YOUR ACCESS KEY>
    secretAccessKey: <YOUR SECRET ACCESS KEY>
    instances:
      - name: <監視したいDBサーバ名>
```

上記で作成した `config.yml` を指定して、nifcloud_exporterを起動させます。

```
./nifcloud_exporter --config.file=<config.ymlのパス>
```

デフォルトでは9042ポートを使用しています。（変更することも可能です）

また、Dockerで起動させることもできます。

```
$ docker pull heriet/nifcloud_exporter:latest
$ docker run -d -p 9042:9042 -v <config.ymlのパス>:/etc/nifcloud_exporter/config.yml --name nifcloud_exporter heriet/nifcloud_exporter
```

docker-composeなら例えば下記のようになるでしょう

```
version: '3'
services:
  nifcloud_exporter:
    image: heriet/nifcloud_exporter
    container_name: nifcloud_exporter
    ports:
      - 9042:9042
    volumes:
      - <config.ymlのパス>:/etc/nifcloud_exporter/config.yml
```

あとは、nifcloud_exporterをPrometheusに認識させるだけです。Prometheus側の設定で`prometheus.yml`の`scrape_configs`にたとえば下記のような設定を追加します。他のexporterと特に変わった点はないですね。`scrape_interval`は少し長めに設定しています。

```
scrape_configs:
  - job_name: 'nifcloud_exporter'
    scrape_interval: 5m
    static_configs:
      - targets:
        - '<nifcloud_exporterが起動しているホスト>:<nifcloud_exporterが動作するポート>'
```

設定が終わったあとで、Prometheusを確認してみると、確かに `nifcoud_～` といった名前でメトリクスが連携されることがわかります。下記はPrometheusと連携しているGrafanaの画面です。

![nifcloud_exporter.png](https://qiita-image-store.s3.amazonaws.com/0/77961/b78e3bde-0322-3e83-f3dd-3b50da855151.png)


メトリクスさえ連携できればこっちのもので、あとはPrometheusの流儀で可視化したり、アラート監視したりすることが可能になります。

## まとめ

Prometheusの公式ライブラリを使ったこともあり、nifcloud_exporterは比較的簡単に実装することができました。現在のところはニフクラRDBのメトリクスのみ対応していますが、同様の方法でニフクラの別のサービスのAPIを叩いて、Prometheusに連携することも可能となることでしょう。みなさんも、ちょうどよいexporterが見つからないときは、ぜひPrometheus exporterを自作してみてください。

明日は @kentac55 が「Windows10 ProからNested Hyper-Vで遊んでみる」話を書いてくれるそうです。楽しみ！