まとめ
promtoolとamtoolを使うと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環境
- macOS Mojave 10.14
- Docker Desktop for Mac
- Version 3.1.0
- Docker Engine Version 20.10.2
- Prometheus
- version 2.24.1
- promtool
- version 0.21.0
- Alertmanager
- version 0.21.0
- amtool
- version 0.20.0
もくじ
promtoolとamtool
promtoolはPrometheusに付属している設定ファイルやアラートルールファイルの検証ツール1.
Prometheusがインストールされていればすぐに使うことができる.
amtoolはpromtoolのAlertmanager版といった感じ.
# 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これを使えばPrometheusやAlertmanagerの設定反映前に構文エラーをチェックすることができて便利.
試しにわざと間違った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で起動する
便利なpromtoolとamtoolだけど, PrometheusやAlertmanagerがインストールされていない環境ではなかなか使いづらい.
(実務で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やったぜ.
PrometheusやAlertmanagerがインストールされていない環境でもDocker上でpromtoolとamtoolを使って設定ファイルの検証ができた.
おわり
promtoolとamtoolを触ってみて, Dockerで起動するところまで試した.
Docker imageさえあれば起動できるので, あとは細かい設定さえすればGitHub ActionsとかのCIツールで設定ファイルのチェックができると思う.
今回はpromtoolで設定ファイルのチェックしか試してないけど, 他にもアラートルールのユニットテストなんかもできるみたい2なので余裕があったらそっちも触ってみたい.
おまけ

