跳转至

配置通知模板

告警通知模板采用了 Go Template 语法来渲染模板。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告警

常用内置函数

查询相关

名称 Arguments 返回值 解析
query query string []sample 查询数据库,不支持返回范围向量
first []sample sample 相当于index a 0
label label, sample string 相当于index sample.Labels label
value sample interface{} 相当于sample.Value
sortByLabel label, []samples []sample 根据给出的 label(标签)对 samples(数据样本)列表进行排序。是稳定排序

first, labelvalue旨在使查询结果易于在管道中使用

数字相关

名称 Arguments 返回值 解析
humanize number or string string 使用数据指标前缀将数字转化为更以读的格式
humanize1024 number or string string 类似于humanize,但使用 1024 作为基准而不是 1000
humanizeDuration number or string string 将持续时间(以秒为单位)转换为更可读的格式
humanizePercentage number or string string 将比值转化为百分数
humanizeTimestamp number or string string 将 Unix 时间戳转化为易读的格式
toTime number or string *time.Time 将 Unix 时间戳转化为 time.Time

Humanizing 相关函数旨在产生合理的输出以供人们使用

字符相关

名称 Arguments 返回值 解析
title string string strings.Title 函数,大写每个单词的第一个字符
toUpper string string strings.ToUpper 函数,所有字符转化为大写
toLower string string strings.ToLower 函数,所有字符转化为小写
stripPort string string net.SplitHostPort, splits string into host and port, then returns only host.
match pattern, text boolean regexp.MatchString 函数,测试非锚定的正则表达式匹配
reReplaceAll pattern, replacement, text string Regexp.ReplaceAllString 函数,正则表达式替换,非锚定
graphLink expr string 返回表达式浏览器中该表达式的图形视图的路径
tableLink expr string 返回表达式浏览器中表达式的表格化("Console")视图的路径
parseDuration string float Parses a duration string such as "1h" into the number of seconds it represents.
stripDomain string string Removes the domain part of a FQDN. Leaves port untouched.

其他

名称 Arguments 返回值 解析
args []interface{} map[string]interface{} 这会将对象列表转换为具有键 arg0, arg1 等的映射。旨在允许将多个参数传递给模板
tmpl string, []interface{} nothing 类似于内置的template函数,但允许使用非文字作为模板名称。注意,假定其结果是安全的,并且不会自动转义。仅在控制台中可用
safeHtml string string 将字符串标记为 HTML,不需要自动转义
externalURL none string The external URL under which Prometheus is externally reachable.
pathPrefix none string The external URL path for use in console templates.