夜莺-Nightingale
夜莺V6
项目介绍 架构介绍
快速开始
黄埔营
安装部署
升级
采集器
使用手册
API
数据库表结构
FAQ
夜莺专业版
开源生态
Prometheus
版权声明
第1章:天降奇兵
第2章:探索PromQL
第3章:Prometheus告警处理
第4章:Exporter详解
第5章:数据与可视化
第6章:集群与高可用
第7章:Prometheus服务发现
第8章:监控Kubernetes
第9章:Prometheus Operator
参考资料

告警规则&告警模板如何引用变量: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 的更多细节可以参考官方文档

开源版
Flashcat
Flashduty