监控告警接入企业微信:群机器人 Webhook 配置与排错
监控告警接入企业微信,最省事的做法是使用群机器人 Webhook:在企业微信群里添加一个机器人,拿到 Webhook 地址,然后在监控系统或脚本里向这个地址 POST 一段 JSON。
不需要企业微信管理员审批应用,也不用配置可信 IP,只要机器人还在群里,消息就能发出去。
下面按零基础可操作的方式,从准备到验证逐步说明。
开始前需要确认的三件事
动手前先确认环境,避免配到一半卡住。
- 企业微信账号权限:你所在的群需要能添加机器人。手机端和桌面端都可以操作,但部分企业可能由管理员限制了群机器人功能,如果找不到入口,先找管理员确认。
- 监控系统版本:本文以通用的 HTTP 告警通道为例。Zabbix 需要 5.0 及以上才自带 Webhook 媒介类型;Prometheus 配合 Alertmanager 使用
webhook_configs。低版本也可以通过脚本调用curl实现。 - 服务器网络:运行告警发送的机器需要能访问
qyapi.weixin.qq.com的 443 端口。内网机器如果出不了外网,需要配置代理,否则请求会超时。
创建群机器人并拿到 Webhook
- 打开企业微信,进入需要接收告警的群聊(建议单独建一个“监控告警”群,避免打扰业务群)。
- 点击群聊右上角的设置图标,找到“群机器人”,选择“添加机器人”。
- 给机器人起一个容易识别的名字,比如“Zabbix告警”,确认后系统会生成一个 Webhook 地址。
- 复制这个地址,格式类似:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
这个地址里的 key 就是身份凭证,等于密码,不要发到公开仓库或截图里。 如果泄露,重新生成一个机器人即可。
用 curl 先验证通道是否通
在配置监控系统之前,先用一条命令确认 Webhook 可用,能把问题范围缩小。
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key' \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "text",
"text": {
"content": "告警通道测试:如果你看到这条消息,说明接入成功。"
}
}'
执行后群里有消息,返回体类似 {"errcode":0,"errmsg":"ok"},说明通道正常。
如果没消息,看返回的 errcode,对照后面的排错部分。
企业微信机器人支持 text、markdown、image、news 等消息类型。
告警场景用 markdown 更清晰,可以加颜色标记级别:
{
"msgtype": "markdown",
"markdown": {
"content": "**告警**\n> 主机:web-01\n> 内容:CPU 使用率超过 90%\n> 时间:2024-01-01 10:00:00"
}
}
markdown 类型支持 info(绿色)、comment(灰色)、warning(橙色)三种颜色,注意颜色值要写在 font color 里。
接入监控系统的两种常见方式
方式一:Zabbix 媒介类型
Zabbix 5.0 及以上在“管理 → 媒介类型”里可以直接导入企业微信 Webhook。
导入后在用户或动作里选择该媒介,填入 Webhook 的 key。
如果版本较老,可以自己写一个媒介类型脚本:
#!/bin/bash
WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"
curl -s -H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$1\"}}" \
"$WEBHOOK"
脚本放在 Zabbix 的 AlertScriptsPath 目录下,赋予执行权限,然后在媒介类型里调用。
方式二:Alertmanager webhook
Prometheus 生态里,在 alertmanager.yml 中增加一个 receiver:
receivers:
- name: 'wechat'
webhook_configs:
- url: 'http://127.0.0.1:8060/webhook'
Alertmanager 本身不直接发企业微信,需要一个中间层把它的 JSON 转成企业微信格式,常用的有 PrometheusAlert 或自己写一个几十行的 Python/Flask 服务。
中间层收到 Alertmanager 的 POST 后,提取告警名、实例、描述,拼成企业微信 markdown 再转发。
容易踩的坑
- 消息体字段写错:
msgtype和对应的内容字段名必须匹配,比如msgtype是text,下面就必须是text.content,写成content顶层字段会报错。 - JSON 转义问题:在 shell 里拼 JSON 时,引号和换行容易出错。建议用
jq生成,或者把消息体写进文件再用curl -d @file.json。 - 频率限制:企业微信机器人每个机器人每分钟最多发送 20 条消息。告警风暴时容易触发限流,建议在监控侧做聚合,比如 5 分钟内同类告警合并成一条。
- 网络与代理:内网机器请求超时,多半是出不了外网。检查
curl -v的输出,确认是否卡在连接阶段,必要时配置https_proxy。 - key 失效:机器人被移出群或重新生成过 key,旧地址就会失效,需要更新配置。
验证与日常检查
接入完成后,建议做三件事确认它真的在工作。
- 主动触发一次真实告警:比如把 CPU 阈值临时调低,看群里是否收到,确认字段和格式符合预期。
- 查看发送端日志:Zabbix 看“报表 → 动作日志”,Alertmanager 看自身日志,确认请求已发出且返回 errcode 为 0。
- 定期检查机器人是否还在群内:人员调整时有人可能顺手把机器人移出群,导致告警静默。可以把“每周发一条测试消息”做成定时任务作为心跳检测。
常见错误码说明
- errcode 93000:Webhook 地址无效或 key 错误,检查地址是否完整复制。
- errcode 40001:消息体格式不对,重点检查 JSON 结构和字段名。
- errcode 45009:接口调用超过限制,检查是否短时间发送过多消息。
- errcode 40014:access_token 无效,但群机器人 Webhook 不涉及这个,如果出现说明你可能用错了接口地址。
监控告警企业微信接入的核心就是 Webhook 加 JSON 消息体这两步,先用 curl 打通,再套进监控系统,遇到问题按错误码排查,基本都能解决。