监控企业微信机器人接口不能依赖对方提供 dashboard,需要在调用方服务器上做日志记录和状态码检查,并自行计算成功率指标。
先说结论:企业微信机器人是单向 Webhook 接口,官方不提供调用方视角的成功率统计,必须自己在业务代码中拦截响应并落盘。
- 适合:有自建日志系统或使用 APM 监控团队的场景
- 先准备:确认 webhook 密钥保管安全,调用代码有写入日志权限,已安装监控客户端(如 Prometheus Client)
- 验收:发送测试消息后,能在本地或监控平台查到对应的 HTTP 状态码、errcode 及成功率面板
核心代码实现
不要直接在业务代码里散乱调用 HTTP 客户端。建议封装统一发送函数,处理超时、重试、日志脱敏和指标上报。以下以 Python 为例:
import requests
import logging
import time
from prometheus_client import Counter, Histogram
# 定义监控指标
wecom_send_total = Counter('wecom_send_total', 'Total WeCom sends', ['key_suffix'])
wecom_send_success = Counter('wecom_send_success', 'Successful WeCom sends', ['key_suffix'])
request_duration = Histogram('wecom_request_duration_seconds', 'Request latency')
logger = logging.getLogger(__name__)
def send_wecom_msg(webhook_key, content):
url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={webhook_key}"
key_suffix = webhook_key[-4:] if len(webhook_key) >= 4 else "****"
start_time = time.time()
try:
resp = requests.post(url, json={"msgtype": "text", "text": {"content": content}}, timeout=5)
resp_json = resp.json()
errcode = resp_json.get("errcode", -1)
# 记录日志(密钥脱敏)
logger.info(f"WeCom send status={resp.status_code}, errcode={errcode}, key={key_suffix}")
# 上报指标
wecom_send_total.labels(key_suffix=key_suffix).inc()
if resp.status_code == 200 and errcode == 0:
wecom_send_success.labels(key_suffix=key_suffix).inc()
else:
logger.warning(f"WeCom failed: {resp_json}")
except Exception as e:
logger.error(f"WeCom request exception: {str(e)}, key={key_suffix}")
wecom_send_total.labels(key_suffix=key_suffix).inc()
finally:
request_duration.observe(time.time() - start_time)
成功率指标计算
有了上述指标后,可以在监控系统中计算成功率。成功率并非接口直接返回,而是通过指标聚合得出。
1. Prometheus 查询示例
计算最近 5 分钟的成功率:
sum(rate(wecom_send_success[5m])) / sum(rate(wecom_send_total[5m]))2. 日志统计分析
如果使用 ELK 或 Loki,可以通过查询日志中 errcode=0 的比例来估算。例如 Lucene 查询语法:
message:"WeCom send" AND errcode:0对比总日志量即可得出大致成功率。
验证与排查
部署代码后,需验证监控是否生效:
1. 日志验证
手动触发一次业务通知,去服务器日志目录(如 /var/log/myapp/)搜索关键词 WeCom。确认日志里是否有完整的响应体记录,且密钥是否已脱敏(只显示后 4 位)。
grep "WeCom send" /var/log/myapp/app.log | tail -n 52. 异常路径验证
故意填错一个 key,观察日志是否记录了 60008 等错误码,同时确认监控面板上的总请求数增加但成功数未增加。
3. 指标面板验证
在 Grafana 或其他监控面板上查看成功率曲线,确保数据有波动而非一条直线。
常见坑
1. 频率限制误判
官方文档明确每个机器人每分钟最多发送 20 条消息。如果业务突发量大,容易触发 45009 错误。不要在循环里直接调用,建议加本地队列或令牌桶控制。
2. 密钥泄露
日志里千万不要明文打印完整的 webhook key。一旦泄露,别人能冒充你的机器人发消息。只记录后 4 位用于区分即可。
3. 超时设置过短
企业微信接口偶尔会有网络波动,HTTP 超时建议设置在 5 秒以上。如果设置太短,容易把正常波动误判为失败,导致日志噪音过大。
参考来源
- 企业微信官方文档,标题:"群机器人",URL:https://work.weixin.qq.com/api/doc/90000/90136/91770
- 企业微信官方文档,标题:"全局错误码说明",URL:https://work.weixin.qq.com/api/doc/90000/90136/90280