25
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-22

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

以上。

25
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?