这是我参与2022首次更文挑战的第4天,活动详情查看: 2022首次更文挑战
在 prometheus配置告警分发到不同的钉钉群 说明了将同一条告警分发到多个钉钉群的配置方式。下面提供一个我平常使用的一个钉钉告警的模板,模板最初的原型确实记不清从哪找到了,花了不少时间,后来我自己做一些适当调整,就成了现在主要使用的形式。
钉钉告警组件
使用的 prometheus-webhook-dingtalk
如果需要可视化自定义模板,可以在启动dingtalk的时候,设置参数:--web.enable-ui,如下:
./prometheus-webhook-dingtalk --web.enable-ui
这样后,可以通过如下路径:http://localhost:8060/ui预览,如下,预览便是我要提供的模板样式:
模板的定义主要使用go template: golang.org/pkg/text/te…, 可以根据情况自定义
模板配置代码
{{ 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应当跳转告警管理页面,允许静默告警,有些告警可以暂时忽视,不能让它一直在告警。告警管理页面如下:
但实际使用的时候发现告警url不对,跳到一个不正确的地址。我的解决方案,指定alertURL,忽视ExternalURL。
ExternalURL相关使用可以看里做参考:github.com/timonwong/p…
我的实现方案是因为我能操作只有这个dingtalk或alertmanager,prometheus是和别人集成,不方便重启配置,我就想了这样一个方案,仅供参考。