夜莺-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