全部產品
Search
文件中心

Application Real-Time Monitoring Service:配置通知模板和Webhook模板

更新時間:Jul 19, 2024

通知策略的匹配事件規則被觸發後,ARMS會通過DingTalk、飛書、微信、簡訊、電話、郵件、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、Null 字元串或者長度為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標籤值等於warningwarnning,則輸出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 }}

模板內容

說明

警示名稱:{{ .commonLabels.alertname }}

警示名稱。預設情況下通知策略使用alertname進行分組,因此一個警示中所有事件的警示名稱均相同。

{{if .commonLabels.clustername }}
叢集名稱:{{ .commonLabels.clustername }}
{{ end }}

如果事件中存在clustername標籤,則clustername標籤值將會被渲染為叢集名稱欄位。

{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
應用程式名稱:{{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}

如果警示關聯物件類型為app,則輸出應用程式名稱。

通知策略:{{ .dispatchRuleName }}

產生這條警示的通知策略的名稱。

警示時間:{{ .startTime }}

警示第一次發生的時間。

警示內容:{{ if .newIncidentIn }} (有事件新增) {{end}} 
{{ for .alerts }} {{ .annotations.message }} {{if .generatorURL }}  <a href="{{.generatorURL}}" > 詳情連結</a> {{ end }} {{ end }}

遍曆警示事件列表渲染message值,如果事件包含generatorUrl欄位,則將generatorUrl欄位值渲染為事件詳情連結地址。

說明

預置模板中使用了HTML文法<a></a>渲染連結。

<a href="{{.generatorUrl}}">詳情連結</a>

{{ if .newIncidentIn }} (有事件新增) {{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%

簡訊和電話通知模板

該模板沒有詳情連結,其他內容與郵件模板相同。

發生{{ .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>
    說明

    僅DingTalk、企業微信支援修改字型顏色,飛書不支援。

  • 換行:

    • DingTalk換行:在模板中鍵入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

原始警示狀態:

  • firing:正觸發

  • resolved:已恢複

commonAnnotations

一組原始警示中相同的注釋。

commonLabels

一組原始警示中相同的標籤。

groupLabels

分組標籤,根據通知策略中的分組條件設定的標籤進行分組。

status

警示組狀態:

  • firing:正觸發

  • resolved:已恢複

startTime

警示組建立的時間。

endTime

警示組恢複的時間,最後一個原始警示的恢復。

level

警示等級:

  • critical:P1

  • error:P2

  • warning:P3

  • page:P4

dispatchRuleName

警示組匹配的通知策略名稱稱。