1. Grafana告警邮件模板基础配置
第一次接触Grafana告警邮件模板时,我被它强大的自定义能力所震撼。记得去年给客户部署监控系统时,他们提出一个很实际的需求:告警邮件必须包含服务器名称、具体告警事项和当前指标值这三要素。当时用默认模板完全无法满足,这才踏上了模板定制之路。
Grafana的邮件通知模板分为两个核心部分:邮件主题模板和邮件内容模板。邮件主题在Contact Points的Optional Email Settings中配置,而邮件内容则需要修改安装目录下的HTML文件。以最常见的场景为例,假设我们需要监控服务器内存使用率,当超过90%时触发告警,邮件主题应该显示"服务器:web01,内存使用率超过90%告警"。
基础配置步骤如下:
- 登录Grafana后台,进入Alerting -> Contact points
- 选择或创建邮件通知渠道
- 在Optional Email Settings中找到Subject字段
- 输入模板代码:
{{ define "email.subject" }} {{- if gt (len .Alerts.Firing) 0 -}} 服务器:{{ range $i, $alert := .Alerts.Firing }} {{ index $alert.Labels "instance" }},{{ end }} {{ range $i, $alert := .Alerts.Firing }}{{if eq $i 0 }}{{ index $alert.Labels "alertname" }}{{end}}{{ end }} {{- end -}} {{ end }}这段代码的逻辑是:当有告警触发时(.Alerts.Firing),遍历所有告警,提取instance标签作为服务器名称,并取第一个告警的alertname作为告警事项。实际使用中发现,如果告警规则使用Classic condition表达式,可能无法获取instance标签,这时需要改用Reduce表达式。
2. 邮件内容模板深度定制
邮件内容模板的修改需要直接操作HTML文件。在Grafana安装目录的public/emails文件夹下,找到ng_alert_notification.html文件。这个文件控制着邮件的整体样式和内容结构。
我曾遇到一个典型需求:客户希望在邮件中突出显示服务器名称、告警事项和当前值,其他信息可以弱化显示。实现这个需求需要对HTML模板进行多处修改。关键代码片段如下:
{{ range .Labels.SortedPairs }} <tr style="vertical-align: top; padding: 0;" align="left"> <td colspan="2" class="value" style="word-break: break-word; hyphens: auto; color: #222222; font-family: 'Open Sans', 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; padding: 24px 0 0;" align="left" valign="top"> {{if eq .Name "instance" }} <span style="font-weight: bold;">服务器:</span> <span style="padding-left: 8px; color: #FF0000;">{{ .Value }}</span> {{else if eq .Name "alertname" }} <span style="font-weight: bold;">事项:</span> <span style="padding-left: 8px; color: #FF0000;">{{ .Value }}</span> {{end}} </td> </tr> {{ end }}这段代码做了几个关键处理:
- 使用SortedPairs遍历所有标签
- 特别处理instance和alertname两个标签
- 对服务器名称和告警事项使用红色突出显示
- 保持邮件响应式布局,确保在移动设备上正常显示
对于指标值的显示,在Grafana 9.x版本中,我最初尝试使用.ValueString但遇到解析问题,最终采用在告警规则的annotations中添加description字段,然后在模板中这样提取:
{{ range .Annotations.SortedPairs }} {{if eq .Name "description" }} <p style="margin: 0 0 10px;"> <span style="font-weight: bold;">当前值:</span> <span style="padding-left: 8px;">{{ .Value }}</span> </p> {{end}} {{ end }}3. 不同Grafana版本的配置差异
在帮助客户升级Grafana从9.1到10.4的过程中,我发现新版在告警模板方面有几个重要变化:
- 模板语法更加强大,新增了Values对象,可以直接获取查询表达式的值
- 邮件模板结构完全重构,采用MJML邮件框架
- 告警规则配置界面更加直观
新版模板中获取当前值变得更加简单:
{{ range $refID, $value := .Values }} {{ if eq $refID "B" }} <tr> <td><strong>当前值</strong></td> <td>{{ printf "%.2f" $value }}</td> </tr> {{ end }} {{ end }}这个改进解决了旧版需要通过description迂回获取值的问题。实测发现,新版模板对响应式邮件的支持更好,在不同邮件客户端显示效果更一致。
版本迁移时需要注意:
- 旧版模板代码不能直接复制到新版
- 新版使用__dangerouslyInjectHTML处理特殊HTML片段
- 邮件样式定义方式完全不同,新版采用组件化设计
4. 高级优化技巧与实践经验
经过多个项目的实践,我总结出几个提升告警邮件效果的高级技巧:
多语言支持:为国际团队部署时,可以在模板中加入语言判断逻辑:
{{ if eq .Labels "language" "en" }} <span>Server:</span> {{ else }} <span>服务器:</span> {{ end }}动态阈值显示:有时阈值本身也是动态的,可以在告警规则中添加threshold标签,然后在模板中显示:
{{if .Labels.threshold }} <p> <span>阈值:</span> <span>{{ .Labels.threshold }}</span> </p> {{end}}邮件跳转链接优化:默认的Grafana链接可能指向内网地址,需要在grafana.ini中配置正确的domain:
[server] domain = your-public-domain.com性能考虑:复杂的模板逻辑会影响告警发送速度。我曾遇到一个案例,因为模板中使用了多重循环导致邮件延迟发送。解决方案是:
- 简化模板逻辑
- 将复杂计算移到告警规则中
- 使用缓存标签
对于需要显示图表的需求,可以考虑使用Grafana的图片渲染功能,在邮件中嵌入PNG格式的图表。这需要在模板中添加:
<img src="{{ .ImageUrl }}" alt="告警图表" style="max-width: 100%;">最后提醒一点:每次修改模板后,建议发送测试告警验证效果。我习惯创建一个专门的测试告警规则,设置很低的阈值方便触发。模板调试是个迭代过程,可能需要多次调整才能达到理想效果。