多亏了 prometheus-webhook-dingtalk 项目,Alertmanager 集成钉钉消息通知得以实现。在实际使用过程中,我发现了一些可以改进的配置,例如通知消息模板可以更加清晰简洁、可以根据不同的报警优先级决定是否 Mention 某人等。

改进通知模板

改进前:

改进后:

具体模板(/config/example.tmpl):

{{/* Alert List Begin */}}
{{ define "example.__text_alert_list" }}{{ range . }}

**{{ .Annotations.message }}**

[Prometheus]({{ .GeneratorURL }}) | [Alertmanager](https://alertmanager.example.com/#/alerts) | [Grafana](https://grafana.example.com/dashboards)

{{ range .Labels.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
{{ end }}{{ end }}
{{/* Alert List End */}}

{{/* Message Title Begin */}}
{{ define "example.title" }}{{ template "__subject" . }}{{ end }}
{{/* Message Title End */}}

{{/* Message Content Begin */}}
{{ define "example.content" }}
### \[{{ index .GroupLabels "priority" }}\] [{{ index .GroupLabels "alertname" }}](https://example.app.opsgenie.com/alert/list)

{{ if gt (len .Alerts.Firing) 0 -}}
{{ template "example.__text_alert_list" .Alerts.Firing }}
{{- end }}

{{ if gt (len .Alerts.Resolved) 0 -}}
{{ template "example.__text_alert_list" .Alerts.Resolved }}
{{- end }}
{{- end }}
{{/* Message Content End */}}

prometheus-webhook-dingtalk 配置:

templates:
  - /config/example.tmpl # 模板路径

targets:
  general:
    url: https://oapi.dingtalk.com/robot/send?access_token=...
    secret: ...
    message:
      title: '{{ template "example.title" . }}' # 渲染自定义模板
      text: '{{ template "example.content" . }}' # 渲染自定义模板

Mention 海外号码

请看 PR #119 或下面的例子。

选择性 Mention 某人

首先配置两个 targets,前者直接渲染模板,后者模板中再添加一行 ###### @手机号(显示效果可以参考文章开头的图片):

targets:
  general: &target_base
    url: https://oapi.dingtalk.com/robot/send?access_token=...
    secret: ...
    message:
      title: '{{ template "example.title" . }}'
      text: '{{ template "example.content" . }}'

  critical:
    <<: *target_base
    mention:
      # 此处必须声明 Mention 的号码...
      mobiles: ["+1-1234567890", "18800001111"]
    message:
      text: |
        ###### @+1-1234567890 @18800001111

        {{ template "example.content" . }}        

随后在 Alertmanager 配置两个分别对应的 receivers,以及多条 routes 即可:

route:
  group_by: ["priority", "alertname"]
  receiver: general
  routes:
    - match_re:
        priority: P1
      receiver: critical

receivers:
  - name: general
    webhook_configs:
      - &dingtalk_config
        send_resolved: false
        url: http://alertmanager-webhook-dingtalk/dingtalk/general/send

  - name: critical
    webhook_configs:
      - <<: *dingtalk_config
        url: http://alertmanager-webhook-dingtalk/dingtalk/critical/send