通知策略的匹配事件規則被觸發后,ARMS會通過釘釘、飛書、微信、短信、電話、郵件、Webhook等方式發送告警通知。ARMS已為各種通知方式預置了對應的通知模板。當預置模板不能滿足您的需求時,您可以進行手動修改。本文介紹模板使用的Go Template語法,預置模板信息和模板中的變量參數。
模板語法(Go Template)說明
ARMS告警通知模板采用了Go Template語法來渲染模板。Go Template在渲染模板時,需要依據上下文中的數據來填充模板。
通知模板中的告警參數由多個標簽(Labels)組成,您可以通過標簽自定義您需要的告警參數。例如,此處示例中的alertname標簽表示告警名稱。
本文通過以下示例代碼對常用的Go Template語法進行說明。
{
"alerts": [
{
"annotations": {
"message": "命名空間: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / 容器: kube-state-metrics內存使用率超過80%, 當前值15.52%",
"value": "15.521240234375"
},
"endsAt": "2023-02-22T07:27:15.404000000Z",
"fingerprint": "bec72890cc2c7b4a027e008df0cd1013",
"labels": {
"container": "kube-state-metrics",
"severity": "warning",
"instance": "10.0.80.186:10255",
"clustername": "klyz1688-kubernetes-1",
"alertname": "容器內存使用率大于80%",
"_aliyun_arms_involvedObject_name": "klyz1688-kubernetes-1",
"pod_name": "kube-state-metrics-ccb59dbff-jljg4",
"_aliyun_arms_involvedObject_kind": "cluster",
"name": "k8s_kube-state-metrics_kube-state-metrics-ccb59dbff-jljg4_arms-prom_359508f3-7e76-4740-b915-41ea48849641_0",
"namespace": "arms-prom"
},
"startsAt": "2023-02-22T07:18:15.578000000Z",
"status": "firing"
}
],
"commonAnnotations": {
"message": "命名空間: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / 容器: kube-state-metrics內存使用率超過80%, 當前值15.52%",
"value": "15.521240234375"
},
"commonLabels": {
"container": "kube-state-metrics",
"severity": "warning",
"instance": "10.0.80.186:10255",
"clustername": "klyz1688-kubernetes-1",
"alertname": "容器內存使用率大于80%",
"_aliyun_arms_involvedObject_name": "klyz1688-kubernetes-1",
"pod_name": "kube-state-metrics-ccb59dbff-jljg4",
"_aliyun_arms_involvedObject_kind": "cluster",
"name": "k8s_kube-state-metrics_kube-state-metrics-ccb59dbff-jljg4_arms-prom_359508f3-7e76-4740-b915-41ea48849641_0",
"namespace": "arms-prom"
},
"groupLabels": {
"alertname": "容器內存使用率大于80%"
},
"status": "firing",
"startTime":"2023-02-22 07:18:15",
"endTime":"告警恢復時間",
"level":"error",
"dispatchRuleName":"通知策略名稱",
"alarmId":"123456"
},
.
字符
在當前作用域下渲染指定對象。
示例1:取頂級作用域下的所有內容,即示例代碼中上下文數據的全部內容。
{{ . }}
返回結果:輸出示例代碼的全部內容。
示例2:獲取上下文數據中的level
字段。
{{ .level }}
返回結果:
error
示例3:獲取上下文數據中的commonLabels.alertname
字段。
{{ .commonLabels.alertname }}
返回結果:
容器內存使用率大于80%
變量
傳給模板的數據可以保存在模板的變量中,整個模板中都能訪問。例如,在{ {$context := .}}
中使用$context
作為變量,保存傳入的數據,然后可以使用{{$context}}
訪問變量。
示例1:將告警名稱賦值給$alertname
,然后輸出$alertname
。
{{ $alertname := .commonLabels.alertname }} {{$alertname}}
返回結果:
容器內存使用率大于80%
示例2:將alerts
列表中第一個元素賦值給$alert0
,并輸出第一個告警(元素)下的alertname
。
{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}
返回結果:
容器內存使用率大于80%
判斷語句if/else
使用if
檢查數據,如果不滿足可以執行else
。空值、0、nil、空字符串或者長度為0的字符串都返回false
。
示例1:如果告警事件中的severity
標簽值為warning
,則輸出P3告警
。
{{if eq "warning" .commonLabels.severity }} P3警告 {{ end }}
返回結果:
P3告警
示例2:如果告警事件中的severity
標簽值為critical
,則輸出P1告警
,否則輸出P2告警
。
{{if eq "critical" .commonLabels.severity }} P1告警 {{ else }} P2告警 {{ end }}
返回結果:
P2告警
循環函數for
for
函數用于重復執行代碼內容。
示例1:遍歷alerts
列表,獲取每個告警的alertname
。
{{ for .alerts}} {{.labels.alertname}} \n {{end}}
返回結果:
容器內存使用率大于80%
range函數
range
函數用于遍歷指定內容。
示例1:遍歷0-9。
{{ $ran := range 0 10 }} {{ for $ran }} {{.}} {{end}}
返回結果:
0 1 2 3 4 5 6 7 8 9
index函數
index
函數用于獲取數組中的元素。
示例1:獲取alerts
列表中第一個元素,然后賦值給$alert0
。
{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}
返回結果:
容器內存使用率大于80%
比較函數
常用的比較函數:
eq
:等于ne
:不等于lt
:小于le
:小于等于gt
:大于ge
:大于等于
示例:如果commonLabels
中的severity
標簽值等于warning
,則輸出P3告警
。
{{if eq "warning" .commonLabels.severity }} P3警告 {{ end }}
返回結果:
P3告警
邏輯函數and 、or、not
示例:如果commonLabels
中的severity
標簽值等于warning
或warnning
,則輸出P3告警
。
{{if eq "warning" .commonLabels.severity or eq "warnning" .commonLabels.severity }} P3警告 {{ end }}
返回結果:
P3告警
常用內置函數
printf:格式化輸出信息。
示例:輸出alerts
列表中第一個告警的value
并只保留2位小數點。
{{ $alert0 := index .alerts 0 }} {{ printf "%.2f" $alert0.annotations.value }}
返回結果:
15.52
humanizePercentage:格式化百分比。
示例:將0.95332123123124字符串轉化為可讀性更好的百分比。
{{ "0.95332123123124" | humanizePercentage }}
返回結果:
95.33%
humanizeDate:格式化日期,將毫秒時間戳轉化為日期。日期格式為yyyy-MM-dd HH:mm:ss
。
示例:將時間戳1671074058234轉化為日期。
{{ "1671074058234" | humanizeDate }}
返回結果:
2022-12-15 11:14:18
len:獲取數組長度。
示例:獲取alerts
列表長度。
{{ len .alerts }}
返回結果:
1
預置通知模板說明
郵件通知模板
告警名稱:{{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}
集群名稱:{{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
應用名稱:{{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
通知策略:{{ .dispatchRuleName }}
告警時間:{{ .startTime }}
告警內容:{{ if .newIncidentIn }} (有事件新增) {{end}} {{ for .alerts }} {{ .annotations.message }} {{if .generatorURL }} <a href="{{.generatorURL}}" > 詳情鏈接</a> {{ end }} {{ end }}
模板內容 | 說明 |
| 告警名稱。默認情況下通知策略使用 |
| 如果事件中存在 |
| 如果告警關聯對象類型為 |
| 產生這條告警的通知策略的名稱。 |
| 告警第一次發生的時間。 |
| 遍歷告警事件列表渲染 說明 預置模板中使用了HTML語法
|
通過示例代碼渲染后返回結果:
告警名稱:容器內存使用率大于80%
集群名稱:klyz1688-kubernetes-1
通知策略:通知策略名稱
告警時間:2023-02-22 07:18:15
告警內容:命名空間: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / 容器: kube-state-metrics 內存使用率超過80%, 當前值15.52%
短信和電話通知模板
該模板沒有詳情鏈接,其他內容與郵件模板相同。
發生{{ .level }}告警
告警名稱:{{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}
集群名稱:{{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
應用名稱:{{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
通知策略:{{ .dispatchRuleName }}
告警時間:{{ .startTime }}
告警內容:{{ if .newIncidentIn }} (有事件新增)
{{end}} {{ for .alerts }} {{ .annotations.message }} {{ end }}
機器人通知模板
{{ if .newIncidentIn }} (有事件新增) {{end}}
{{if .commonLabels.clustername }}
> 集群名稱:{{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
> 應用名稱:{{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
{{ for .alerts }} > {{ .annotations.message }} {{if .generatorURL }} [詳情鏈接]({{.generatorURL}}) {{end}}{{if .annotations._aliyun_arms_insights_analyze_link }}[<font color='#ff0000'>診斷根因</font>]({{ .annotations._aliyun_arms_insights_analyze_link}}){{ end }}{{if eq "1" .labels._aliyun_arms_denoise_code }} (重要:{{.labels._aliyun_arms_important_reason }}) {{end}}
{{end}}
機器人渲染結果為Markdown文本,不同的機器人對于Markdown的支持不同。
引用:
>
字體顏色:
<font color='#ff0000'>診斷根因</font>
說明僅釘釘、企業微信支持修改字體顏色,飛書不支持。
換行:
釘釘換行:在模板中鍵入2個換行。
飛書換行:在模板中鍵入1個換行。
企業微信換行:在模板中鍵入1個換行。
Webhook模板
{
"告警名稱":"{{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}", "集群名稱":"{{ .commonLabels.clustername }} {{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}", "應用名稱":"{{ .commonLabels._aliyun_arms_involvedObject_name }} {{ end }}",
"通知策略":"{{ .dispatchRuleName }}",
"告警時間":"{{ .startTime }}",
"告警內容":"{{ for .alerts }} {{ .annotations.message }} {{ end }}"
}
通過示例代碼渲染后返回結果:
{
"告警名稱": "容器內存使用率大于80%",
"集群名稱": "klyz1688-kubernetes-1",
"通知策略": "通知策略名稱",
"告警時間": "2023-02-22 07:18:15",
"告警內容": "命名空間: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / 容器: kube-state-metrics 內存使用率超過80%, 當前值15.52%"
}
變量參數說明
通知模板中可以使用的預置變量參數說明如下:
參數 | 說明 |
alarmId | 原始告警ID。 |
alerts | 原始告警事件,類型List<Alert>。 |
alerts.annotations | 原始告警的注釋,類型Map<String, String>。 |
alerts.endsAt | 原始告警的結束時間。 結束時間=告警發生時間+恢復時長 |
alerts.startsAt | 原始告警的發生時間。 |
alerts.fingerprint | 原始告警指紋標識,同一組標簽的告警其指紋相同。 |
alerts.labels | 原始告警的標簽。 |
alerts.status | 原始告警狀態:
|
commonAnnotations | 一組原始告警中相同的注釋。 |
commonLabels | 一組原始告警中相同的標簽。 |
groupLabels | 分組標簽,根據通知策略中的分組條件設置的標簽進行分組。 |
status | 告警組狀態:
|
startTime | 告警組創建的時間。 |
endTime | 告警組恢復的時間,最后一個原始告警的恢復時間。 |
level | 告警等級:
|
dispatchRuleName | 告警組匹配的通知策略名稱。 |