概要
AlertManager はアラートの情報を Slack やメールで通知します
アラート発生時に特定のコマンドを実行したい場合があります
その場合は webhook と組み合わせてコマンドを実行しましょう
Promethues や AlertManager の基本的な設定は前回の記事を確認してください
環境
- Ubuntu 18.04
- docker 20.10.7
- Prometheus 2.30.3
- Alertmanager 0.23.0
- Node export 1.2.2
- webhook 2.5.0
webhook の準備
インストールはこちらを参照してください
webhook を受け取った際に実行するシェルと AlertManager から webhook を受け取りペイロードを変数に格納する設定を準備します
- vim /tmp/alertmanager_test.sh
#!/bin/bash
echo $STATUS > result_alertmanager_test_shell.log
echo $ANNOTATIONS >> result_alertmanager_test_shell.log
- chmod +x /tmp/alertmanager_test.sh
AlertManager から送信されるペイロード情報はこちらを参考にしてください
- vim /tmp/alertmanager_hooks.json
[
{
"id": "alertmanager_test",
"execute-command": "/tmp/alertmanager_test.sh",
"command-working-directory": "/tmp",
"include-command-output-in-response": true,
"pass-environment-to-command":
[
{
"envname": "STATUS",
"source": "payload",
"name": "status"
},
{
"envname": "ANNOTATIONS",
"source": "payload",
"name": "alerts.0.annotations.summary"
}
]
}
]
今回はアラート情報の status と annotations.summary を取得してシェルスクリプト側で使うような設定を記載しています
スクリプトと設定ファイルが準備できたら webhook を起動しましょう
-
webhook -hooks /tmp/alertmanager_hooks.json -verbose
alertmanager.yml
アラート発生時に webhook を投げるように alertmanager.yml に記載します
同時に Slack にも通知したい場合など複数のレシバーを定義する場合には routes で発生したアラートに応じてどのレシバーを使用するのかを定義する必要があります
continue: true にすることで次のレシバーも評価してくれます
- vim alertmanager.yml
route:
receiver: 'slack'
routes:
- receiver: 'slack'
group_wait: 10s
match_re:
job: node1
continue: true
- receiver: 'webhook'
group_wait: 10s
match_re:
job: node1
continue: true
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/xxx/xxx/xxx'
channel: '#private'
text: "{{ .CommonAnnotations.summary }}"
send_resolved: true
- name: 'webhook'
webhook_configs:
- url: 'http://192.168.100.10:9000/hooks/alertmanager_test'
webhook_configs に起動した webhook の URL 情報などを記載します
動作確認
- stress-ng -c 2 -l 100
などで CPU の使用率を上げてみましょう アラートが上がった際に webhook のログを確認して以下のようなログが出ていれば正常に webhook が投げられ届いていることになります
[webhook] 2021/10/08 13:32:10 executing /tmp/alertmanager_test.sh (/tmp/alertmanager_test.sh) with arguments ["/tmp/alertmanager_test.sh"] and environment [STATUS=firing ANNOTATIONS=Node1 cpu usage over 40%] using /tmp as cwd
ちなみに webhook_configs はデフォルトだと resolved 時にもリクエストして来ます
- cat result_alertmanager_test_shell.log
resolved
Node1 cpu usage over 40%
コマンドを複数回実行されても問題ないようにするか send_resolved: false を設定してアラート発生時のみ webhook が投げられるようにしましょう
最後に
AlertManager でシェルスクリプトを実行する方法を紹介しました
webhook のプロセスを一つ管理する必要があるので面倒な感じもしますが AlertManager 自体にシェルをキックするような機能は現状ないのでこの方法がベストプラクティスになるかなと思います
Jenkins などがあればそこに webhook を投げてジョブを実行する感じでもいいのかもしれません
0 件のコメント:
コメントを投稿