Alertmanager —— Prometheus 告警的分组、抑制、静默与通知路由中枢

运维监控软件手册 01-指标采集与时序存储 22.5 KB 原文

Alertmanager —— Prometheus 告警的分组、抑制、静默与通知路由中枢

分类:01 指标采集与时序存储 适用:已部署 Prometheus 的环境;单机到多副本 HA 集群 一句话:接收 Prometheus 的 firing 告警,按路由树分组收敛、抑制降噪、静默维护,再分发到邮件/企微/钉钉/Slack/Webhook。 官方:https://github.com/prometheus/alertmanager 授权:Apache License 2.0(开源)

1. 它解决什么问题

痛点 做法
一次故障炸出几百条告警,值班被淹没 group_by + group_wait/group_interval 把同类告警合并成一条通知
不同团队/严重级别要发不同渠道 路由树 routes + matchers 按标签分流到不同 receiver
整机宕机时上面所有服务告警一起响 inhibit_rules 抑制:源告警触发时压制匹配的目标告警
计划内维护、发版窗口不想被叫醒 silence(临时静默)与 time_intervals(固定静默时段)
多副本部署会重复发通知 Gossip 集群同步静默与通知日志(nflog),自动去重
不适合:不采集指标、不评估阈值(由 Prometheus 负责)、不长期存储告警历史、不画图(Grafana)、不做工单闭环/排班升级(需对接 PagerDuty/Opsgenie 或自研 webhook)。它只处理已经产生的告警。

2. 核心概念与架构

术语 含义
Alert Prometheus 推送的告警,含 labels、annotations、StartsAt/EndsAt、generatorURL
Route(路由树) 根 route + 嵌套 routes,按 matchers 逐层匹配,子路由继承父参数
Receiver 一组通知集成(email_configs/webhook_configs 等)的命名集合
Group 按 group_by 标签聚合的告警组,是通知的最小单位
group_wait / group_interval / repeat_interval 新组首条通知等待 30s / 组内变更检查 5m / 重发间隔 4h(默认值)
Inhibition(抑制) source_matchers 命中且 equal 标签相同则压制 target_matchers 告警
time_intervals 定义可复用的静默/激活时段(如夜间、维护窗口);顶层 mute_time_intervals 已弃用
Prometheus  ──rule firing──►  POST :9093/api/v2/alerts
                                    │
                                    ▼
                          ┌─────────────────────────────────────┐
                          │  dispatcher                          │
                          │   ① 路由树匹配 → 选 receiver         │
                          │   ② 按 group_by 分组、等待 group_wait │
                          │   ③ 抑制规则 / 静默 / 时段 过滤       │
                          │   ④ nflog 去重(HA 集群 gossip 同步) │
                          └───────────────┬─────────────────────┘
                                          ▼
        ┌──────────┬──────────┬──────────┬──────────┬────────────┐
      邮件      企业微信     钉钉/Slack   Webhook   PagerDuty/...  │
        └──────────┴──────────┴──────────┴──────────┴────────────┘

要点:Prometheus 只推告警不通知;Alertmanager 只通知不评估规则;两者通过 alerting.alertmanagers 对接。

3. 安装与部署

3.1 环境准备

项 要求
端口 9093/tcp(Web UI / API,必需);HA 集群另需集群通信端口(常见 9094,以 --help 为准)
依赖 Go 单二进制无外部依赖;--storage.path 目录需可写(存 silence/nflog)
时钟 全链路 NTP 同步,静默过期与去重依赖时间一致性
版本 当前为 0.3x 系列,精确版本号以官方最新稳定版为准:https://prometheus.io/download/

3.2 多种安装方式

<VERSION> 为占位符,下载前到官方下载页确认,本文不绑定固定 tag。

