通知模板

夜莺在告警通知时可以使用通知模板定制自己的通知内容。

本文使用钉钉通知进行通知模板配置详解。通知模板使用前提是需要配置好钉钉群机器人,并且告警规则中通知媒介勾选 dingtalk 。

通知模板001

调整通知模板

通知模板的核心作用

用通俗易懂的话来讲就是将产生的告警事件信息,通过通知模板进行过滤和调整,最终将过滤调整后的告警事件信息发送到 IM 通信工具进行展示。

告警事件字段说明信息

通过查看对比 Flashcat 的 AlertCurEvent 结构字段,如下面代码字段展示:

属性类型描述
Idint64唯一标识符
Catestring数据源类型(host,prometheus等)
Clusterstring所属的集群
DatasourceIdint64数据源
GroupIdint64业务组
GroupNamestring业务组名称
Hashstring事件的哈希值
RuleIdint64规则
RuleNamestring规则名称
RuleNotestring规则备注
RuleProdstring规则规则的类型(host,metric)
Severityint事件的级别
PromForDurationint规则持续时长,单位秒
PromQlstringpromQl
RuleConfigstring告警规则的配置信息
RuleConfigJsoninterface{}告警规则的配置信息
PromEvalIntervalint执行频率,单位秒
Callbacksstring回调函数
CallbacksJSON[]string回调地址
RunbookUrlstring预案链接
NotifyRecoveredint是否通知恢复
NotifyChannelsstring通知媒介
NotifyChannelsJSON[]string通知媒介
NotifyGroupsstring告警接收组
NotifyGroupsJSON[]string告警接收组
NotifyGroupsObj[]UserGroup告警接收组对象
TargetIdentstring机器唯一标识
TargetNotestring目标的备注
TriggerTimeint64告警时间戳
TriggerValuestring告警触发值
Tagsstring标签
TagsJSON[]string标签
TagsMapmap[string]string标签映射
Annotationsstring附加信息
AnnotationsJSONmap[string]string附加信息
IsRecoveredbool是否恢复
NotifyUsersObj[]User通知用户的详细信息
LastEvalTimeint64最后评估时间
LastSentTimeint64最后发送告警时间
NotifyCurNumberint当前告警通知发送次数
FirstTriggerTimeint64首次告警触发时间
ExtraConfiginterface{}额外配置
Statusint状态
Claimantstring认领人
SubRuleIdint64订阅规则
ExtraInfo[]string额外信息

告警模板样例

下面是一个钉钉的默认通知模板,{{.XXX}} 就是模板中引用的变量,通过对比 AlertCurEvent 结构可以发现,这个结构的各个字段都可以被告警模板引用,上文也提到过告警信息与 AlertCurEvent 的对应关系,相信大家应该能看懂告警模板具体要显示的信息内容了。

  1. - **规则备注**: {{.RuleNote}}
  2. {{- end}}
  3. {{- if not .IsRecovered}}
  4. - **当次触发时值**: {{.TriggerValue}}
  5. - **当次触发时间**: {{timeformat .TriggerTime}}
  6. - **告警持续时长**: {{humanizeDurationInterface $time_duration}}
  7. {{- else}}
  8. {{- if .AnnotationsJSON.recovery_value}}
  9. - **恢复时值**: {{formatDecimal .AnnotationsJSON.recovery_value 4}}
  10. {{- end}}
  11. - **恢复时间**: {{timeformat .LastEvalTime}}
  12. - **告警持续时长**: {{humanizeDurationInterface $time_duration}}
  13. {{- end}}
  14. - **告警事件标签**:
  15. {{- range $key, $val := .TagsMap}}
  16. {{- if ne $key "rulename" }}
  17. - {{$key}}: {{$val}}
  18. {{- end}}
  19. {{- end}}
  20. {{$domain := "http://10.99.1.209" }}
  21. [事件详情]({{$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 。

通知模板002

通知模板003

开启报警后稍等片刻,就可以接收到钉钉机器人发送的告警了。

通知模板004

告警模板不同类型变量的使用方法

数值类型

对于数值类型的变量,我们可以直接引用并进行数学运算或者通过内置函数进行运算,例如:

  1. 恢复时间:{{timeformat .LastEvalTime}}

在这个例子中,我们引用了数值类型的 LastEvalTime 和自定义函数 timeformat ,把时间戳转换为格式化的时间字符串。

字符串类型

对于数组和 Map 类型的变量,可以使用索引和键来访问其中的元素,例如:

  1. 监控指标1: {{range .TagsJSON}}
  2. - {{.}}
  3. {{end}}
  4. 监控指标2:{{$metric := index .TagsMap "__name__"}}
  5. {{if and (eq "disk_free" $metric) (gt (len .TagsMap) 5) }}
  6. 机器:{{index $labels "ident"}} 分区:{{index .TagsMap "device"}}
  7. {{else}}
  8. {{.TagsMap}}
  9. {{end}}

在这个例子中,我们使用 range 函数来遍历数组 .TagsJSON 元素,同时通过键”name“来访问 Map 类型变量 .TagsMap 的值。

判断条件和自定义函数

除了基本变量类型外, go template 还支持条件判断和自定义函数的使用。例如,我们可以使用 if-else 语句来进行条件判断,利用比较运算符,并且可以定义自己的自定义函数来扩展模板的功能。

  1. 监控指标2:{{$metric := index .TagsMap "__name__"}}
  2. {{if and (eq "disk_free" $metric) (gt (len .TagsMap) 5) }}
  3. 机器:{{index $labels "ident"}} 分区:{{index .TagsMap "device"}}
  4. {{else}}
  5. {{.TagsMap}}
  6. {{end}}
  7. {{- if .IsRecovered -}}
  8. 恢复时间:{{timeformat .LastEvalTime}}
  9. {{- else -}}
  10. 触发时间: {{timeformat .TriggerTime}}
  11. 触发时值: {{humanize (formatDecimal .TriggerValue 0)}}
  12. {{- end -}}
  13. 发送时间: {{timestamp}}

在上述示例中,if-else 语句用于条件判断,用 eq 判断是否相等,用 gt 判断是否大于,用自定义变量 $metric 和 $labels,而 timeformat,humanize,formatDecimal 以及 timestamp 都是自定义函数的调用。另外如果想要生成的文本更加紧凑,可以使用 - 标记。通过多个 - 标记位于 if , else 和 end 之间,它们的作用是去除条件判断语句和相关内容之间的换行符和空格。(调试小技巧:通知模板的编辑可以预览)。关于 go template 的更多细节可以参考官方文档

附录

Flashcat 产生的告警事件信息都有哪些?

这个查看方式很简单,一共就4步:

  1. 在服务器使用 nc 命令启动一个端口。

通知模板005

  1. 再将告警规则中的回调地址配置为 nc 所在的服务器和启动端口。

通知模板006

  1. 触发告警后就可以在服务器端 nc 查看到告警事件信息了。

通知模板007