监控告警藏在深夜值班的每一次弹窗里
上周四凌晨两点十七分,我在南京出租屋的床上弹起来。
枕头边的玻璃杯被震得晃出半圈水痕。
不是微信消息,是那个被我设成最高优先级的告警APP,音量拉到最大,震得整个床头柜都在响。我刚啃了半袋盐水鸭,睡了不到三个小时,脑子还转不过弯,第一反应是骂——上周刚把主库的磁盘阈值从85%调到90%,就怕半夜瞎叫,合着白改了?
摸过电脑按亮屏幕,才发现是从库的磁盘满了。我之前改阈值的时候,只动了主库的配置,从库的规则完全忘在脑后。群里十几个人在线,没人说话。
运维值班手机收到告警弹窗截图
大家慢慢就养成了条件反射:看到弹窗先扫一眼标题,不是标着P0的直接划走,甚至有同事把告警群设成了免打扰——毕竟总不能为了几条没用的通知,熬到后半夜对吧?
说实话,这种情况真的太普遍了。我见过太多团队,刚搭完监控系统就兴高采烈地把所有能设的告警全打开,CPU、内存、磁盘、网络,恨不得每个指标超1%就叫人,美其名曰“全面覆盖”,最后反而把真正重要的告警给淹了,全是没用的无效触发。

生产数据库磁盘使用率告警阈值配置表
之前我们也踩过坑。刚做告警整改的时候,为了“更灵敏”,把接口响应时间的阈值从500ms降到了300ms,结果一周内弹了上千条告警,全是晚高峰的正常波动。开发直接找我抗议,说他写代码的功夫,手机震了二十次,根本没法集中注意力。
还有个容易被忽略的细节:告警的分级触达机制,不是发个企业微信就完事。P0的告警必须直接打值班电话,不能只发消息——很多人睡熟了根本看不到弹窗;P1的告警发企业微信加短信,二十分钟没人处理就自动升级到主管;P2的告警直接扔群里就行,不用单独打扰任何人。去年有个同行的团队,就是因为P0告警只发了企业微信,值班的人在洗澡没看到,支付系统挂了三个小时,赔了两百多万,这事我到现在都记得。
没人愿意接的告警都是无效噪音
盯着满屏的红色告警条,我后背凉了半分钟。还好从库只是同步延迟了四十秒,没影响主库写入,要是真等业务方打电话过来喊用户下单失败,我这个月的绩效直接打水漂。 其实我们团队早就对告警PTSD了。 去年底我们统计过,一个月收到的3200多条推送里,真正需要人介入处理的,只有17条。剩下的全是边角料:某个边缘静态资源服务器的磁盘到了70%,存的全是三个月前没人看的旧日志;测试环境的服务重启了,告警直接发到了生产群;甚至有一次,是监控服务器自己硬盘满了,发完最后一条告警直接宕机,我们还是等运营反馈用户打不开页面,才知道监控挂了。阈值不是拍脑袋定的生存线
很多人觉得监控告警嘛,就是拉个阈值,超了就发通知,能有多复杂? 真不是。 我之前跟杭州一个做基础架构的朋友聊,他们团队定一个告警规则,要拉上开发、测试、甚至产品开三次会。就拿最普通的磁盘使用率阈值来说,不是越高越好,也不是越低越好。我们最后给核心主库定的告警阈值规则是82%触发P1告警,88%触发P0,为什么?因为82%的时候,还有大概400G的剩余空间,足够我们手动清理旧binlog,或者临时扩容云盘,操作窗口至少有一个半小时;要是等90%再触发,剩下的空间可能撑不过晚高峰的两个小时,连登录服务器清理的时间都没有。