prometheus告警推送失败主因是alertmanager与企业微信对接问题,需确保corp_id正确、to_party为数字部门id、服务器ip加入企业微信可信ip白名单,并使用独立utf-8编码的wechat.tmpl模板文件。

服务器半夜宕机没人知道,不是监控没配,而是告警链路断在了最后一步——alertmanager 没连上企业微信,或者连上了但模板写错、corp_id 权限没开。Prometheus 本身不发通知,它只负责“发现异常”,真正推消息的是 alertmanager,而企业微信接收端必须满足三个硬条件:可信 IP、正确 api_secret、且请求体格式符合企业微信 webhook 规范。
Alertmanager 配置里最容易漏掉的三项
很多配置看似跑通,但收不到消息,问题就出在这三处:
-
corp_id必须是「我的企业」页底部显示的 12 位字符串(如wwa9fa8a0ab8180c78),不是企业名称或域名 -
to_party是部门 ID(数字),不是部门名;若填错,消息会静默失败,alertmanager日志里只显示status=400,不报具体原因 - 企业微信后台「应用管理 → 自建应用 → 可信 IP」必须添加
alertmanager所在服务器的公网出口 IP(不是内网 IP),否则请求直接被拦截,连日志都不留
企业微信模板 message 字段必须用 tmpl 文件定义
alertmanager.yml 中的 message: '{{ template "wechat.tmpl" . }}' 不是直接写死的字符串,而是引用外部模板文件。这个 wechat.tmpl 必须单独存在,且路径要和 alertmanager 启动时的 --config.file 相对路径一致。常见错误包括:
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
- 把模板内容直接塞进
alertmanager.yml的message字段里,导致解析失败 - 模板文件编码不是 UTF-8(Windows 编辑后常带 BOM),
alertmanager启动时报parse error - 模板里用了
{{ .Labels.instance }}这类变量,但实际告警没带instance标签(比如规则里没加by (instance)),渲染时字段为空,企业微信拒收
告警规则触发但没推送?先查 alertmanager 的 /status 页面
访问 http://alertmanager-host:9093/status,重点看两块:
- 「Active Alerts」列表里有没有你预期的告警 —— 如果没有,说明
prometheus根本没把告警发过去,检查prometheus.yml里的alerting.alertmanagers.targets是否指向正确的alertmanager地址(注意端口默认是9093,不是9090) - 「Silences」下面有没有误配的静默规则 —— 比如设置了
starts at为未来时间,或匹配了所有alertname却忘了关 - 点进某条活跃告警,看「Receiver」列是否显示
wechat—— 如果显示none,说明路由匹配失败,回去检查alertmanager.yml的route.receiver和receivers.name是否完全一致(大小写敏感)
企业微信机器人 vs 自建应用:选哪个?
别用群机器人(webhook URL 形式),它不支持 to_party、agent_id 等字段,只能发到固定群,无法按部门/人分级告警。值班场景必须用「自建应用」方式,因为:
- 能精确控制发送范围(
to_party或touser) - 支持消息卡片(
msgtype: news)展示指标趋势图链接 - 可设置回调地址做告警确认(比如点击按钮自动标记已处理)
- 企业微信后台能看到每条消息的送达状态,便于事后审计
自建应用的 api_secret 每次重置都会失效,改完务必同步更新 alertmanager.yml 并 reload。










