Prometheus の Config ファイルの構文チェックを GitHub Actions で行う
目次
1.前提
2.Promtool とは
3.Amtool とは
4.prometheus.yml の構文チェックの Workflow
5.ルールファイルの構文チェックの Workflow
6.alertmanager.yml の構文チェックの Workflow
前提
Prometheus の監視対象などを変更する際、これまではローカルで検証を行っていたが、
PR を出した時点で検証したく、 GitHub Actions × Promtool を使って構文チェックを行うことにした。
Promtool とは
Promtoolは、Prometheus プロジェクトに付属する公式のコマンドラインツールです。
Prometheus の設定ファイルやルールファイルの検証、テスト、診断など、運用に関わるさまざまなサポート機能を提供します。
使い方
-
Prometheus 設定ファイルの検証
Prometheus の設定ファイル(prometheus.yml
)に構文エラーや設定ミスがないか確認しますpromtool check config /path/to/prometheus.yml
エラーがある場合、具体的なエラーメッセージと問題の箇所が表示されます。
こんな感じ$ promtool check config prometheus.yml Checking prometheus.yml FAILED: parsing YAML file prometheus.yml: yaml: unmarshal errors: line 7: field target not found in type struct { Targets []string "yaml:\"targets\""; Labels model.LabelSet "yaml:\"labels\"" }
-
ルールファイルの検証
ルールファイルの構文と内容を検証しますpromtool check rules /path/to/rules.yml
検証例
$ promtool check rules rules.yml Checking rules.yml FAILED: rules.yml: 5:13: group "instance", rule 1, "InstanceDown": could not parse expression: 1:4: parse error: unexpected "="
Amtool とは
Amtoolは、Prometheus エコシステムの一部であるAlertmanagerを操作・検証するためのコマンドラインツールです。
Promtool と同様に Alertmanager の設定ファイルの検証や、アラートの管理、シルエンス(一時的なアラート抑制)の設定など、Alertmanager の運用を支援します。
使い方
-
Alertmanager 設定ファイルの検証
Alertmanager の設定ファイル(alertmanager.yml
)に構文エラーや設定ミスがないか確認しますamtool check-config /path/to/alertmanager.yml
使用例
$ amtool check-config alertmanager.yml ger check-config alertmanager.yml Checking 'alertmanager.yml'amtool: error: failed to validate 1 file(s) FAILED: yaml: unmarshal errors: line 42: field receiver not found in type config.plain
prometheus.yml の構文チェックの Workflow
prometheus.yml の構文チェック
name: Prd Config Check
on:
pull_request:
paths:
- "roles/prometheus/files/*.yml"
- "!roles/prometheus/files/rules/*"
env:
CONTAINER_NAME: prometheus-container
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker container
run: docker create --name ${{env.CONTAINER_NAME}} prom/prometheus
- name: Start Docker container
run: docker start ${{env.CONTAINER_NAME}}
- name: Copy Prometheus config to container
run: |
for file in ${{ github.workspace }}/roles/prometheus/files/prd-*; do
filename=$(basename "$file")
echo $filename
docker cp "$file" "${{env.CONTAINER_NAME}}:/etc/prometheus/$filename"
done
- name: Check Prometheus Config
run: docker exec ${{env.CONTAINER_NAME}} promtool check config /etc/prometheus/prometheus.yml
- name: Check Warning exists
run: |
output=$(docker exec ${{env.CONTAINER_NAME}} promtool check config /etc/prometheus/prometheus.yml)
echo "$output"
if echo "$output" | grep -q "WARNING"; then
echo "Prometheus config check failed due to warnings."
exit 1
fi
- name: Clean up Docker container
run: docker rm -f ${{env.CONTAINER_NAME}}
ステップの説明
- リポジトリのチェックアウト
actions/checkout@v4 を使用してリポジトリをチェックアウトします - Docker コンテナのセットアップ
prom/prometheus イメージを使用してコンテナを作成し、起動します - Prometheus 設定ファイルのコピー
roles/prometheus/files/ ディレクトリ内の prd- で始まるファイルをコンテナ内の /etc/prometheus/ にコピーします - Prometheus 設定ファイルのチェック
promtool を使用して、コンテナ内の /etc/prometheus/prometheus.yml の設定をチェックします - 警告のチェック
promtool の出力に WARNING が含まれているかを確認し、含まれている場合はエラーとして処理します - Docker コンテナのクリーンアップ
使用した Docker コンテナを削除します
設計のポイント
-
ワークフローのトリガー
pull_request が出されたときに実行されます。
対象ファイルはroles/prometheus/files/*.yml
で、roles/prometheus/files/rules/*
は除外されます。
著者の環境ですと、roles/prometheus/files/prd-*
に prd-prometheus.yml という名前で設定ファイルが格納されているため、このような設定になっています。
またルールファイルがroles/prometheus/files/rules/*
に格納されているため、除外しています -
環境変数の設定
CONTAINER_NAME
としてprometheus-container
を設定しています -
Prometheus 設定ファイルのコピー
これまた環境的にファイル名に prd がついているため、ファイル名をPrometheus.yml
に変更しています -
警告のチェック
file_sd_configs
で指定しているファイルが存在しない場合などは WARNING が出ますが、終了コードが 1 ではないため、Actions がエラーとして判定しませんでした。
そのため、出力に WARNING が含まれているかを確認し、含まれている場合はエラーとして処理するようにしています。
関連するような Issue はありました。
ルールファイルの構文チェックの Workflow
rules.yml の構文チェック
name: Rules File Check
on:
pull_request:
paths:
- "roles/prometheus/files/rules/*"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.base.sha }}
- uses: actions/checkout@v4
- name: Get changed files
id: changed-files
run: |
git diff --diff-filter=AM --name-only ${{ github.event.pull_request.base.sha }}.. | grep 'roles/prometheus/files/rules/.*\.rules$' > changed_files.txt
- name: Pre-pull Prometheus Docker image
run: docker pull prom/prometheus
- name: Lint and Check Prometheus Rule
run: |
while IFS= read -r file; do
full_path="${{ github.workspace }}/$file"
docker container run --rm -v="$full_path:/prometheus-config/$(basename $file)" --entrypoint="promtool" prom/prometheus check rules --lint-fatal /prometheus-config/$(basename $file)
done < changed_files.txt
ステップの説明
- リポジトリのチェックアウト
actions/checkout@v4 を使用して、プルリクエストのベースブランチの SHA を指定してリポジトリをチェックアウトします - リポジトリの再チェックアウト
再度 actions/checkout@v4 を使用してリポジトリをチェックアウトします - 変更されたファイルの取得
git diff コマンドを使用して、プルリクエストで追加または変更されたファイルを取得し、
roles/prometheus/files/rules/
ディレクトリ内の.rules
ファイルのみをchanged_files.txt
に保存します - Prometheus Docker イメージの事前プル
docker pull prom/prometheus コマンドを使用して、Prometheus の Docker イメージを事前にプルします - Prometheus ルールの Lint とチェック
changed_files.txt にリストされた各ファイルについて、
promtool を使用してルールファイルの Lint とチェックを行います。
具体的には、各ファイルを Docker コンテナ内にマウントし、promtool check rules --lint-fatal コマンドを実行します
設計のポイント
- 差分ファイルの取得
ルールファイルの中でも、差分があったファイルのみを検証にかけるよう、下記記事を参考に差分ファイルの取得を行いテキストファイルに追記し、後のステップで扱うようにしています
- lint-Fatal オプション
lint エラーを終了コード 3 で終了させます。
alertmanager.yml の構文チェックの Workflow
alertmanager.yml の構文チェック
name: AlertManager Check Config
on:
pull_request:
paths:
- "roles/alertmanager/files/*"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.base.sha }}
- uses: actions/checkout@v4
- name: Get changed files
id: changed-files
run: |
git diff --diff-filter=AM --name-only ${{ github.event.pull_request.base.sha }}.. | grep 'roles/alertmanager/files/.*\.yml$' > changed_files.txt
- name: Pre-pull AlertManager Docker image
run: docker pull prom/alertmanager
- name: Lint and Check AlertManager Config
run: |
while IFS= read -r file; do
full_path="${{ github.workspace }}/$file"
docker container run --rm -v="$full_path:/prometheus-config/$(basename $file)" --entrypoint="amtool" prom/alertmanager check-config /prometheus-config/$(basename $file)
done < changed_files.txt
ステップの説明
-
リポジトリのチェックアウト
actions/checkout@v4 を使用して、プルリクエストのベースブランチの SHA を指定してリポジトリをチェックアウトします。 -
リポジトリの再チェックアウト
再度 actions/checkout@v4 を使用してリポジトリをチェックアウトします。 -
変更されたファイルの取得
git diff コマンドを使用して、プルリクエストで追加または変更されたファイルを取得し、roles/alertmanager/files/ ディレクトリ内の .yml ファイルのみを changed_files.txt に保存します。 -
AlertManager Docker イメージの事前プル
docker pull prom/alertmanager コマンドを使用して、AlertManager の Docker イメージを事前にプルします。 -
AlertManager 設定ファイルの Lint とチェック
changed_files.txt にリストされた各ファイルについて、amtool を使用して設定ファイルの Lint とチェックを行います。
具体的には、各ファイルを Docker コンテナ内にマウントし、amtool check-config コマンドを実行します。
まとめ
良い感じになった
参考