告警规则&告警模板如何引用变量:go template 典型用法及变量引用

Q:告警规则&告警模板如何引用变量

A:

在使用夜莺配置告警过程中,灵活的告警规则配置和通知模板是至关重要的。go template 作为一种轻量级且强大的模板引擎,为用户提供了丰富的功能,可以轻松地应对各种复杂的变量使用和逻辑操作。本文将介绍 go template 的典型用法,并详细讨论在告警规则配置中如何引用变量以及通知模板如何引用变量的方法。

典型用法

首先,先展示一下如何定义一个包含变量的告警规则(注:以备注为例,告警规则中基础配置的三项均可使用变量)以及包含变量的通知模板:

  1. 这个备注,告警机器:ident={{$labels.ident}} busigroup={{$labels.busigroup}} {{if $labels.service}} service={{ $labels.service}}{{end}}
  1. 通知模版
  2. 级别状态: S{{.Severity}} {{if .IsRecovered}}Recovered{{else}}Triggered{{end}}
  3. 规则名称: {{.RuleName}}
  4. {{if .RuleNote}}
  5. 规则备注: {{.RuleNote}}
  6. {{end}}
  7. 监控指标1: {{range .TagsJSON}}
  8. - {{.}}
  9. {{end}}
  10. 监控指标2:{{$metric := index .TagsMap "__name__"}}
  11. {{if and (eq "disk_free" $metric) (gt (len .TagsMap) 5) }}
  12. 机器:{{index $labels "ident"}} 分区:{{index .TagsMap "device"}}
  13. {{else}}
  14. {{.TagsMap}}
  15. {{end}}
  16. {{if .IsRecovered}}
  17. 恢复时间:{{timeformat .LastEvalTime}}
  18. {{else}}
  19. 触发时间: {{timeformat .TriggerTime}}
  20. 触发时值: {{humanize (formatDecimal .TriggerValue 0)}}
  21. {{end}}
  22. 发送时间: {{timestamp}}
  23. 描述: {{$feishuAt := index .AnnotationsJSON "FeishuAts"}} {{$feishuAt|unescaped}}

在上面的例子中,我们定义了一个复杂的模板,其中涉及了条件判断、数组遍历、 Map 访问、比较运算符、使用自定义变量,使用自定义函数等复杂操作。

当然,你可能会对模板中可以引用哪些变量产生疑问。可以参考 AlertCurEvent 结构,这个结构的各个字段都可以被引用。此外,我们还有一些预设的自定义变量,例如 {{$labels := .TagsMap}} 和 {{$value := .TriggerValue}},以及一批自定义函数 TemplateFuncMap 可供使用。

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

数值类型

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

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

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

字符串类型

对于字符串类型的变量,可以直接引用并在模板中进行拼接、格式化等操作,例如:

  1. 这个备注,告警机器:ident={{$labels.ident}} busigroup={{$labels.busigroup}}

在这个例子中,我们直接引用了字符串类型的变量,并将它们拼接到备注中,$labels 等价于 .TagsMap 。

数组和 Map 类型

对于数组和 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 之间,它们的作用是去除条件判断语句和相关内容之间的换行符和空格。(调试小技巧:通知模版的编辑可以预览

AlertCurEvent结构

属性类型描述
Idint64唯一标识符
Catestring数据源类型(host,prometheus等)
Clusterstring所属的集群
DatasourceIdint64数据源 ID
GroupIdint64业务组 ID
GroupNamestring业务组名称
Hashstring事件的哈希值
RuleIdint64规则 ID
RuleNamestring规则名称
RuleNotestring规则备注
RuleProdstring规则规则的类型(host,metric)
Severityint事件的级别 (1,2,3)
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订阅规则 ID
ExtraInfo[]string额外信息

结论

通过以上介绍,我们详细讨论了不同类型变量的使用方法以及可能存在的自定义函数。希望本文能够帮助您快速掌握 go template 的基本用法,为配置告警规则和通知模板提供更大的便利,此外关于 go template 的更多细节可以参考官方文档