Alertmanager按标签分组Slack告警失败,求正确配置方法
解决Alertmanager合并不同
grouping_tag告警到单条Slack消息的问题 问题原因
你当前的Alertmanager配置中,子路由的group_by: ['grouping_tag']会将每个不同的grouping_tag值单独划分为一个告警组,所以每条告警会对应一条独立的Slack消息。要合并所有不同grouping_tag的告警,需要将group_by设置为所有目标告警共有的标签,确保所有符合条件的告警被归为同一组。
解决方案
1. 修改Alertmanager路由配置
将子路由的group_by改为所有告警共有的标签(比如alertname和type,这两个标签在你的所有test_alert告警中都是相同的):
route: group_by: ['alertname', 'service_name'] repeat_interval: 10s group_interval: 10s receiver: default routes: - match: type: 'test_alert' receiver: 'slack' group_by: ['alertname', 'type'] # 使用共有的标签,确保所有test_alert合并为一组 group_wait: 1m group_interval: 10s continue: false
2. 调整Slack消息模板
由于现在所有告警被合并到同一组,原模板中{{ .GroupLabels.grouping_tag }}无法获取到值(因为group_by里不再包含这个标签),需要遍历所有告警来展示每个grouping_tag的信息:
receivers: - name: 'slack' slack_configs: - send_resolved: true color: "{{ if eq .Status `firing` }}#ffe12b{{ else }}good{{ end }}" title: "{{ .CommonLabels.alertname }} - {{ .Status | toUpper }}" text: >- {{ if eq .Status "firing" }} 触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} --- {{ range .Alerts }} - 分组标签: {{ .Labels.grouping_tag }} 描述: {{ .Annotations.description }} {{ end }} {{ else }} 恢复时间: {{ .EndsAt.Format "2006-01-02 15:04:05" }} --- 恢复的分组标签: {{ range .Alerts }}{{ .Labels.grouping_tag }} {{ end }} {{ end }}
3. 优化Prometheus告警规则(可选)
你的Prometheus规则中,labels里的grouping_tag: "{{ $labels.grouping_tag }}"是冗余的,因为expr: sum by (grouping_tag) (...)已经自动将grouping_tag标签附加到告警中,可以直接删除这一行:
groups: - name: test alert rules: - alert: test alert for my metric expr: sum by (grouping_tag) (rate(my_metric{}[60s])) == 0 #for: 120s labels: severity: disaster resolv: true type: "test_alert" # 删除冗余的grouping_tag配置 annotations: summary: "test alert title" description: "test text message with {{ $labels.grouping_tag }}"
验证步骤
- 重启Alertmanager使配置生效
- 触发多个不同
grouping_tag的告警,等待group_wait设置的1分钟后,检查Slack是否收到合并后的单条消息
内容的提问来源于stack exchange,提问作者kirgizz
相关产品推荐
相关产品推荐

