通知模版示例
各种告警示例与对应的 Alertmanager 配置文件设置(alertmanager.yml),均使用了 Go 的模板系统。
自定义 Slack 通知
在本示例中,我们自定义了一个 Slack 通知,其中包含指向我们组织内部 wiki 的 URL。该 wiki 提供了如何处理发出的告警的信息。
global: # 可以将此URL放在文件中。 # 示例:`slack_api_url_file: '/etc/alertmanager/slack_url'` slack_api_url: '<slack_webhook_url>'
route: receiver: 'slack-notifications' group_by: [alertname, datacenter, app]
receivers:- name: 'slack-notifications' slack_configs: - channel: '#alerts' text: 'https://internal.myorg.net/wiki/alerts/{{ .GroupLabels.app }}/{{ .GroupLabels.alertname }}'
访问 CommonAnnotations 中的注释
在本示例中,我们通过访问由 Alertmanager 发送的数据中存储的 CommonAnnotations 的summary
和description
,自定义发送给 Slack 接收器的文本。
Alert
groups:- name: Instances rules: - alert: InstanceDown expr: up == 0 for: 5m labels: severity: page # Prometheus 模板在这里应用于告警的注释和标签字段。 annotations: description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' summary: 'Instance {{ $labels.instance }} down'
Receiver
- name: 'team-x' slack_configs: - channel: '#alerts' # Alertmanager 模板在这里应用。 text: "<!channel>summary: {{ .CommonAnnotations.summary }}description: {{ .CommonAnnotations.description }}"
遍历接收到的所有告警
假设现有与前一示例相同的告警,我们可以自定义接收器以遍历接收到的所有告警,打印其各自注释的summary
和description
。
Receiver
- name: 'default-receiver' slack_configs: - channel: '#alerts' title: "{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}" text: "{{ range .Alerts }}{{ .Annotations.description }}{{ end }}"
定义可重用模板
回到第一个示例,我们也可以提供包含命名模板的文件,然后由 Alertmanager 加载,以避免跨多行的复杂模板。首先,创建一个位于 /alertmanager/template/myorg.tmpl
的文件,然后在其内创建一个名为 “slack.myorg.text” 的模板:
{{ define "slack.myorg.text" }}https://internal.myorg.net/wiki/alerts/{{ .GroupLabels.app }}/{{ .GroupLabels.alertname }}{{ end }}
这个配置现在加载了指定名称的模板用于 “text” 字段,并提供了指向自定义模板文件的路径:
global: slack_api_url: '<slack_webhook_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'
这个例子在这篇博客中有更详细的解释。
该文档基于 Prometheus 官方文档翻译而成。