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

# 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](https://prometheus.io/docs/alerting/rules/)
[Configuration | Prometheus](https://prometheus.io/docs/alerting/configuration/)
[Custom Alertmanager Templates | Prometheus](https://prometheus.io/blog/2016/03/03/custom-alertmanager-templates/)


```bash:alert.rule
ALERT hoge_alert
  IF hoge_metrics == 0
  FOR 1s
  LABELS {
    severity="critical",
  }
  ANNOTATIONS {
    summary = "hoge of {{ $labels.host_name }} is NG.",
  }

```

```bash: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](https://qiita-image-store.s3.amazonaws.com/0/26677/c056daed-056d-f1da-38d7-a58852182b7b.png)

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

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

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

# alert ruleに回復時メッセージを定義
ANNOTATIONS内は好きなプロパティを定義できるので以下のように書いてみる｡

```bash: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を呼び出す｡

```bash: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](http://qiita.com/noexpect/items/630ecda5895cfc411900)

![slack2.png](https://qiita-image-store.s3.amazonaws.com/0/26677/0aee8115-9414-d61f-8701-dea870c8f6fa.png)

できた!
labelが消えたし､文言もアラート時と復旧時で変えられてる｡

# まとめ
- 通知内容をalert内容からあれこれカスタムできるようになったのはよかった
- 本来はちゃんとtemplateごりごり書くというか､defaultのtemplateがでかいのであんまりいじりたくないな感
    - [alertmanager/default.tmpl at master · prometheus/alertmanager](https://github.com/prometheus/alertmanager/blob/master/template/default.tmpl)
- alertmanagerのgroup_byでgroupingした値(今回はhost_name)も`title:`にいれてもよかったかも

- しかしつらいこと
    - prometheusのruleもalertmanagerのymlもつかえる変数がわからんのでなかなかつらい(どれかのgithub issuesにあったような)
    - alert ruleのANNOTATIONSにlabelだけじゃなくてその時のvalueもいれようとするじゃん｡で､resolved時も回復した値を知りたいから入れるじゃん｡でもなぜか回復前のvalueが出てきちゃって意味分からなかったりはした｡アラート時のmetricsじゃなくてALERTっていうmetricsのvalueになっちゃうのかな?

以上｡