如何监控企业微信机器人接口调用成功率与日志

文章导读
监控企业微信机器人接口不能依赖对方提供 dashboard,需要在调用方服务器上做日志记录和状态码检查,并自行计算成功率指标。
📋 目录
  1. A 核心代码实现
  2. B 成功率指标计算
  3. C 验证与排查
  4. D 常见坑
  5. E 参考来源
A A

监控企业微信机器人接口不能依赖对方提供 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 5

2. 异常路径验证
故意填错一个 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