alertmanager是独立于prometheus的告警管理服务,负责接收、去重、分组、抑制和路由告警至邮件、钉钉等渠道;必须单独安装配置,通过systemd托管,且需严格校验smtp参数、label匹配与yaml语法。

AlertManager 必须独立安装,不能靠 Prometheus 自带
AlertManager 不是 Prometheus 的子进程或内置模块,它是个完全独立的服务。Prometheus 只负责“发现告警”,真正“发通知”的是 AlertManager。装错位置、漏启服务、或误以为改完 prometheus.yml 就能发邮件,是新手最常卡住的点。
实操建议:
- 去 https://www.php.cn/link/0b3246fe110a20162bb905e1baa06e50 下载对应架构的 tar.gz 包(如
alertmanager-0.27.0.linux-amd64.tar.gz) - 解压后把
alertmanager二进制文件复制到/usr/local/bin/,确保有执行权限 - 别直接运行裸命令;用 systemd 托管更稳,配置
/etc/systemd/system/alertmanager.service,关键项包括:--config.file=/etc/alertmanager/alertmanager.yml和--web.listen-address=:9093 - 启动后访问
http://localhost:9093,能打开页面且右上角显示 “Status → Configuration” 可读,才算真正跑起来了
邮件发不出?先盯死 smtp_smarthost、auth_username 和 from 三者一致性
QQ/163/126 邮箱发信失败,90% 是因为 smtp_smarthost、smtp_auth_username、smtp_from 这三个字段没对齐。比如用 QQ 邮箱,smtp_smarthost 必须是 smtp.qq.com:587 或 smtp.qq.com:465,端口错一个就 TLS 握手失败;auth_username 和 smtp_from 必须**完全相同**,否则 QQ/163 会静默拒收(错误不报,日志里也看不到)。
实操建议:
-
smtp_require_tls: true对 587 端口;smtp_require_tls: false对 465 端口(实际走 SSL) - 密码字段填的是“授权码”,不是邮箱登录密码——QQ/163/126 后台要单独开通 SMTP 服务并生成授权码
- 测试时在
email_configs里加send_resolved: true,这样恢复通知也能收到,方便确认链路通不通 - 模板里所有 label 引用必须加默认值,例如
{{ .Labels.severity | default "unknown" }},否则某条告警缺severity,整封邮件内容会塌掉
route 配置写错,告警根本进不了 email_configs
AlertManager 的 route 是树状匹配,不是规则列表。一旦某条告警匹配到某个 receiver,就立刻停止向下查找。所以如果 group_by: ['alertname'],但实际告警里根本没有 alertname 这个 label(比如你用的是 job 或 instance),那这条 route 根本不会命中,自然不会走到 email_configs。
实操建议:
- 先用
curl http://localhost:9093/api/v2/alerts查看真实告警数据,确认 label 键名(注意大小写和下划线) -
match是精确字符串匹配,match_re才是正则;比如severity: "warning"要求 label 值**字面等于**warning,多一个空格或大小写不对都失败 - 别把
group_wait设太大(比如 5m),而告警本身只持续 10 秒——它等不到聚合就直接发了,但可能被静默规则拦住,你以为没发,其实是被吞了 - 根 route 的
receiver字段必须指向下面receivers里定义的 name,拼错一个字母(比如写成mailvsmail1)就静默失败
改完 alertmanager.yml 后必须重载,不是改完就生效
AlertManager 默认不监听文件变化,alertmanager.yml 修改后,既不会自动加载,也不会热更新。常见错误是改完配置、systemctl restart 失败,就放弃排查,其实只是忘了开 --web.enable-lifecycle。
实操建议:
- 启动参数里必须加
--web.enable-lifecycle,否则curl -X POST http://localhost:9093/-/reload会返回 404 - 检查配置语法用
amtool check-config /etc/alertmanager/alertmanager.yml,比靠启动报错快得多 - YAML 缩进是硬要求:两个空格和四个空格混用、tab 和空格混用,都会导致
yaml: unmarshal errors,错误信息不指明哪一行,只能逐行查缩进 - 修改后别只 reload —— 先
amtool check-config,再curl -X POST ... /-/reload,最后curl http://localhost:9093/api/v2/status看config_hash是否变了
AlertManager 的路由逻辑和 SMTP 校验是两套独立又咬合的机制,调通其中一个不等于告警能落地;最容易忽略的是:告警 label 名称来自 Prometheus 的 rule_files,而 route 匹配依赖这些 label,中间任何一环命名不一致,整条链路就断在半路,连错误日志都安静得像没发生过。