# A. 发行版包(版本常滞后,适合实验;包名以仓库为准)
sudo apt install -y prometheus-alertmanager                    # Debian/Ubuntu
sudo dnf install -y prometheus-alertmanager                    # RHEL 系(EPEL),以仓库实际包名为准
# B. 官方二进制 + systemd(生产推荐)
VER=<VERSION>; cd /tmp
curl -LO "https://github.com/prometheus/alertmanager/releases/download/v${VER}/alertmanager-${VER}.linux-amd64.tar.gz"
tar xzf "alertmanager-${VER}.linux-amd64.tar.gz" && cd "alertmanager-${VER}.linux-amd64"
sudo useradd --system --no-create-home --shell /usr/sbin/nologin alertmanager
sudo install -m 0755 alertmanager amtool /usr/local/bin/
sudo mkdir -p /etc/alertmanager/templates /var/lib/alertmanager
sudo chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager
# /etc/systemd/system/alertmanager.service
[Unit]
After=network-online.target
[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/bin/alertmanager \
  --config.file=/etc/alertmanager/alertmanager.yml \
  --storage.path=/var/lib/alertmanager \
  --web.listen-address=0.0.0.0:9093 \
  --web.external-url=http://<host>:9093 \
  --log.level=info
Restart=always
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/var/lib/alertmanager
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload && sudo systemctl enable --now alertmanager
# C. Docker(官方镜像 prom/alertmanager 或 quay.io/prometheus/alertmanager;tag 以官方最新稳定版为准)
docker volume create alertmanager-data
docker run -d --name alertmanager -p 9093:9093 \
  -v /path/to/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro \
  -v alertmanager-data:/alertmanager \
  prom/alertmanager:<VERSION> \
  --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager

⚠️ 不挂 --storage.path 卷,重启会丢静默与去重日志,可能导致维护窗口失效、告警重复通知。

# D. K8s:kube-prometheus-stack 自带 Alertmanager,或 Prometheus Operator 的 Alertmanager CRD
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install <release> prometheus-community/kube-prometheus-stack -n <namespace> --create-namespace
kubectl -n <namespace> get statefulset -l app.kubernetes.io/name=alertmanager

3.3 首次启动与验证

amtool check-config /etc/alertmanager/alertmanager.yml        # 预期:Checking ... SUCCESS
curl -s http://localhost:9093/-/healthy                        # OK
curl -s http://localhost:9093/-/ready                          # OK
curl -s http://localhost:9093/api/v2/alerts | jq 'length'       # 当前告警数(初始 0)
amtool --alertmanager.url=http://localhost:9093 alert query     # 无输出或空列表

4. 配置文件详解

主配置 /etc/alertmanager/alertmanager.yml(容器路径按挂载点,--config.file 可覆盖)。

配置段 / 键 作用 / 默认
global.smtp_from / smtp_smarthost 邮件发件人 / SMTP 主机(含端口,如 smtp.example.org:587)
global.smtp_require_tls 默认 true;⚠️ 内网 SMTP 不支持 TLS 时需显式改 false
route.receiver 根路由的默认 receiver,必填
route.group_by 聚合标签;特殊值 ['...'] 作为唯一标签时完全禁用聚合
route.matchers 匹配器列表,支持 =、!=、=~、!~;match/match_re 已弃用
route.group_wait / group_interval / repeat_interval 默认 30s / 5m / 4h;子路由未设置时继承父值
route.routes / continue 子路由列表;continue: true 才继续匹配后续兄弟路由
inhibit_rules[].source_matchers / target_matchers / equal 源告警命中且 equal 标签相同,则抑制目标告警
receiver 通知集成键 email_configs、webhook_configs、slack_configs、wechat_configs、pagerduty_configs、opsgenie_configs、msteams_configs、telegram_configs、discord_configs、sns_configs、pushover_configs、webex_configs、victorops_configs、rocketchat_configs、mattermost_configs、jira_configs、incidentio_configs(以官方文档为准)
完整可运行最小配置(路由树 + 分组 + 抑制 + 时段 + 多渠道路由):
# /etc/alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_from: "<alert@company>"
  smtp_smarthost: "<smtp_host>:587"
  smtp_auth_username: "<user>"
  smtp_auth_password_file: /etc/alertmanager/secrets/smtp_password
  smtp_require_tls: true
route:
  receiver: default
  group_by: [alertname, cluster]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    - { matchers: ['severity="critical"'], receiver: wecom }
    - { matchers: ['team="db"'], receiver: dba-mail, continue: true }
inhibit_rules:
  - source_matchers: ['alertname="InstanceDown"']
    target_matchers: ['severity="warning"']
    equal: [instance]
time_intervals:
  - name: maintenance
    time_intervals:
      - { weekdays: ['saturday','sunday'], times: [{ start_time: '00:00', end_time: '06:00' }] }
receivers:
  - name: default
    email_configs: [{ to: "<oncall@company>", send_resolved: true }]
  - name: wecom
    wechat_configs:
      - { corp_id: "<corp>", api_secret: "<secret>", agent_id: "<id>", to_user: "@all", message_type: markdown, send_resolved: true }
  - name: dba-mail
    email_configs: [{ to: "<dba@company>" }]
amtool check-config /etc/alertmanager/alertmanager.yml
curl -X POST http://localhost:9093/-/reload        # 或 systemctl reload alertmanager(HUP)

5. 核心使用方法

5.1 amtool 用法(重点)

AM="--alertmanager.url=http://localhost:9093"
amtool check-config /etc/alertmanager/alertmanager.yml                 # 1 校验配置语法
amtool config routes --config.file=/etc/alertmanager/alertmanager.yml  # 2 打印路由树
amtool config routes test --config.file=/etc/alertmanager/alertmanager.yml severity=critical   # 3 测试标签走哪个 receiver(参数以 --help 为准)
amtool $AM alert query                                                  # 4 列出当前活跃告警
amtool $AM alert query alertname="HighCpuUsage"                         # 5 按 matcher 过滤告警
amtool $AM alert add alertname=TestAlert severity=warning instance=<host> # 7 手工推送一条测试告警(验证链路)
amtool $AM silence add --author=<name> --duration=2h --comment='维护窗口' alertname=TestAlert   # 8 创建 2 小时静默
amtool $AM silence add --author=<name> --duration=1d --comment='发版' severity=warning        # 9 按标签静默
amtool $AM silence query                                                # 10 列出静默(含 ID/状态/过期时间)
amtool $AM silence query alertname="HighCpuUsage"                        # 11 按 matcher 查静默
amtool $AM silence expire <silence_id>                                  # 12 提前结束静默
amtool --version ; amtool --help                                       # 14 版本 / 帮助

⚠️ amtool silence expire 接受静默 ID(从 silence query 获取),勿把 matcher 当 ID 传;生产静默务必写 --comment 与合理 --duration。

5.2 HTTP API(v2)

A=http://localhost:9093
curl -s "$A/-/healthy" ; curl -s "$A/-/ready"                          # 1 健康检查
curl -s "$A/api/v2/status" | jq '{cluster, versionInfo, config}'        # 2 状态/配置原文
curl -s "$A/api/v2/alerts" | jq 'length'                                # 3 活跃告警
curl -s -X POST "$A/api/v2/alerts" -H 'Content-Type: application/json' -d '[{"labels":{"alertname":"TestAlert","severity":"warning","instance":"<host>"},"annotations":{"summary":"链路测试"}}]'  # 6 推送测试告警
curl -s "$A/api/v2/silences" | jq '.[] | {id, status, comment}'          # 7 列出静默
curl -s -X POST "$A/api/v2/silences" -H 'Content-Type: application/json' -d '{"matchers":[{"name":"alertname","value":"TestAlert","isRegex":false,"isEqual":true}],"startsAt":"<iso>","endsAt":"<iso>","createdBy":"<name>","comment":"维护"}' | jq '.silenceID'  # 8 创建静默
curl -s -X DELETE "$A/api/v2/silence/<silence_id>"                      # 9 过期静默
curl -sG "$A/api/v2/alerts" --data-urlencode 'silenced=false' | jq 'length'  # 10 未静默告警(参数以官方 API 为准)
curl -X POST "$A/-/reload"                                              # 11 热加载配置
curl -s "$A/metrics" | grep '^alertmanager_' | head                     # 12 自监控指标

5.3 Web UI 与主要 CLI 参数

项 说明
/#/alerts 按组查看活跃告警、标签、静默状态
--config.file=<f> 主配置文件路径
--storage.path=<dir> silence 与 nflog 持久化目录
--web.listen-address=<addr> / --web.external-url=<url> 监听地址 / 外部访问根 URL(影响通知里的链接)
--cluster.listen-address / --cluster.peer / --cluster.advertise-address HA Gossip 集群参数,以 alertmanager --help 为准

6. 告警与通知

规则/阈值在 Prometheus 侧,Alertmanager 只负责分发。最小联动规则示例:

# /etc/prometheus/rules/basic.yml
groups:
  - name: host.rules
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 2m
      - alert: HighCpuUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels: { severity: warning, team: infra }
# Prometheus 侧 alerting 配置(/etc/prometheus/prometheus.yml)
alerting:
  alertmanagers:
    - static_configs:
        - targets: ["<am1>:9093", "<am2>:9093"]    # HA 时列出全部副本,Prometheus 会向所有副本发送

6.1 通知渠道示例

渠道 配置键 关键字段
邮件 email_configs to、from、smarthost、send_resolved;凭据取 global.smtp_*
企业微信 wechat_configs corp_id、api_secret、agent_id、to_user、message_type: markdown
钉钉 webhook_configs 指向群机器人 Webhook(含签名校验时把 sign 拼进 URL),发送 JSON
Slack slack_configs api_url(Incoming Webhook)或 Bot token、channel、title、text
通用 Webhook webhook_configs url / url_file、max_alerts、timeout;HTTP POST JSON,适合自研中转
receivers:
  - name: email
    email_configs:
      - { to: "<oncall@company>", from: "<alert@company>", send_resolved: true, headers: { Subject: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}' } }
  - name: wecom
    wechat_configs:
      - { corp_id: "<corp>", api_secret: "<secret>", agent_id: "<id>", to_user: "@all", message_type: markdown, send_resolved: true }
  - name: dingtalk
    webhook_configs:
      - { url: "<dingtalk_webhook_url>", send_resolved: true, max_alerts: 20 }
  - name: slack
    slack_configs:
      - { api_url: "<slack_webhook_url>", channel: '#<channel>', send_resolved: true, title: '{{ .GroupLabels.alertname }}', text: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}' }

钉钉无原生 receiver,用 webhook_configs 指向机器人即可;模板变量与字段以官方配置文档为准。

6.2 分组 / 抑制 / 静默 / 路由树

route:                                  # 路由树:自上而下匹配,默认只走第一个命中的子路由
  receiver: default
  group_by: [alertname, cluster]         # 分组:同 alertname+cluster 合并成一条通知
  group_wait: 30s                        # 新组首通知等待窗口(等齐同组告警)
  group_interval: 5m                     # 组内新增告警的检查间隔
  repeat_interval: 4h                    # 未变化告警的重发间隔(应 ≥ group_interval)
  routes:
    - { matchers: ['severity="critical"'], receiver: wecom, group_wait: 10s }
    - { matchers: ['team="db"'], receiver: dba-mail, continue: true }   # continue 让后续路由继续匹配
inhibit_rules:                           # 抑制:整机宕机时压制其上的 warning 告警
  - source_matchers: ['alertname="InstanceDown"']
    target_matchers: ['severity="warning"']
    equal: [instance]
time_intervals:                          # 固定静默时段(如周末夜间)
  - name: weekend-night
    time_intervals:
      - { weekdays: ['saturday','sunday'], times: [{ start_time: '00:00', end_time: '06:00' }] }
# route 内用 mute_time_intervals: [weekend-night] 引用;临时静默用 amtool/API,不写进配置文件
机制 作用域 典型参数
分组 同组告警合并通知 group_by、group_wait、group_interval
抑制 源告警压制目标告警 source_matchers/target_matchers/equal
静默 按 matcher 临时屏蔽 amtool silence add --duration、API /api/v2/silences
路由树 按标签选渠道 routes + matchers + continue

6.3 对接链路

Prometheus rule → firing → POST <am>:9093/api/v2/alerts → route 匹配 → 分组等待
→ 抑制/静默/时段 过滤 → nflog 去重 → receiver(邮件/企微/钉钉/Slack/Webhook)→ 值班人
Grafana:① 添加 Prometheus 数据源画大盘;② 添加 Alertmanager 数据源查看告警与静默;
         ③ 也可改用 Grafana 统一告警(Grafana 直接管 contact point,AM 可不再使用)
# 端到端验证:推一条测试告警后观察各段
amtool --alertmanager.url=http://localhost:9093 alert add alertname=LinkTest severity=critical instance=<host>

7. 实战场景

7.1 按 severity/team 分流到不同渠道

目标:critical 发企业微信、db 团队发邮件,其余走默认邮件。步骤:改 route 树 → 校验 → reload → 测试路由 → 验证。

route:
  receiver: default
  group_by: [alertname, cluster]
  routes:
    - { matchers: ['severity="critical"'], receiver: wecom }
    - { matchers: ['team="db"'], receiver: dba-mail }
receivers:
  - { name: default, email_configs: [{ to: "<oncall@company>" }] }
  - { name: wecom, webhook_configs: [{ url: "<wecom_gateway_url>" }] }
  - { name: dba-mail, email_configs: [{ to: "<dba@company>" }] }
amtool check-config /etc/alertmanager/alertmanager.yml && curl -X POST http://localhost:9093/-/reload
amtool config routes test --config.file=/etc/alertmanager/alertmanager.yml severity=critical

验证:amtool config routes test 输出目标 receiver,/#/alerts 显示分组。回滚:恢复备份 alertmanager.yml 后 POST /-/reload。⚠️ 路由树默认只匹配第一个命中项,需要多命中时加 continue: true。

7.2 维护窗口静默

目标:发版 2 小时内屏蔽某批告警,不被打扰。

amtool --alertmanager.url=http://localhost:9093 silence add \
  --author=<name> --duration=2h --comment='发版维护' alertname=HighCpuUsage instance=<host>
curl -s http://localhost:9093/api/v2/alerts | jq '[.[] | select(.status.state=="suppressed")] | length'

验证:匹配告警状态变 suppressed,不再触发通知。回滚:amtool --alertmanager.url=http://localhost:9093 silence expire <silence_id> 提前解除。⚠️ 静默不会自动删除已发通知,务必填 --comment 并设定合理时长。

7.3 用抑制规则消除告警风暴

目标:主机宕机时,只收一条 InstanceDown,压制其上所有 warning 子告警。

inhibit_rules:
  - source_matchers: ['alertname="InstanceDown"']
    target_matchers: ['severity="warning"']
    equal: [instance]
amtool check-config /etc/alertmanager/alertmanager.yml && curl -X POST http://localhost:9093/-/reload
amtool --alertmanager.url=http://localhost:9093 alert add alertname=InstanceDown severity=critical instance=<host>
curl -s http://localhost:9093/api/v2/alerts | jq '[.[] | select(.status.state=="suppressed")] | length'   # ≥1

验证:HighCpuUsage 被标记 suppressed,通知里不再单独出现。回滚:删掉 inhibit_rules 并 reload。⚠️ equal 标签必须两边都存在且相等,否则抑制不生效。

8. 日常运维与故障排查

sudo systemctl status alertmanager --no-pager ; sudo systemctl restart alertmanager
sudo journalctl -u alertmanager -f --no-pager        # 日志走 journald;容器用 docker logs alertmanager
sudo journalctl -u alertmanager --since "1 hour ago" | grep -iE 'error|warn|notify|failed'
curl -s http://localhost:9093/-/healthy ; curl -s http://localhost:9093/-/ready
amtool check-config /etc/alertmanager/alertmanager.yml
现象 原因 处置
完全收不到告警 Prometheus 未配 alerting.alertmanagers 或 9093 不通 curl <am>:9093/-/healthy;curl <prom>:9090/api/v1/alertmanagers 看 active
告警有但通知不发 route 未匹配到 receiver、或全被静默/抑制/时段屏蔽 amtool config routes test;查 /#/silences 与 time_intervals
通知重复轰炸 group_by: ['...'] 禁用聚合、group_interval 太小、HA 未组集群 收敛 group_by;调大间隔;副本互配 --cluster.peer
邮件发不出 smtp_require_tls: true 但内网 SMTP 无 TLS;认证/端口错 核对 smtp_smarthost;用 smtp_auth_password_file;⚠️ 必要时显式 false
配置 reload 不生效 YAML 语法错或用了弃用字段 amtool check-config 定位;match/match_re 换成 matchers
静默不生效 matcher 写错、时间已过期、时区不符 amtool silence query 核对 ID/状态;检查 startsAt/endsAt 与时钟
HA 各副本重复通知 副本间未互通集群端口,nflog 不同步 放通集群端口;每个副本 --cluster.peer 列出其他副本(参数以 --help 为准)

9. 性能、容量与高可用

通知频次 ≈ 告警组数 / repeat_interval  + 组内变更触发次数(受 group_interval 限制)
分组数 ≈ 不同 group_by 标签组合数;group_by 维度越细,组越多、通知越多
--storage.path 需持久化:保存 silences 与 notification log,重启不丢去重状态
调优项 建议
group_by 用 alertname + cluster/job 等低基数字段,勿用 instance 全展开
group_wait / group_interval 30s / 5m 起步;抖动业务可略调大以收敛
repeat_interval ≥ group_interval,否则会被向上取整;关键告警 1h~4h
--storage.path 放持久化卷,定期备份(见第 10 章)
HA 方案:部署 ≥2(推荐 3)个 Alertmanager 副本,各自配置相同,启动时用 --cluster.peer 互指(集群端口/参数以 alertmanager --help 为准),通过 Gossip 同步 silence 与 nflog 实现去重;Prometheus 的 alerting.alertmanagers 列出全部副本地址,任一副本收到告警都会扩散到集群。⚠️ 副本间集群端口必须互通,否则各副本独立通知会重复发送。大规模可按业务拆多套 AM,各自被不同 Prometheus 指向。
alertmanager_alerts                                       # 当前活跃告警数
alertmanager_notifications_total{integration="email"}      # 各渠道发送量
alertmanager_notifications_failed_total                   # 发送失败(渠道故障,必配告警)
alertmanager_cluster_members                             # 集群成员数,低于副本数即分裂
alertmanager_config_last_reload_successful                # 最近一次 reload 是否成功(0 要排查)

10. 安全加固、备份与升级

# 暴露面收敛:9093 只对 Prometheus/Grafana/运维网段,集群端口只在副本间
sudo ufw allow from <prom_cidr> to any port 9093 proto tcp && sudo ufw deny 9093/tcp

认证鉴权与 TLS:生产用 nginx 反向代理补 basic_auth + TLS;组件原生 --web.config.file 支持情况以官方文档为准。 最小权限:专用 alertmanager 系统用户 + nologin;systemd 加 NoNewPrivileges/ProtectSystem=strict/ReadWritePaths 只放 --storage.path;SMTP/企微/webhook 凭据用 *_file 引用并 chmod 0600;⚠️ 勿把 webhook token 写进可被 /api/v2/status 读到的明文配置(用 url_file/api_secret_file 等文件型字段)。勿公网开放 9093 与 /-/reload。 备份与恢复(配置 + 模板 + 持久化状态):

sudo tar czf /backup/alertmanager-conf-<date>.tar.gz \
  /etc/alertmanager/ /etc/systemd/system/alertmanager.service
sudo systemctl stop alertmanager && \
sudo tar czf /backup/alertmanager-state-<date>.tar.gz -C /var/lib/alertmanager . && \
sudo systemctl start alertmanager                     # 冷备 silence/nflog
# 恢复:停服 → 解包到原路径 → 修正属主 → 启动
sudo tar xzf /backup/alertmanager-conf-<date>.tar.gz -C /
sudo tar xzf /backup/alertmanager-state-<date>.tar.gz -C /var/lib/alertmanager
sudo chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager
sudo systemctl restart alertmanager && amtool check-config /etc/alertmanager/alertmanager.yml

升级顺序:① alertmanager --version 记录 → ② 备份配置与 --storage.path → ③ 预发 amtool check-config + amtool config routes test 回归路由 → ④ 保留旧二进制 cp /usr/local/bin/alertmanager /usr/local/bin/alertmanager.old → ⑤ 逐副本滚动停服、替换二进制、启动、/-/ready + /api/v2/status 验证 → ⑥ 观察 24h 通知与集群成员 → ⑦ 回滚:换回 alertmanager.old 并恢复备份。⚠️ 跨版本先看官方 Release notes:match/match_re、mute_time_intervals 等字段可能弃用或行为变更。

11. 常见坑

  1. 用 match/match_re 写路由:已弃用 → 一律用 matchers(=/!=/=~/!~)。
  2. group_by: ['...'] 当成万能聚合:它其实是禁用聚合,一条告警一条通知 → 用真实标签组合。
  3. 路由树只走第一个命中:后面的兄弟路由被跳过 → 需要多命中时加 continue: true。
  4. HA 副本没互配 --cluster.peer:各副本独立发通知,重复轰炸 → 放通集群端口并互指同伴。
  5. 忘记 expire 静默:维护结束告警仍被屏蔽 → amtool silence query 定期巡检,静默必填 --comment 与 --duration。
  6. smtp_require_tls 默认 true:内网 SMTP 不支持 TLS 导致邮件全失败 → 显式设 false 或改用支持 STARTTLS 的网关。
  7. 凭据明文写配置:/api/v2/status 会暴露配置原文 → 用 *_file 字段 + chmod 0600。
  8. --storage.path 不持久化:容器重启丢静默与 nflog → ⚠️ 必须挂卷,否则维护窗口失效。

12. 速查表

类别 项 值 / 命令
默认端口 Web/API 9093
校验 配置 amtool check-config <file>
告警 查询 amtool --alertmanager.url=<url> alert query
静默 创建/查询/解除 amtool ... silence add --duration=2h --comment=<c> <matcher> / silence query / silence expire <id>
健康 存活/就绪 /-/healthy、/-/ready
热加载 配置 curl -X POST http://localhost:9093/-/reload(或 HUP)
API 推送告警 POST /api/v2/alerts(JSON 数组)
API 静默 GET|POST /api/v2/silences、DELETE /api/v2/silence/<id>
配置键 分组 group_by、group_wait(30s)、group_interval(5m)、repeat_interval(4h)
配置键 路由 route、matchers、routes、continue、receiver
通知 常用集成 email_configs、wechat_configs、webhook_configs、slack_configs
指标 告警/失败 alertmanager_alerts、alertmanager_notifications_failed_total
指标 集群/配置 alertmanager_cluster_members、alertmanager_config_last_reload_successful
日志 查看 journalctl -u alertmanager -f / docker logs alertmanager
服务 管理 systemctl start|stop|restart|status alertmanager

13. 选型建议与同类对比

维度 Alertmanager Grafana Alerting PagerDuty / Opsgenie 自研 Webhook 脚本
定位 告警路由与通知中枢 大盘内一体化告警 商业 On-call / 排班升级 自定义分发逻辑
告警源 Prometheus 为主(也可用 API 推) 多数据源(Prom/Loki/SQL) 接收各类集成事件 任意
分组/抑制/静默 原生完整(路由树 + inhibit + silence) 有分组与静默,抑制能力较弱 有升级策略与事件聚合 需自己实现
通知渠道 邮件/企微/钉钉/Slack/Webhook 等十几种 Contact point 种类多 电话/短信/App 推送 取决于代码
最适 已用 Prometheus、要强降噪与路由 已用 Grafana、告警与大盘一体 需要排班/电话升级/合规 有特殊分发或工单联动
选它:已用 Prometheus 且需要分组收敛、抑制、静默、多渠道路由与 HA 去重;希望告警评估与通知解耦、配置可 amtool 校验并版本化管理。
别选:没有 Prometheus 且告警源是日志/多数据源(考虑 Grafana Alerting)、需要电话/短信排班升级且预算允许(接 PagerDuty/Opsgenie)、只需要极简"一条告警发一个群"(一个 webhook 更轻)。常见组合:Prometheus 规则 → Alertmanager 降噪路由 → 企业微信/钉钉 Webhook;再把 PagerDuty 作为 critical 的升级通道。

14. 参考链接

<VERSION> / <xxx> 为占位符;当前为 0.3x 系列,精确版本号、下载文件名与镜像 tag 以官方最新稳定版为准;--cluster.*、--web.config.file 等参数以 alertmanager --help 与官方文档为准。

Alertmanager —— Prometheus 告警的分组、抑制、静默与通知路由中枢 - 知识库 - 起航社区