自定义通知模板
自定义全局通知模板
夜莺已经内置了挺多通知媒介,每个通知媒介都对应有自己的通知模板,这些通知模板是可以自定义的,菜单入口:告警通知
- 通知模板
。这些模板有些是 Markdown 格式,有些是 HTML 格式,修改的时候要注意。
- mm: Mattermost 通知模板
- telegram: Telegram 机器人模板
- wecom: 企微机器人模板
- dingtalk: 钉钉机器人模板
- email: 邮件内容模板
- feishu: 飞书机器人模板
- feishucard: 飞书卡片模板
- mailsubject: 邮件标题模板
这些模板都遵从 go template 语法(如果不懂请自行 Google),模板渲染的时候,夜莺会把告警事件作为模板变量传入,比如 {{.Severity}}
就是引用告警事件的严重级别,{{.RuleName}}
就是引用告警规则的标题。当然,还有哪些变量可以用呢,实际上 alert_cur_event 的所有属性都可以用。
自定义单个告警规则通知模板
需求:全局的通知模板中,有些字段特别长,比如
监控指标: {{.TagsJSON}}
,有的时候不想展示,想自定义一下。比如某个内存告警规则,只想展示 instance 标签,某个磁盘告警规则,只想展示 instance 和 device 标签。
从功能列表来看,开源版夜莺不支持针对告警规则颗粒度自定义通知模板。但实际上,可以通过一些小技巧来实现。下面以内存利用率告警规则为例,给大家演示一下整个流程。原本的告警事件详情如下:
里边有三个事件标签,企微通知如下:
标签太长了,不好看,其他字段倒是都合适,应该展示,下面我就来自定义一下这个事件标签的展示内容。
1.修改全局通知模板
我以企微通知为例,修改 wecom 的通知模板,改成如下内容:
**级别状态**: {{if .IsRecovered}}<font color="info">S{{.Severity}} Recovered</font>{{else}}<font color="warning">S{{.Severity}} Triggered</font>{{end}}
**规则标题**: {{.RuleName}}{{if .RuleNote}}
**备注**: {{.RuleNote}}{{end}}{{if .TargetIdent}}
**监控对象**: {{.TargetIdent}}{{end}}
{{- if ne .AnnotationsJSON.Note "1"}}
**监控指标**: {{.TagsJSON}}
{{- end}}
{{- if not .IsRecovered}}
**触发时值**: {{.TriggerValue}}
{{- end}}
{{if .IsRecovered}}**恢复时间**: {{timeformat .LastEvalTime}}{{else}}**首次触发时间**: {{timeformat .FirstTriggerTime}}{{end}}
{{$time_duration := sub now.Unix .FirstTriggerTime }}{{if .IsRecovered}}{{$time_duration = sub .LastEvalTime .FirstTriggerTime }}{{end}}**距离首次告警**: {{humanizeDurationInterface $time_duration}}
**发送时间**: {{timestamp}}
最核心的改动是:
{{- if ne .AnnotationsJSON.Note "1"}}
**监控指标**: {{.TagsJSON}}
{{- end}}
这个意思是:只有当附加信息的 Note 字段不等于 1 的时候,才展示 TagsJSON 字段。这个 Note 字段是我自己定义的,后面会讲到。换句话说,如果自定义的 Note 字段为 1,就表示用户自定义了备注信息,就不需要展示 TagsJSON 字段了。
2.创建一个内存利用率告警规则
自定义告警规则,注意备注部分和自定义字段部分,告警规则的备注是可以引用事件变量的,比如 {{ $labels.ident }}
这样的格式。从上面的事件详情中可以看到机器的信息在 ident 标签中,所以我把这个标签引用到备注中,如下:
然后配置规则其他字段,在附加信息那里,增加一个 Note 字段,值设置为 1。
可以了,保存规则。稍等片刻,就能看到企微通知了:
后面哪个规则还想自定义标签展示内容,就在自定义字段那里增加一个 Note 字段,然后在备注里写自定义的内容即可。