如何在Prometheus中为告警设置多值标签以指定接收人群?
嘿,这个定向告警的需求在Prometheus生态里太常见了!我之前帮团队搭建告警系统时也遇到过一模一样的问题——确实,Prometheus的单个标签只能存单一字符串值,没法直接塞多个团队进去,但咱们有好几种靠谱的解法,我给你详细说说:
方案1:在告警规则中添加目标团队标签
最直观的方式是在Prometheus的告警规则里,给不同服务的告警打上目标团队的组合标签(用逗号分隔多个团队),然后在Alertmanager里通过模板解析这个标签来分发告警。
比如在你的prometheus/rules.yml里配置告警规则:
groups: - name: service_down_alerts rules: # 招聘团队专属服务的down告警 - alert: ServiceDown expr: up == 0 and service =~ "^recruit-.*" for: 5m labels: severity: critical target_teams: "recruiters" annotations: summary: "招聘服务 {{ $labels.service }} 已宕机" description: "{{ $labels.service }} 持续宕机超过5分钟,请排查" # 销售团队专属服务的down告警 - alert: ServiceDown expr: up == 0 and service =~ "^sales-.*" for: 5m labels: severity: critical target_teams: "sales" annotations: summary: "销售服务 {{ $labels.service }} 已宕机" description: "{{ $labels.service }} 持续宕机超过5分钟,请排查" # 需要同时通知招聘和销售的service1告警 - alert: ServiceDown expr: up == 0 and service == "service1" for: 5m labels: severity: critical target_teams: "recruiters,sales" annotations: summary: "核心服务 service1 已宕机" description: "service1 持续宕机超过5分钟,招聘和销售团队请关注"
然后在Alertmanager的配置里,用模板拆分target_teams标签来发送邮件:
receivers: - name: 'multi-team-alert' email_configs: - to: '{{ range split $labels.target_teams "," }}{{ . }}@yourcompany.com{{ end }}' subject: '[告警] {{ .Annotations.summary }}' html: '{{ .Annotations.description }}' route: group_by: ['alertname'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'multi-team-alert'
方案2:用Alertmanager路由树实现多团队分发
如果不想修改Prometheus的告警规则,也可以直接在Alertmanager里通过**路由规则+continue: true**来实现同一个告警发给多个团队。
首先定义各个团队的接收者:
receivers: - name: 'recruiters-team' email_configs: - to: 'recruiters@yourcompany.com' subject: '[招聘团队告警] {{ .Annotations.summary }}' - name: 'sales-team' email_configs: - to: 'sales@yourcompany.com' subject: '[销售团队告警] {{ .Annotations.summary }}' - name: 'vendor-team' email_configs: - to: 'vendors@yourcompany.com' subject: '[供应商告警] {{ .Annotations.summary }}'
然后配置路由树,利用continue: true让告警匹配多个路由:
route: group_by: ['alertname'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'default-receiver' # 可选,默认接收者 routes: # service1告警同时发给招聘和销售 - match: service: 'service1' receiver: 'recruiters-team' continue: true # 开启后,告警会继续匹配后续路由 - match: service: 'service1' receiver: 'sales-team' # 招聘团队专属服务告警 - match_re: service: '^recruit-.*' receiver: 'recruiters-team' # 销售团队专属服务告警 - match_re: service: '^sales-.*' receiver: 'sales-team'
这里的continue: true是关键——默认告警匹配到第一个路由后就会停止,开启这个参数后,会继续往下匹配其他符合条件的路由,从而实现同一个告警发给多个团队。
小技巧:批量匹配服务
如果你的服务命名有规律(比如前缀区分团队),用match_re正则匹配可以减少重复配置,比如service: '^recruit-.*'就能匹配所有招聘团队的服务,不用逐个写service名称。
这两种方案都能完美解决你的需求,具体选哪种看场景:如果服务和团队的对应关系很少变动,方案1更简洁;如果需要经常调整告警接收规则,方案2的路由配置更灵活。
内容的提问来源于stack exchange,提问作者je table

