Help us understand the problem. What is going on with this article?

prometheusでアラート時と復旧時の通知内容を切り替える

More than 3 years have passed since last update.

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.rule
ALERT hoge_alert
  IF hoge_metrics == 0
  FOR 1s
  LABELS {
    severity="critical",
  }
  ANNOTATIONS {
    summary = "hoge of {{ $labels.host_name }} is NG.",
  }

alertmanager.yml
...
receivers:
- name: 'slack'
  slack_configs:
    - api_url: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXX'
      channel: '#alerting-test'
      text: "{{ .CommonAnnotations.summary }}"
      send_resolved: true
...

slack.png

が、見ての通り通知下部の文言のところがNGのままで気持ち悪い。

そこでalert ruleごとに指定したアラート時文言、復旧時文言を出し分けるようにしてみた。

また、slackのtitle相当のところにlabelがずらずら並んでいるがごちゃごちゃしてる。正直localhost:9091とかjobの監視先とかいらないし。

alert ruleに回復時メッセージを定義

ANNOTATIONS内は好きなプロパティを定義できるので以下のように書いてみる。

alert.rule
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を呼び出す。

alertmanager.yml
...
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

slack2.png

できた!
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になっちゃうのかな?

以上。

noexpect
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away