配置通知模板和Webhook模板

通知策略的匹配事件规则被触发后,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标签值等于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>
    说明

    仅钉钉、企业微信支持修改字体颜色,飞书不支持。

  • 换行:

    • 钉钉换行:在模板中键入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

告警组匹配的通知策略名称。