Alertmanager按job标签正则匹配分发告警到不同渠道配置方法
问题根因
配置存在两处核心错误,导致所有告警全被路由到pre-dev接收方:
match_re语法完全错误:Alertmanager的match_re字段是键值对映射结构,YAML格式要求为标签名: 正则表达式。你的写法有两个问题:一是在匹配规则前加了-,把match_re从映射结构改成了列表结构;二是把标签和正则的分隔符写成了=而非YAML规定的:,最终导致子路由的匹配规则完全失效。Alertmanager路由默认按顺序匹配、命中即终止,第一个子路由因为没有有效匹配条件,会命中所有进入路由树的告警,所有告警直接发往pre-dev接收方,根本不会走到第二个dev路由。- 根路由配置的默认接收方
mail-receiver-dev没有在receivers列表中定义,属于无效配置,后续如果有告警不匹配任何子路由会直接抛错。 - 正则写法存在误匹配风险:当前dev路由的
.*dev.*会匹配所有包含dev字符的job标签,就算语法正确,也可能因为job名其他位置带dev字符出现错路由。
修复步骤
- 修正
match_re的YAML格式,去掉规则前的-,把=换成:,改成标准键值对写法 - 收紧正则规则,用后缀匹配避免误匹配:pre-dev类job匹配以
-pre-dev结尾的标签值,普通dev类job匹配以-dev结尾的标签值 - 把根路由的默认接收方改成已经定义的合法接收方,用
mail-dev作为兜底即可
修正后的完整配置
global: smtp_smarthost: 'mail.server.com:25' smtp_from: 'dev@server.com' smtp_require_tls: false templates: - '/etc/alertmanager/template/*.tmpl' route: receiver: mail-dev group_by: ['alertname'] group_wait: 3s group_interval: 5s repeat_interval: 1h routes: - receiver: 'mail-pre-dev' group_wait: 10s match_re: job: '.*-pre-dev$' - receiver: 'mail-dev' group_wait: 10s match_re: job: '.*-dev$' receivers: - name: 'mail-dev' email_configs: - to: 'dev-group@server.com' send_resolved: true - name: 'mail-pre-dev' email_configs: - to: 'pre-dev-group@server.com' send_resolved: true
匹配逻辑说明
路由严格按从上到下的顺序执行匹配:
- 告警进入后先匹配第一个子路由,job标签以
-pre-dev结尾的告警直接发往pre-dev邮件组,终止后续匹配 - 未命中pre-dev规则的告警继续匹配第二个子路由,job标签以
-dev结尾的告警发往dev邮件组,终止后续匹配 - 两个规则都不命中的告警,由根路由兜底发往dev邮件组
配置修改完成后,执行
amtool check-config /etc/alertmanager/alertmanager.yml验证语法正确性,确认无报错后重启Alertmanager加载配置即可。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

