TL;DR
- 復旧時のslack通知textがアラート時と同じでつらい
- slack通知にlabelsが全部入るのもつらい
- alert ruleのANNOTATIONに好きなプロパティ入るので、alertmanagerのtextにif書いてそのプロパティを呼び出した
はじめに
アラート通知にアラート名だけでなく、ちょっと詳細情報とか文言を追加したくなる。
それにはalert ruleのANNOTATIONS
で指定したsummaryとかがtext: '{{ .CommonAnnotations.summary }}'
みたいに指定するとslackに流せることが分かる。
また、send_resolved: true
をalertmanager設定で指定するとアラートから復旧した時はslackで通知してくれる。
Alerting rules | Prometheus
Configuration | Prometheus
Custom Alertmanager Templates | Prometheus
ALERT hoge_alert
IF hoge_metrics == 0
FOR 1s
LABELS {
severity="critical",
}
ANNOTATIONS {
summary = "hoge of {{ $labels.host_name }} is NG.",
}
...
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXX'
channel: '#alerting-test'
text: "{{ .CommonAnnotations.summary }}"
send_resolved: true
...
が、見ての通り通知下部の文言のところがNGのままで気持ち悪い。
そこでalert ruleごとに指定したアラート時文言、復旧時文言を出し分けるようにしてみた。
また、slackのtitle相当のところにlabelがずらずら並んでいるがごちゃごちゃしてる。正直localhost:9091とかjobの監視先とかいらないし。
alert ruleに回復時メッセージを定義
ANNOTATIONS内は好きなプロパティを定義できるので以下のように書いてみる。
ALERT hoge_alert
IF hoge_metrics == 0
FOR 1s
LABELS {
severity="critical",
}
ANNOTATIONS {
firing_text = "hoge of {{ $labels.host_name }} is NG.",
resolved_text = "hoge of {{ $labels.host_name }} is OK.",
}
alertmanagerでアラート時と復旧時の内容を切り替える
title:
はアラート名が{{ .GroupLabels.alertname }}
でとれるけど、先頭に[FIRING]、[RESOLVED]はいれたいのでifで条件分岐。
text:
も同様に{{ .CommonAnnotations.firing_text }}
と{{ .CommonAnnotations.resolved_text }}
でalert ruleのANNOTATIONSを呼び出す。
...
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXX'
channel: '#alerting-test'
title: '{{ if eq .Status "firing" }}[FIRING]{{else}}[RESOLVED]{{end}} {{ .GroupLabels.alertname }}'
text: '{{ if eq .Status "firing" }}{{ .CommonAnnotations.firing_text }}{{else}}{{ .CommonAnnotations.resolved_text }}{{end}}'
send_resolved: true
...
動作確認:アラート鳴らしてみる
こんなんで。
prometheusでテストアラート by pushgateway - Qiita
できた!
labelが消えたし、文言もアラート時と復旧時で変えられてる。
まとめ
-
通知内容をalert内容からあれこれカスタムできるようになったのはよかった
-
本来はちゃんとtemplateごりごり書くというか、defaultのtemplateがでかいのであんまりいじりたくないな感
-
alertmanagerのgroup_byでgroupingした値(今回はhost_name)も
title:
にいれてもよかったかも -
しかしつらいこと
- prometheusのruleもalertmanagerのymlもつかえる変数がわからんのでなかなかつらい(どれかのgithub issuesにあったような)
- alert ruleのANNOTATIONSにlabelだけじゃなくてその時のvalueもいれようとするじゃん。で、resolved時も回復した値を知りたいから入れるじゃん。でもなぜか回復前のvalueが出てきちゃって意味分からなかったりはした。アラート時のmetricsじゃなくてALERTっていうmetricsのvalueになっちゃうのかな?
以上。