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

通知模板

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

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

通知模板001

调整通知模板

通知模板的核心作用

用通俗易懂的话来讲就是将产生的告警事件信息,通过通知模板进行过滤和调整,最终将过滤调整后的告警事件信息发送到 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 。

通知模板002

通知模板003

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

通知模板004

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

数值类型

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

恢复时间:{{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步:

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

通知模板005

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

通知模板006

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

通知模板007

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat