发送给接收方的通知是通过模板构建的。警报管理器附带默认模板,但也可以自定义它们。 为避免混淆,请务必注意,警报管理器模板与 Prometheus 中的模板不同,但 Prometheus 模板还包括警报规则标签/注释中的模板。
警报管理器的通知模板基于 Go 模板系统。 请注意,某些字段被评估为文本,而其他字段则被评估为 HTML,这将影响转义。
需要懂点 go
数据是传递给通知模板和webhook推送的结构
| 名称 | 类型 | 说明 |
|---|---|---|
| Receiver | string | 定义将向其发送通知的接收方名称 |
| Status | string | 警报的状态。触发 (firing),或者 解决 resolved。 |
| Alerts | Alert | 此组中所有警报对象的列表 |
| GroupLabels | KV | 这些警报的分组标签,就是 group_by 数组中的标签。 |
| CommonLabels | KV | 所有警报的公用标签。 |
| CommonAnnotations | KV | 所有警报的通用注释集。用于有关警报的更长的附加信息字符串。 |
| ExternalURL | string | 部署 Alertmanager 时候使用 --web.external-url 的值,一般用于查看告警的图形化展示页面,设置为 Grafana的地址。 |
GroupLabels 示例
假设配置中配置了分组 group_by: [alertname, app]
那么可以这样使用 {{ .GroupLabels.app }} , {{ .GroupLabels.alertname }}
CommonLabels 示例
假设配置中设置了 annotations:
...
annotations:
description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.'
summary: 'Instance {{ $labels.instance }} down'
这样使用
{{ .CommonAnnotations.summary }} {{ .CommonAnnotations.description }}
Alerts 包含的所有的警报
Alerts.Firing 返回此组中当前正在处于 firing 警报对象的列表
Alerts.Resolved 返回此组中已解决的警报对象的列表
还可以利用循环所有的警报,打印出每个警报的 注释信息。
{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}
{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}
| 名称 | 类型 | 说明 |
|---|---|---|
| Status | string | 定义警报的状态是已解决 (resolved)还是当前正在触发(currently firing)。 |
| Labels | KV | 要附加到警报的一组标签。 |
| Annotations | KV | 警报的一组注释 |
| StartsAt | time.Time | 警报开始触发(firing)的时间。如果忽略,则当前时间由Alertmanager分配。 |
| EndsAt | time.Time | 仅当警报的结束时间已知时设置。否则,设置为自上次收到警报以来的可配置超时时间。 |
| GeneratorURL | string | 一个反向链接,用于识别此警报的原因实体。 |
| Fingerprint | string | 可用于识别警报的指纹。 |
KV 是一组用于表示标签和注释的键/值字符串对。
go 语言示意代码
type KV map[string]string
如下是包含了两个注释的 annotation 示例:
{
summary: "alert summary",
description: "alert description",
}
除了直接访问存储为KV的数据(标签和注释)外,还有排序、删除和查看LabelSet的方法:
KV 的方法
| Name | Arguments | Returns | Notes |
|---|---|---|---|
| SortedPairs | - | Pairs (list of key/value string pairs.) | 返回键/值对的排序列表。 |
| Remove | []string | KV | 返回没有给定键的 key/value 映射的副本。 |
| Names | - | []string | 返回LabelSet中标签名称的所有名称。 |
| Values | - | []string | 返回LabelSet中值的列表。 |
方法是针对某种类型数据的,在模板中可以直接使用或者用 | 方法名称 的方式使用。
字符串的功能
| 功能名称 | 可传递的参数 | 返回值 |
|---|---|---|
| title | string | strings.Title, 将每个单词的首字母大写。 |
| toUpper | string | strings.ToUpper, 全部转为大写 |
| toLower | string | strings.ToLower, 全部转为小写 |
| trimSpace | string | strings.TrimSpace,. 删除两端的空格、Tab 或回车等空白字符 |
| match | pattern, string | Regexp.MatchString. 使用Regexp匹配字符串。 |
| reReplaceAll | pattern, replacement, text | Regexp.ReplaceAllString Regexp替换,未固定。 |
| join | sep string, s []string | strings.Join, 将一个字符串的切片 s 中的每个元素拼接成一个字符串。 |
| safeHtml | text string | html/template.HTML, 将字符串标记为不需要自动转义的HTML。 |
| stringSlice | …string | 返回一个字符串的切片。 |
可以提供一个包含命名模板的文件,然后由 Alertmanager 加载这些模板,这样可以编写可跨行的、更复杂的模版。
假设创建一个文件 /etc/alertmanager/template/myorg.tmpl ,并在其中创建一个名为“slack.myorg.txt”的模板:
{{ define "slack.myorg.text" }}https://internal.myorg.net/wiki/alerts/{{ .GroupLabels.app }}/{{ .GroupLabels.alertname }}{{ end}}
在 alertmanager.yml 配置文件中引用并使用命名模板:
global:
slack_api_url: ''
route:
receiver: 'slack-notifications'
group_by: [alertname, datacenter, app]
receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#alerts'
text: '{{ template "slack.myorg.text" . }}'
templates:
- '/etc/alertmanager/templates/myorg.tmpl'