Featured image of post promtool/amtoolでPrometheus/Alertmanagerの設定をチェックする

promtool/amtoolでPrometheus/Alertmanagerの設定をチェックする

Prometheusの設定変更ミスを減らしたい

まとめ

promtoolamtoolを使うとPrometheusの設定とアラートルール, Alertmanagerの設定をそれぞれ反映前にチェックすることができる.

Docker上でも動かせるのでCIにも組み込めそう.

# Prometheus設定ファイルのチェック
$ promtool check config prometheus.yml
# Docker版
$ docker container run --rm -v="$PWD/prometheus.yml:/prometheus-config/prometheus.yml" --entrypoint="promtool" prom/prometheus check config /prometheus-config/prometheus.yml

# アラートルールファイルのチェック
$ promtool check rules rules.yml
# Docker版
$ docker container run --rm -v="$PWD/rules.yml:/prometheus-config/rules.yml" --entrypoint="promtool" prom/prometheus check rules /prometheus-config/rules.yml

# Alertmanager設定ファイルのチェック
$ amtool check-config alertmanager.yml
# Docker版
$ docker container run --rm -v="$PWD/alertmanager.yml:/prometheus-config/alertmanager.yml" --entrypoint="amtool" prom/alertmanager check-config /prometheus-config/alertmanager.yml

環境

もくじ

promtoolとamtool

promtoolPrometheusに付属している設定ファイルやアラートルールファイルの検証ツール1.

Prometheusがインストールされていればすぐに使うことができる.

amtoolpromtoolAlertmanager版といった感じ.

# prometheus設定ファイル(prometheus.yml)とアラートルールファイル(rules.yml)を準備
$ ls
prometheus.yml  rules.yml

# prometheus.ymlの内容をチェック
# prometheus.ymlでルールファイルを参照している場合はその対象もチェックしてくれる
$ promtool check config prometheus.yml
Checking prometheus.yml
  SUCCESS: 1 rule files found

Checking rules.yml
  SUCCESS: 1 rules found

# rulesだけのチェックも可能
$ promtool check rules rules.yml
Checking rules.yml
  SUCCESS: 1 rules found

# alertmanager設定ファイルも同様にチェックできる
$ amtool check-config alertmanager.yml
Checking 'alertmanager.yml'  SUCCESS
Found:
 - global config
 - route
 - 1 inhibit rules
 - 1 receivers
 - 0 templates

これを使えばPrometheusAlertmanagerの設定反映前に構文エラーをチェックすることができて便利.

試しにわざと間違ったPrometheus設定ファイルとアラートルールファイル, Alertmanager設定ファイルをチェックしてみる.

# 間違ったprometheus設定ファイル(prometheus.yml)をチェックする
$ promtool check config prometheus-error.yml
Checking prometheus-error.yml
  FAILED: parsing YAML file prometheus-error.yml: yaml: unmarshal errors:
  line 13: field target not found in type struct { Targets []string "yaml:\"targets\""; Labels model.LabelSet "yaml:\"labels\"" }

# 間違ったアラートルールファイルをチェックする
$ promtool check rules rules-error.yml
Checking rules-error.yml
  FAILED:
rules-error.yml: group "instance", rule 0, "InstanceDown": could not parse expression: 1:4: parse error: could not parse remaining input "= 0"...

# 間違ったAlertmanager設定ファイルをチェックする
$ amtool check-config alertmanager-error.yml
Checking 'alertmanager-error.yml'  FAILED: yaml: unmarshal errors:
  line 7: field receiver not found in type config.plain

amtool: error: failed to validate 1 file(s)

ちゃんとエラー箇所とエラーの内容が表示された.

べんり.😊

Dockerで起動する

便利なpromtoolamtoolだけど, PrometheusAlertmanagerがインストールされていない環境ではなかなか使いづらい.

(実務でPrometheus/Alertmanagerの設定を直接手でいじることはあんまりなくて, リポジトリ上で設定ファイルを管理してCI/CDすることが多い. と思う.)

ということでDockerを使ってPrometheusがインストールされていない環境でもpromtoolを使えないか試してみる.  

# Dockerでもできそう
$ docker container run --rm --entrypoint="promtool" prom/prometheus --version
promtool, version 2.24.1 (branch: HEAD, revision: e4487274853c587717006eeda8804e597d120340)
  build user:       root@0b5231a0de0f
  build date:       20210120-00:09:36
  go version:       go1.15.6
  platform:         linux/amd64

$ docker container run --rm --entrypoint="amtool" prom/alertmanager --version
amtool, version 0.21.0 (branch: HEAD, revision: 4c6c03ebfe21009c546e4d1e9b92c371d67c021d)
  build user:       root@dee35927357f
  build date:       20200617-08:54:02
  go version:       go1.14.4

コマンドは実行可能みたいなので, あとはDockerコンテナ起動時のオプションで設定ファイルをマウントすれば良さそう.

$ ls
alertmanager-error.yml prometheus-error.yml   rules-error.yml

# Dockerでもできた
$ docker container run --rm -v="$PWD:/prometheus-config" --entrypoint="promtool" prom/prometheus check config /prometheus-config/prometheus-error.yml
Checking /prometheus-config/prometheus-error.yml

  FAILED: parsing YAML file /prometheus-config/prometheus-error.yml: yaml: unmarshal errors:
  line 13: field target not found in type struct { Targets []string "yaml:\"targets\""; Labels model.LabelSet "yaml:\"labels\"" }

$ docker container run --rm -v="$PWD:/prometheus-config" --entrypoint="promtool" prom/prometheus check rules /prometheus-config/rules-error.yml
Checking /prometheus-config/rules-error.yml
  FAILED:
/prometheus-config/rules-error.yml: 5:13: group "instance", rule 1, "InstanceDown": could not parse expression: 1:4: parse error: unexpected "="

$ docker container run --rm -v="$PWD:/prometheus-config" --entrypoint="amtool" prom/alertmanager check-config /prometheus-config/alertmanager-error.yml
Checking '/prometheus-config/alertmanager-error.yml'amtool: error: failed to validate 1 file(s)

  FAILED: yaml: unmarshal errors:
  line 7: field receiver not found in type config.plain

# エラー時はちゃんと終了ステータスがnot 0になっている
$ echo $?
1

やったぜ.

PrometheusAlertmanagerがインストールされていない環境でもDocker上でpromtoolamtoolを使って設定ファイルの検証ができた.

おわり

promtoolamtoolを触ってみて, Dockerで起動するところまで試した.

Docker imageさえあれば起動できるので, あとは細かい設定さえすればGitHub ActionsとかのCIツールで設定ファイルのチェックができると思う.

今回はpromtoolで設定ファイルのチェックしか試してないけど, 他にもアラートルールのユニットテストなんかもできるみたい2なので余裕があったらそっちも触ってみたい.

おまけ

ソファの上で誇らしげなねこ