夜鶯在告警通知時可以使用通知模板定制自己的通知內容。
本文使用釘釘通知進行通知模板配置詳解。通知模板使用前提是需要配置好釘釘群機器人,並且告警規則中通知媒介勾選 dingtalk 。
調整通知模板
通知模板的核心作用
用通俗易懂的話來講就是將產生的告警事件信息,通過通知模板進行過濾和調整,最終將過濾調整後的告警事件信息發送到 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 。
開啟報警後稍等片刻,就可以接收到釘釘機器人發送的告警了。
告警模板不同類型變量的使用方法
數值類型
對於數值類型的變量,我們可以直接引用並進行數學運算或者通過內置函數進行運算,例如:
恢复时间:{{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步:
- 在伺服器使用 nc 命令啟動一個端口。
- 再將告警規則中的回調地址配置為 nc 所在的伺服器和啟動端口。
- 觸發告警後就可以在伺服器端 nc 查看到告警事件信息了。