通知模板
夜莺在告警通知时可以使用通知模板定制自己的通知内容。
本文使用钉钉通知进行通知模板配置详解。通知模板使用前提是需要配置好钉钉群机器人,并且告警规则中通知媒介勾选 dingtalk 。
调整通知模板
通知模板的核心作用
用通俗易懂的话来讲就是将产生的告警事件信息,通过通知模板进行过滤和调整,最终将过滤调整后的告警事件信息发送到 IM 通信工具进行展示。
告警事件字段说明信息
通过查看对比 Flashcat 的 AlertCurEvent 结构字段,如下面代码字段展示:
属性 | 类型 | 描述 |
---|---|---|
Id | int64 | 唯一标识符 |
Cate | string | 数据源类型(host,prometheus等) |
Cluster | string | 所属的集群 |
DatasourceId | int64 | 数据源 |
GroupId | int64 | 业务组 |
GroupName | string | 业务组名称 |
Hash | string | 事件的哈希值 |
RuleId | int64 | 规则 |
RuleName | string | 规则名称 |
RuleNote | string | 规则备注 |
RuleProd | string | 规则规则的类型(host,metric) |
Severity | int | 事件的级别 |
PromForDuration | int | 规则持续时长,单位秒 |
PromQl | string | promQl |
RuleConfig | string | 告警规则的配置信息 |
RuleConfigJson | interface{} | 告警规则的配置信息 |
PromEvalInterval | int | 执行频率,单位秒 |
Callbacks | string | 回调函数 |
CallbacksJSON | []string | 回调地址 |
RunbookUrl | string | 预案链接 |
NotifyRecovered | int | 是否通知恢复 |
NotifyChannels | string | 通知媒介 |
NotifyChannelsJSON | []string | 通知媒介 |
NotifyGroups | string | 告警接收组 |
NotifyGroupsJSON | []string | 告警接收组 |
NotifyGroupsObj | []UserGroup | 告警接收组对象 |
TargetIdent | string | 机器唯一标识 |
TargetNote | string | 目标的备注 |
TriggerTime | int64 | 告警时间戳 |
TriggerValue | string | 告警触发值 |
Tags | string | 标签 |
TagsJSON | []string | 标签 |
TagsMap | map[string]string | 标签映射 |
Annotations | string | 附加信息 |
AnnotationsJSON | map[string]string | 附加信息 |
IsRecovered | bool | 是否恢复 |
NotifyUsersObj | []User | 通知用户的详细信息 |
LastEvalTime | int64 | 最后评估时间 |
LastSentTime | int64 | 最后发送告警时间 |
NotifyCurNumber | int | 当前告警通知发送次数 |
FirstTriggerTime | int64 | 首次告警触发时间 |
ExtraConfig | interface{} | 额外配置 |
Status | int | 状态 |
Claimant | string | 认领人 |
SubRuleId | int64 | 订阅规则 |
ExtraInfo | []string | 额外信息 |
告警模板样例
下面是一个钉钉的默认通知模板,{{.XXX}} 就是模板中引用的变量,通过对比 AlertCurEvent 结构可以发现,这个结构的各个字段都可以被告警模板引用,上文也提到过告警信息与 AlertCurEvent 的对应关系,相信大家应该能看懂告警模板具体要显示的信息内容了。
- **规则备注**: {{.RuleNote}}
{{- end}}
{{- if not .IsRecovered}}
- **当次触发时值**: {{.TriggerValue}}
- **当次触发时间**: {{timeformat .TriggerTime}}
- **告警持续时长**: {{humanizeDurationInterface $time_duration}}
{{- else}}
{{- if .AnnotationsJSON.recovery_value}}
- **恢复时值**: {{formatDecimal .AnnotationsJSON.recovery_value 4}}
{{- end}}
- **恢复时间**: {{timeformat .LastEvalTime}}
- **告警持续时长**: {{humanizeDurationInterface $time_duration}}
{{- end}}
- **告警事件标签**:
{{- range $key, $val := .TagsMap}}
{{- if ne $key "rulename" }}
- {{$key}}: {{$val}}
{{- end}}
{{- end}}
{{$domain := "http://10.99.1.209" }}
[事件详情]({{$domain}}/alert-his-events/{{.Id}})|[屏蔽1小时]({{$domain}}/alert-mutes/add?busiGroup={{.GroupId}}&cate={{.Cate}}&datasource_ids={{.DatasourceId}}&prod={{.RuleProd}}{{range $key, $value := .TagsMap}}&tags={{$key}}%3D{{$value}}{{end}})|[查看曲线]({{$domain}}/metric/explorer?data_source_id={{.DatasourceId}}&data_source_name=prometheus&mode=graph&prom_ql={{.PromQl}})
测试告警模板
配置好钉钉群机器人,并且告警规则中通知媒介勾选 dingtalk 。
开启报警后稍等片刻,就可以接收到钉钉机器人发送的告警了。
告警模板不同类型变量的使用方法
数值类型
对于数值类型的变量,我们可以直接引用并进行数学运算或者通过内置函数进行运算,例如:
恢复时间:{{timeformat .LastEvalTime}}
在这个例子中,我们引用了数值类型的 LastEvalTime 和自定义函数 timeformat ,把时间戳转换为格式化的时间字符串。
字符串类型
对于数组和 Map 类型的变量,可以使用索引和键来访问其中的元素,例如:
监控指标1: {{range .TagsJSON}}
- {{.}}
{{end}}
监控指标2:{{$metric := index .TagsMap "__name__"}}
{{if and (eq "disk_free" $metric) (gt (len .TagsMap) 5) }}
机器:{{index $labels "ident"}} 分区:{{index .TagsMap "device"}}
{{else}}
{{.TagsMap}}
{{end}}
在这个例子中,我们使用 range 函数来遍历数组 .TagsJSON 元素,同时通过键”name“来访问 Map 类型变量 .TagsMap 的值。
判断条件和自定义函数
除了基本变量类型外, go template 还支持条件判断和自定义函数的使用。例如,我们可以使用 if-else 语句来进行条件判断,利用比较运算符,并且可以定义自己的自定义函数来扩展模板的功能。
监控指标2:{{$metric := index .TagsMap "__name__"}}
{{if and (eq "disk_free" $metric) (gt (len .TagsMap) 5) }}
机器:{{index $labels "ident"}} 分区:{{index .TagsMap "device"}}
{{else}}
{{.TagsMap}}
{{end}}
{{- if .IsRecovered -}}
恢复时间:{{timeformat .LastEvalTime}}
{{- else -}}
触发时间: {{timeformat .TriggerTime}}
触发时值: {{humanize (formatDecimal .TriggerValue 0)}}
{{- end -}}
发送时间: {{timestamp}}
在上述示例中,if-else 语句用于条件判断,用 eq 判断是否相等,用 gt 判断是否大于,用自定义变量 $metric 和 $labels,而 timeformat,humanize,formatDecimal 以及 timestamp 都是自定义函数的调用。另外如果想要生成的文本更加紧凑,可以使用 - 标记。通过多个 - 标记位于 if , else 和 end 之间,它们的作用是去除条件判断语句和相关内容之间的换行符和空格。(调试小技巧:通知模板的编辑可以预览)。关于 go template 的更多细节可以参考官方文档。
附录
Flashcat 产生的告警事件信息都有哪些?
这个查看方式很简单,一共就4步:
- 在服务器使用 nc 命令启动一个端口。
- 再将告警规则中的回调地址配置为 nc 所在的服务器和启动端口。
- 触发告警后就可以在服务器端 nc 查看到告警事件信息了。