GeekFactory

int128.hatenablog.com

Prometheus Alertmanagerの通知テンプレートを改善する

AlertmanagerのSlack通知テンプレートで四苦八苦したのでメモを残します。

Prometheus OperatorのHelm chartには便利なデフォルトルールが組み込まれています。例えば、Podが頻繁に再起動している場合に通知するルール(KubePodCrashLooping)が組み込まれています。しかし、Slackやメールなどのアラート通知は自分で設定する必要があります。

アラート通知の書き方は公式の Notification template examples | Prometheus に例がありますが、そのままではうまくメッセージが表示されない場合があります。ドキュメントでは以下の例が挙げられていますが、 summarydescription というアノテーションが付いているルールでないとメッセージが空白になってしまいます。また、CommonAnnotations を使っているため、複数のアラートがグループ化された場合は共通のアノテーションしか表示されません。

- name: 'team-x'
  slack_configs:
  - channel: '#alerts'
    # Alertmanager templates apply here.
    text: "<!channel> \nsummary: {{ .CommonAnnotations.summary }}\ndescription: {{ .CommonAnnotations.description }}"

通知テンプレートのよい例はないか探したところ、下記の記事が参考になりました。

medium.com

Prometheus Operatorのデフォルトルールには message というアノテーションが付いているため、テンプレートでは message を使うとよさそうです。また、グループ化された場合にうまく表示されない問題は Alerts フィールドに入っているアラートを列挙すると解決できそうです。

というわけで試行錯誤の結果、以下のテンプレートを利用しています。

alertmanager:
  config:
    receivers:
      - name: "null"
      - name: slack
        slack_configs:
          - api_url: https://slack.example.com/webhook
            channel: "#alerts"
            send_resolved: true
            username: dev/Alertmanager
            icon_url: https://prometheus.io/assets/favicons/favicon.ico
            title: |
              {{ .Status | toUpper }}
            text: |
              {{- range .Alerts }}
              - **{{ .Labels.alertname }}**: {{ .Annotations.message }}
              {{- end }}
    route:
      receiver: "null"
      routes:
        - receiver: "null"
          match:
            alertname: Watchdog
        - receiver: slack