单账号掉线自己重连是一回事,多账号运营时把每个账号的状态管起来是另一回事。账号多了,哪个在线哪个掉线、哪个消息发送成功率在下降,靠人一个个看是看不过来的。要把状态监控做成一套指标加告警加看板的体系。
一、监控指标——在线率之外还要看质量
只监控"在线/离线"太粗。在线只说明连接活着,不代表功能正常。完整的监控要三层指标。可用性指标——在线率、登录态有效期。质量指标——消息发送成功率、接口调用成功率、平均响应时延。异常指标——失败次数、重连次数、告警次数。
三层指标组合才能看出问题。某个账号在线率100%,但消息发送成功率掉到60%,说明连接在但发送有问题,只看在线率是发现不了的。
二、采集与告警分级
指标采集要靠定时任务——每个账号按固定间隔采集一次,写入监控库。采集间隔按成本定,30秒到1分钟比较常见,太频繁采集本身就是负担。
告警要分级,不能一个阈值打天下。提醒级——单次失败,记录不打扰。警告级——连续失败或成功率低于阈值,通知负责人。严重级——账号离线超过阈值或多种指标同时异常,立即通知并触发处理。分级的意义是避免告警疲劳,什么小事都告警,久了就没人看了。
三、看板与趋势分析
指标采集了要看得到。看板分两个视角:实时视角——当前各账号的状态、今日成功率;趋势视角——最近7天的成功率曲线、告警分布。
趋势比单点更有价值。今天成功率90%不算问题,但连续5天从99%降到90%就是问题——趋势能提前暴露劣化,等跌到不能用了再处理成本更高。
账号监控指标体系
指标层 | 具体指标 | 采集间隔 | 告警阈值 |
|---|---|---|---|
可用性 | 在线率、登录态 | 30秒 | 离线超5分钟 |
质量 | 发送成功率 | 1分钟 | 低于90% |
异常 | 失败数、重连数 | 实时 | 连续3次失败 |
账号状态监控实现
class AccountMonitor: def __init__(self): self.metrics_db = MetricsDB() self.alerter = Alerter() self.thresholds = { "offline_minutes": 5, # 离线阈值 "success_rate": 0.9, # 成功率阈值 "fail_streak": 3 # 连续失败阈值 } def collect(self, accounts): # 定时采集:每账号收集三层指标 for account in accounts: metric = { "wxid": account.wxid, "online": self.check_online(account), "send_rate": self.calc_send_rate(account), "latency": self.calc_latency(account), "fail_count": self.count_failures(account), "ts": time.time() } self.metrics_db.insert(metric) self.evaluate(metric, account) def evaluate(self, metric, account): # 告警分级:提醒/警告/严重 if not metric["online"]: offline_min = self.offline_minutes(account) if offline_min > self.thresholds["offline_minutes"]: self.alerter.critical(account, "账号离线") # 严重级 else: self.alerter.notice(account, "账号短暂离线") # 提醒级 return if metric["send_rate"] < self.thresholds["success_rate"]: self.alerter.warning(account, "发送成功率偏低") # 警告级 if metric["fail_count"] >= self.thresholds["fail_streak"]: self.alerter.warning(account, "连续发送失败") def trend(self, wxid, days=7): # 趋势分析:最近N天指标曲线 data = self.metrics_db.query(wxid, days) return { "avg_send_rate": sum(d.send_rate for d in data) / len(data), "offline_count": sum(1 for d in data if not d.online), "alerts": sum(d.alert_count for d in data) }落地建议
指标要分三层——只看在线率会漏掉"连接正常但发送异常"的问题。采集靠定时任务——30秒到1分钟一次,太频繁采集本身是负担。告警要分级——提醒、警告、严重分开,避免什么小事都告警导致没人看。趋势比单点有价值——连续几天的缓慢劣化比单次波动更值得关注。微信侧的账号状态接口和消息发送由Eyun这类个人微信API平台 提供,指标采集、告警和看板在自建服务实现,接口字段以平台开发文档为准。