告警规则&告警模板如何引用变量:go template 典型用法及变量引用
Q:告警规则&告警模板如何引用变量
A:
在使用夜莺配置告警过程中,灵活的告警规则配置和通知模板是至关重要的。go template 作为一种轻量级且强大的模板引擎,为用户提供了丰富的功能,可以轻松地应对各种复杂的变量使用和逻辑操作。本文将介绍 go template 的典型用法,并详细讨论在告警规则配置中如何引用变量以及通知模板如何引用变量的方法。
典型用法
首先,先展示一下如何定义一个包含变量的告警规则(注:以备注为例,告警规则中基础配置的三项均可使用变量)以及包含变量的通知模板:
这个备注,告警机器:ident={{$labels.ident}} busigroup={{$labels.busigroup}} {{if $labels.service}} service={{ $labels.service}}{{end}}
通知模版
级别状态: S{{.Severity}} {{if .IsRecovered}}Recovered{{else}}Triggered{{end}}
规则名称: {{.RuleName}}
{{if .RuleNote}}
规则备注: {{.RuleNote}}
{{end}}
监控指标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}}
{{if .IsRecovered}}
恢复时间:{{timeformat .LastEvalTime}}
{{else}}
触发时间: {{timeformat .TriggerTime}}
触发时值: {{humanize (formatDecimal .TriggerValue 0)}}
{{end}}
发送时间: {{timestamp}}
描述: {{$feishuAt := index .AnnotationsJSON "FeishuAts"}} {{$feishuAt|unescaped}}
在上面的例子中,我们定义了一个复杂的模板,其中涉及了条件判断、数组遍历、 Map 访问、比较运算符、使用自定义变量,使用自定义函数等复杂操作。
当然,你可能会对模板中可以引用哪些变量产生疑问。可以参考 AlertCurEvent 结构,这个结构的各个字段都可以被引用。此外,我们还有一些预设的自定义变量,例如 {{$labels := .TagsMap}} 和 {{$value := .TriggerValue}},以及一批自定义函数 TemplateFuncMap 可供使用。
模板不同类型变量的使用方法
数值类型
对于数值类型的变量,我们可以直接引用并进行数学运算或者通过内置函数进行运算,例如:
恢复时间:{{timeformat .LastEvalTime}}
在这个例子中,我们引用了数值类型的 LastEvalTime 和自定义函数 timeformat ,把时间戳转换为格式化的时间字符串。
字符串类型
对于字符串类型的变量,可以直接引用并在模板中进行拼接、格式化等操作,例如:
这个备注,告警机器:ident={{$labels.ident}} busigroup={{$labels.busigroup}}
在这个例子中,我们直接引用了字符串类型的变量,并将它们拼接到备注中,$labels 等价于 .TagsMap 。
数组和 Map 类型
对于数组和 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 之间,它们的作用是去除条件判断语句和相关内容之间的换行符和空格。(调试小技巧:通知模版的编辑可以预览)
AlertCurEvent结构
属性 | 类型 | 描述 |
---|---|---|
Id | int64 | 唯一标识符 |
Cate | string | 数据源类型(host,prometheus等) |
Cluster | string | 所属的集群 |
DatasourceId | int64 | 数据源 ID |
GroupId | int64 | 业务组 ID |
GroupName | string | 业务组名称 |
Hash | string | 事件的哈希值 |
RuleId | int64 | 规则 ID |
RuleName | string | 规则名称 |
RuleNote | string | 规则备注 |
RuleProd | string | 规则规则的类型(host,metric) |
Severity | int | 事件的级别 (1,2,3) |
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 | 订阅规则 ID |
ExtraInfo | []string | 额外信息 |
结论
通过以上介绍,我们详细讨论了不同类型变量的使用方法以及可能存在的自定义函数。希望本文能够帮助您快速掌握 go template 的基本用法,为配置告警规则和通知模板提供更大的便利,此外关于 go template 的更多细节可以参考官方文档。