前言

prometheus配置告警分发到不同的钉钉群说明了将同一条告警分发到多个钉钉群的配置方式。下面提供一个我平常使用的一个钉钉告警的模板,模板最初的原型确实记不清从哪找到了,花了不少时间,后来我自己做一些适当调整,就成了现在主要使用的形式。

钉钉告警组件

使用的prometheus-webhook-dingtalk

模板配置

如果需要可视化自定义模板,可以在启动dingtalk的时候,设置参数:--web.enable-ui,如下:

./prometheus-webhook-dingtalk  --web.enable-ui

这样后,可以通过如下路径:http://localhost:8060/ui预览,如下,预览便是我要提供的模板样式:

一个拿来即用的钉钉告警模板_复制粘贴

模板的定义主要使用go template: https://golang.org/pkg/text/template/, 可以根据情况自定义

模板配置代码
{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
{{ define "__alertmanagerURL" }}{{ $alertURL := "http://localhost:9093" }} {{- $alertURL -}}/#/alerts?receiver={{ .Receiver }}&tmp={{ .ExternalURL }}{{ end }}

{{ define "__text_alert_list" }}{{ range . }}
**Labels**
{{ range .Labels.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Annotations**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Source:** [{{ .GeneratorURL }}]({{ .GeneratorURL }})
{{ end }}{{ end }}

{{/* Firing */}}

{{ define "default.__text_alert_list" }}{{ range . }}

**触发时间:** {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**摘要:** {{ .Annotations.summary }}

**描述:** {{ .Annotations.description }}

**监控:** [grafana](http://localhost:3000)

**详情:**
{{ range .Labels.SortedPairs }}{{ if and (ne (.Name) "severity") (ne (.Name) "summary") }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ end }}{{ end }}

{{/* Resolved */}}

{{ define "default.__text_resolved_list" }}{{ range . }}

**触发时间:** {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**解除时间:** {{ dateInZone "2006.01.02 15:04:05" (.EndsAt) "Asia/Shanghai" }}

**摘要:** {{ .Annotations.summary }}

**监控:** [grafana](http://localhost:3000)

**详情:**
{{ range .Labels.SortedPairs }}{{ if and (ne (.Name) "severity") (ne (.Name) "summary") }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ end }}{{ end }}

{{/* Default */}}
{{ define "default.title" }}{{ template "__subject" . }}{{ end }}
{{ define "default.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]({{ template "__alertmanagerURL" . }})**
{{ if gt (len .Alerts.Firing) 0 -}}

![Firing-img](https://is3-ssl.mzstatic.com/image/thumb/Purple20/v4/e0/23/cf/e023cf56-0623-0cdf-afce-97ae90eabfda/mzl.uplmrpgi.png/320x0w.jpg)

**告警通知**
{{ template "default.__text_alert_list" .Alerts.Firing }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}

![Resolved-img](https://is3-ssl.mzstatic.com/image/thumb/Purple18/v4/41/72/99/4172990a-f666-badf-9726-6204a320c16e/mzl.dypdixoy.png/320x0w.png)

**告警解除**
{{ template "default.__text_resolved_list" .Alerts.Resolved }}
{{- end }}
{{- end }}

{{/* Legacy */}}
{{ define "legacy.title" }}{{ template "__subject" . }}{{ end }}
{{ define "legacy.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]({{ template "__alertmanagerURL" . }})**
{{ template "__text_alert_list" .Alerts.Firing }}
{{- end }}

{{/* Following names for compatibility */}}
{{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
{{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}

直接复制粘贴即可拿来用,只需要简单根据自己场景调整上面的几个告警或监控的url即可。

模板中告警url的问题

点击告警的url应当跳转告警管理页面,允许静默告警,有些告警可以暂时忽视,不能让它一直在告警。告警管理页面如下:

一个拿来即用的钉钉告警模板_html_02

但实际使用的时候发现告警url不对,跳到一个不正确的地址。我的解决方案,指定alertURL,忽视ExternalURL。

一个拿来即用的钉钉告警模板_钉钉告警模板_03

ExternalURL相关使用可以看里做参考:https://github.com/timonwong/prometheus-webhook-dingtalk/issues/27

我的实现方案是因为我能操作只有这个dingtalk或alertmanager,prometheus是和别人集成,不方便重启配置,我就想了这样一个方案,仅供参考。