如何取消Prometheus Alertmanager邮件告警的分组?
取消Alertmanager邮箱告警分组的实现方案
虽然Alertmanager的核心设计就是做告警分组聚合,但确实有办法实现近似「取消分组」的效果,下面给你两种可行方案:
方法1:用唯一标识强制拆分分组
Alertmanager的group_by是控制分组的核心配置,你可以把每个告警的唯一标识字段加入分组规则,让每条告警单独成组:
- 比如用Prometheus生成的
fingerprint(每个告警的唯一指纹),或者自定义组合标签(比如alertname+instance,确保每个告警唯一) - 配置示例:
route: group_by: ['alertname', 'instance', 'fingerprint'] # 加入唯一标识字段 group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'email-receiver'
这样每条告警都会被单独分组,发送邮件时就是单条告警通知,而非聚合后的分组内容。
方法2:基于时间戳实现动态拆分
如果想靠时间戳实现拆分,你可以通过Prometheus告警规则给每条告警加一个秒级时间戳标签,再把这个标签加入group_by:
- 在Prometheus告警规则里添加时间戳标签:
groups: - name: example-rules rules: - alert: HighCPUUsage expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 90 for: 1m labels: severity: critical alert_timestamp: '{{ time.Now.Unix }}' # 添加当前秒级时间戳 annotations: summary: "High CPU usage on {{ $labels.instance }}"
- 在Alertmanager的
group_by中加入这个alert_timestamp标签:
route: group_by: ['alert_timestamp'] # 按时间戳分组,每个告警时间戳唯一,自然单独成组 group_wait: 0s # 取消等待,立即发送 group_interval: 10s repeat_interval: 1h receiver: 'email-receiver'
这种方式下,每条触发的告警都会有唯一的时间戳标签,强制Alertmanager将其分为单独的组,实现单条告警邮件的效果。
注意事项
- 这么做会大幅增加邮件发送量,可能触发邮件服务器限流,也会加重运维人员的收件负担——这也是Alertmanager默认不推荐取消分组的核心原因。
- 如果用
fingerprint分组,同一告警重复触发时指纹是相同的,重复告警还是会被合并;而时间戳方式每次触发都会生成新标签,重复告警也会单独发邮件,按需选择即可。
内容的提问来源于stack exchange,提问作者Thanos Mourtzoukos
相关产品推荐
相关产品推荐

