在Prometheus中切换警报和恢复通知的内容
总结:
-
- 復旧時のslack通知textがアラート時と同じでつらい
-
- slack通知にlabelsが全部入るのもつらい
- alert ruleのANNOTATIONに好きなプロパティ入るので、alertmanagerのtextにif書いてそのプロパティを呼び出した
首先
除了警报名称之外,有时我们也想添加一些详细信息或文字来进行警报通知。
通过alert rule的ANNOTATIONS中指定的summary,可以将文本流向slack,像text: ‘{{ .CommonAnnotations.summary }}’这样指定。
当在alertmanager的设置中指定send_resolved: true时,如果警报恢复,它会通过slack通知我们。
告警规则 | Prometheus
配置 | Prometheus
自定义 Alertmanager 模板 | 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
...

看起来很明显,通知底部的文字部分还是不合适,感觉很不舒服。
因此,我試著根據每個警報規則指定不同的警報語句和恢復語句來區別。
另外,Slack的标题相当的位置上堆积着一排乱七八糟的标签。老实说,我觉得不需要像”localhost:9091″之类的本地主机或工作监控目标。
在“警报规则”中定义恢复时的消息。
由于可以在注解中定义喜欢的属性,可以按照以下方式进行编写。
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中切换警报时和恢复时的内容。
标题:虽然警报名可通过{{ .GroupLabels.alertname }}获得,但我想要在开头加上[FIRING]或[RESOLVED],所以需要用条件分支进行判断。
将来自alert规则的ANNOTATIONS的调用,与{{ .CommonAnnotations.firing_text }}和{{ .CommonAnnotations.resolved_text }}同样。
...
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
...
动作确认:尝试触发警报
就这样。
通过 pushgateway 在 Prometheus 上进行测试警报 – Qiita

完成了!标签消失了,而且文本也可以在警报时和恢复时进行更改。
概括
-
- 通知内容をalert内容からあれこれカスタムできるようになったのはよかった
-
- 本来はちゃんとtemplateごりごり書くというか、defaultのtemplateがでかいのであんまりいじりたくないな感
alertmanager/default.tmpl at master · prometheus/alertmanager
alertmanagerのgroup_byでgroupingした値(今回はhost_name)もtitle:にいれてもよかったかも
しかしつらいこと
prometheusのruleもalertmanagerのymlもつかえる変数がわからんのでなかなかつらい(どれかのgithub issuesにあったような)
alert ruleのANNOTATIONSにlabelだけじゃなくてその時のvalueもいれようとするじゃん。で、resolved時も回復した値を知りたいから入れるじゃん。でもなぜか回復前のvalueが出てきちゃって意味分からなかったりはした。アラート時のmetricsじゃなくてALERTっていうmetricsのvalueになっちゃうのかな?
以上。 (Chinese: .)