Featured image of post 自作Exporter+Prometheus+Alertmanager+GrafanaをまとめてDocker Composeで動かす

自作Exporter+Prometheus+Alertmanager+GrafanaをまとめてDocker Composeで動かす

Exporterの動作確認を楽しくしたかった

やったことのまとめ

  • 自作Exporter, Prometheus, Alertmanager, GrafanaをまとめてDocker Composeで動かした
  • nginxコンテナを追加してリバースプロキシした

Prometheus用のExporterを自作するときに動作確認の時点でGrafanaのグラフが見られたりAlertmanagerで通知されるメッセージとかが確認できるとメトリクスやラベルの設計がしやすい(気がする)ので,
それらが全部入りの環境をDocker Composeで作ってみた.

構成

その他もろもろの設定ファイル

つかうもの

やったこと

とりあえず起動する

それぞれDocker imageが公式で提供されているのでそれをそのまま起動すれば良さそう.

自作Exporterの動作確認をしたときと同様に適当にdocker-compose.ymlを書いてみる.

重要なのは以下の設定ファイルをそれぞれのコンテナにマウントしていること.

  • Prometheus
    • 自作Exporterなどをスクレイプするための設定(prometheus.yml)
      • Docker Composeで起動しているので他のコンテナについてはすべてコンテナ名で名前解決できる
    • アラートルール(rules.yml)
      • 任意のルールで良い
  • Alertmanager
    • アラート通知設定(alertmanager.yml)
      • 任意の設定で良い
  • Grafana
    • 基本設定(grafana.ini)
    • Data Source設定(datasource.yaml)
      • Prometheusコンテナを指定する
    • Dashboard設定(dashboard.yaml, dashboard.json)
      • dashboard.jsonは後から作っても良い

(rules.yml, alertmanager.ymlは何でも良いので前回のものを流用)

rules.yml

alertmanager.yml

(dashboard.jsonはあらかじめ作成済みのものがなければこの後作成する)

あとはこれらのファイルが以下のように配置されている状態でDocker Composeでコンテナを立ち上げる.

# ローカルでビルドしない場合はDockerfileとGo関連のファイルは不要
$ tree .
.
├── Dockerfile
├── deployment
│   ├── alertmanager
│   │   └── alertmanager.yml
│   ├── grafana
│   │   ├── dashboard.json
│   │   ├── dashboard.yaml
│   │   ├── datasource.yaml
│   │   └── grafana.ini
│   └── prometheus
│       ├── prometheus.yml
│       └── rules.yml
├── docker-compose.yml
├── go.mod
├── go.sum
└── main.go

# コンテナを起動(コードを編集したなどの理由で再度ビルドしたい場合はさらに--buildを付与する)
$ docker-compose up -d --force-recreate

$ docker-compose ps
    Name                  Command               State           Ports
------------------------------------------------------------------------------
alertmanager   /bin/alertmanager --config ...   Up      0.0.0.0:9093->9093/tcp
exporter       ./app                            Up      0.0.0.0:2112->2112/tcp
grafana        /run.sh                          Up      0.0.0.0:3000->3000/tcp
prometheus     /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp

あとはそれぞれのエンドポイントで動作確認する.

自作Exporter
Prometheus
Alertmanager
Grafana

dashboard.jsonが未作成の場合はここで動作確認も兼ねてGrafana上でダッシュボード(自作Exporterのメトリクスがグラフ化できれば何でも良い)を作成し, ShareExportSave to fileからJSONをダウンロードして以降はそれを使うようにする.

設定が正しく効いていれば予めPrometheusData Sourceとして登録されていて, 全コンテナのメトリクスがスクレイプできていることも確認できる.

動作確認

リバースプロキシする

このままでもいいんだけどせっかくなのでnginxリバースプロキシする.

docker-compose.ymlnginxコンテナを追加して, 以前やったときと同様の設定ファイルを作成してマウントする.

(リバースプロキシしているので, nginx以外のそれぞれのコンテナのポートは閉じておく)

  • Prometheus
    • prometheus.yml, rules.yml: そのまま
    • command(CMD)にリバースプロキシ用の設定1を追加
  • Alertmanager
    • alertmanager.yml: そのまま
    • command(CMD)にリバースプロキシ用の設定を追加
  • Grafana
    • datasource.yaml, dashboard.yaml, dashboard.json : そのまま
    • grafana.ini
      • リバースプロキシ用の設定2を追加
  • nginx
    • リバースプロキシ設定(default.conf)
    • リンク用ページ(index.html)

再度コンテナを起動する.

$ tree .
.
├── Dockerfile
├── deployment
│   ├── alertmanager
│   │   └── alertmanager.yml
│   ├── grafana
│   │   ├── dashboard.json
│   │   ├── dashboard.yaml
│   │   ├── datasource.yaml
│   │   └── grafana.ini
│   ├── nginx
│   │   ├── default.conf
│   │   └── index.html
│   └── prometheus
│       ├── prometheus.yml
│       └── rules.yml
├── docker-compose.yml
├── go.mod
├── go.sum
└── main.go

$ docker-compose up -d --force-recreate

$ docker-compose ps
    Name                  Command               State         Ports
--------------------------------------------------------------------------
alertmanager   /bin/alertmanager --config ...   Up      9093/tcp
exporter       ./app                            Up
grafana        /run.sh                          Up      3000/tcp
nginx          /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp
prometheus     /bin/prometheus --config.f ...   Up      9090/tcp

ここまでの設定に問題がなければそれぞれのパスでコンテナの動作確認ができる.

もしくは, http://localhost/でリンクを張ったHTML(index.html)が表示できるのでそこから飛んでも良い.

動作確認

最後に一応Alertmanagerの動作確認をする.

rules.ymlInstanceDown(upが0になるだけで発火)のアラートルールを設定しているので, 試しに自作Exporterのコンテナを落としてみる.

$ docker-compose stop exporter

$ docker-compose ps
    Name                  Command               State          Ports
---------------------------------------------------------------------------
alertmanager   /bin/alertmanager --config ...   Up       9093/tcp
exporter       ./app                            Exit 2
grafana        /run.sh                          Up       3000/tcp
nginx          /docker-entrypoint.sh ngin ...   Up       0.0.0.0:80->80/tcp
prometheus     /bin/prometheus --config.f ...   Up       9090/tcp

それぞれのコンテナでメトリクスの変化に対応した処理が行われていることが確認できる.

グラフの値(up)が変化
アラートが発火
アラートを通知

アラートはAlertmanagerからGmail経由で送る設定にしているのでメールが届くことも確認できる.

届いたメール

やったぜ.

自作ExporterとPrometheus, Alertmanager, Grafanaを同時に動かして動作確認することができた.

おわり

終わってみれば大したことはないんだけど, 一回この構成をつくっておくと自作Exporterの開発が楽しくなる(メトリクスがすぐ可視化されアラートの動作確認までできる)のでやってよかったと思う.

Docker Composeの練習にもなってよかった.

おまけ

しっぽは体に巻き付ける派