![]()
去年夏天,PagerDuty发布了一组内部数据:企业级客户的平均故障响应时间中,有34%浪费在"确认谁在值班"这件事上。不是修复问题,是找人。
这串数字背后藏着一个被长期忽视的真相——监控工具买得越贵,盲区藏得越深。Datadog年费动辄六位数,Grafana部署手册厚得像砖头,但事故来临时,值班工程师打开面板的瞬间,往往只看到满屏的"no data"。
值班表指向一个已离职6个月的人
这是监控审计中最荒诞却最高频的场景。某SaaS公司的SRE负责人曾向我复盘一次典型故障:凌晨2点,核心支付接口告警触发,PagerDuty按预案通知"支付通道值班组"。
该组唯一成员三个月前转岗,无人更新排班表。告警在系统中空转47分钟,直到客服被商户投诉电话打爆,人工升级才触达正确的工程师。
事后统计,这47分钟里系统尝试了4轮自动升级,全部指向无效联系人。更讽刺的是,该工程师的账号在离职当天已被禁用——但排班系统的同步逻辑没人管。
审计清单的第一项就该是这个:逐条检查所有升级策略(escalation policy)的末端是否指向活人。具体动作包括:
• 每个策略是否至少有两级备份?单点失效在人员流动频繁的组织里几乎是必然事件
• 排班表是否存在空窗期?很多团队按周轮换,但交接日的凌晨时段常被漏掉
• 是否有兜底策略?未匹配任何特定规则的服务,告警该流向哪里
Datadog和PagerDuty都提供API查询排班状态,建议用脚本定期扫描"未来30天内无有效响应人"的时间段。这不是过度工程,是买保险。
告警规则在自嗨:响了,但没人收到
Grafana Labs的社区论坛有个经典帖子,标题叫《我的告警明明触发了,为什么Slack没动静》。高赞回复一针见血:你绑定的频道2022年就归档了。
这类故障的隐蔽性在于——监控系统本身运行正常。Datadog的监控器(monitor) dutifully firing,Grafana的告警状态从OK变为Alerting,但通知渠道指向的是数字废墟。
常见尸体包括:已归档的Slack频道、被删除的邮件组、离职员工的个人邮箱、甚至是一个测试用的Webhook地址。监控工具不会主动告诉你"这条通知发给了不存在的人",它们只负责发送。
更隐蔽的是"无数据"状态的监控器。Datadog中,一个监控器如果连续多天处于"no data"状态,往往不是业务稳定,是查询条件失效了。比如监控的指标名在代码重构后被改掉,或者标签(tag)过滤逻辑与新部署不匹配。
审计时需要导出所有监控器的通知目标清单,逐条验证可达性。对于Slack频道,可以调用conversations.info API检查is_archived字段;对于邮件组,发送测试邮件并验证投递状态。
一个实用技巧:给所有监控器设置"元监控"——用另一个监控器来监控"这个监控器上次触发是什么时候"。如果某个关键业务监控超过72小时无状态变化,大概率已经失聪。
面板上的漂亮图表,事故时全是"no data"
2023年某电商大促期间,技术负责人打开"核心交易链路"大盘,准备定位支付成功率下跌原因。结果首页12个面板中,7个显示红色"no data",2个展示的是上周已下线的旧指标。
这个面板上次更新是九个月前。期间经历了两次微服务拆分、一次指标命名规范改造,但没人同步维护可视化层。
面板的腐烂速度远超想象。原因通常是复合的:
• 指标名变更:代码里从http_requests_total改成http_request_duration_seconds_count,面板查询语句没跟进
• 标签漂移:原本按region=cn-north分组,新部署改为availability_zone=bj-1
• 数据源迁移:从Prometheus切到VictoriaMetrics,旧查询语法部分不兼容
• 权限过期:面板绑定的服务账号密钥失效,数据拉取被403拒绝
建议每季度执行一次"面板可用性巡检":由值班工程师随机抽取10个核心面板,模拟事故场景下的使用路径。记录从打开面板到获取有效信息的时间,超过30秒的面板进入整改清单。
真正危险的不是面板报错,是报错被习惯性忽视。当"no data"出现频率太高,工程师会形成肌肉记忆——直接跳过这个面板,靠猜。
那28个没监控的端点,迟早有一个会炸
大多数团队的监控覆盖遵循"显眼包优先"原则:主API、核心数据库、支付网关,这些一上线就配好告警。但业务系统的接口数量通常是监控数的3-5倍,盲区藏在暗处。
典型漏网之鱼包括:
• 内部服务:处理Webhook回调、异步任务队列、数据同步管道
• 管理后台:批量操作接口、数据修复工具、运营配置页面
• 定时任务:账单对账、数据清理、报表生成
• 边缘端点:健康检查接口(常被监控,但只检查"是否200",不检查"返回内容是否正确")、版本探测接口、灰度开关读取接口
某金融科技公司的教训极具代表性:他们的核心交易API有47个监控器覆盖,但一个处理银行间对账的内部端点零监控。该端点在某次证书更新后静默失败,导致连续三天对账数据缺失,最终引发监管问询。
发现盲区的唯一可靠方法是代码与监控的交叉比对。从代码仓库提取所有HTTP端点定义(包括框架路由、API网关配置、服务注册表),与监控工具中的目标列表做差集。
具体实现上,可以解析OpenAPI规范、扫描Kubernetes Ingress资源、或者直接从APM(应用性能监控)工具的自动发现列表导出。目标是建立"端点-监控"的映射表,未覆盖项用红色高亮。
这个工作的阻力通常来自组织层面:谁对"非核心"服务的监控负责?建议把覆盖率纳入CI/CD门禁——新端点合并前必须附带监控配置,否则阻断发布。
数据库监控停在"能ping通"是自欺欺人
Postgres响应TCP连接请求,不代表查询能在合理时间内返回。太多团队的数据库监控停留在可用性层面,对性能拐点毫无感知。
关键指标的分层应该包括:
• 连接层:活跃连接数、空闲连接池耗尽频率、连接等待队列长度
• 查询层:慢查询占比(按P99/P95分层)、锁等待时间、死锁频率
• 存储层:WAL(预写日志)积压、复制延迟、磁盘I/O饱和度
• 业务层:核心表的写入速率、索引膨胀率、VACUUM(垃圾回收)进度
某次审计中,我们发现一个PostgreSQL实例的监控面板只展示了"up=1"。深入排查后,该实例的autovacuum已停用四个月,主表膨胀到原始大小的340%,查询性能在凌晨批量任务时段断崖式下跌——但没有任何告警。
数据库监控的特殊性在于,很多关键信号需要主动查询系统视图(pg_stat_*系列),而非被动接收暴露的指标。建议为每个数据库实例维护一份"深度健康检查"脚本,定期执行并上报结果。
审计不是一次性项目,是持续对抗熵增
监控系统的腐烂是热力学第二定律在技术领域的体现:不投入能量维护,秩序必然退化。人员流动、架构演进、工具升级,每一个变量都在制造新的不一致。
有效的审计机制需要嵌入日常运营:
• 每月自动化扫描:排班表空窗、通知渠道失效、监控器无数据状态
• 每季度人工抽检:随机选取事故复盘,验证监控是否按预期工作
• 每年全面审计:代码与监控覆盖比对、面板可用性测试、告警疲劳度调研
最后留一个开放问题:你们团队最近一次验证"告警能否真正触达值班人"是什么时候?如果答案是"上次事故时",那下一次审计的优先级,或许应该比功能排期更高。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.