可观测性 vs 传统监控
2015 年,Netflix 的工程师在排查一个影响全球用户的播放故障时,花了整整 4 个小时。事后复盘发现:他们有 200 多个监控仪表盘、几千条告警规则,但就是没有人能在第一时间看清「用户的播放请求到底卡在了哪里」。
这个故事在 SRE 圈子里流传很广,因为它揭示了一个深刻的问题:监控越来越多,但故障定位却越来越难。这不是工具不够,而是监控的思路从根子上就错了。
传统监控的本质假设
传统监控(Monitoring)建立在一个假设之上:你知道什么会出问题。你根据历史经验,定义一些关键指标(CPU、内存、磁盘、QPS),设定阈值,超过就告警。这种方式在系统简单、变化缓慢的时代工作良好。
但微服务架构打破了这些假设:
故障模式无法预设。在一个由 100 个微服务组成的系统中,服务之间的依赖关系形成了一个复杂的网络。一个服务的故障,可能因为不同的依赖路径,表现出完全不同的症状。你无法为所有可能的故障模式预设告警。
告警点不等于根因点。当一个告警触发时,它告诉你的是「某个指标超标了」,而不是「用户受到了什么影响」。比如:数据库连接池耗尽的告警,触发的是应用服务器的 CPU 告警——因为线程都在等待连接。告警只告诉你 CPU 高,根因却在数据库。
系统行为不可预测。现代分布式系统的行为往往是涌现性的——单个服务都没问题,但它们之间的交互产生了你从未想过的故障模式。这类问题无法通过预设阈值来发现。
可观测性的本质假设
可观测性(Observability)建立在一个完全不同的假设上:你不知道会发生什么,但你收集了足够的数据,任何问题都能被事后还原。
这个概念来自控制理论。一个系统如果具备可观测性,意味着你只需要观察它的外部输出,就能推断出它的内部状态。放到软件工程中,就是:只要日志、指标、链路数据足够全,你就能回答任何关于系统行为的「为什么」。
两种思路的本质区别:
从三个维度对比
1. 数据收集方式
传统监控采用拉取(Pull)或推送(Push)模型,但数据是预定义的。监控项在系统设计阶段就固定了,新增指标需要修改配置。
可观测性也用 Pull/Push 两种模型,但数据是按事件采集的。每个请求、每次调用、每个错误都会产生数据。指标是数据聚合的结果,日志和链路是数据的原始形态。
这意味着:系统架构变化时,监控数据仍然能收集。可观测系统关心的是「发生了什么」,而不是「哪个指标超标了」。
2. 故障发现能力
传统监控能发现你预设的故障类型。但以下问题无法被发现:
- 性能退化:接口 P99 从 50ms 逐步上升到 200ms,但从未超过你的 500ms 阈值
- 错误模式:5xx 错误率没有大幅上升,但 4xx 错误率异常飙升(可能是恶意请求)
- 局部故障:整体可用性正常,但某个特定用户群体(比如付费用户)遇到了问题
可观测性通过关联分析发现这些问题:延迟分布的变化可以在链路数据中看到,错误模式可以通过日志聚合分析发现,局部故障可以通过标签分解定位。
3. 故障定位效率
这是两者差距最大的地方:
传统监控的定位路径:告警 → 经验猜测 → 逐台服务器查看日志 → 拼凑因果关系。平均定位时间:30 分钟到数小时。
可观测性的定位路径:告警(来自黄金指标)→ 点击 TraceID 跳转链路 → 查看慢 Span → 用 TraceID 过滤日志 → 定位根因。平均定位时间:5 到 15 分钟。
这个差距来自一个关键能力:TraceID 串联。在可观测系统中,任何一条数据都可以追溯到请求级别,定位不需要靠猜测和拼凑。
两种监控的融合
值得注意的是,可观测性不是对传统监控的完全替代,而是扩展和深化。
传统监控的价值在于容量规划、趋势分析、SLO 合规性报告。这些场景不需要 TraceID,不需要关联分析,只需要聚合数据。Prometheus + Grafana 就能很好完成。
可观测性的价值在于故障定位、根因分析、用户体验分析。这些场景需要跨越指标、日志、链路的关联数据。
最佳实践是两者结合:用传统监控做 SLO 达标率报告和容量预警,用可观测性做故障排查和根因分析。
演进路径
从传统监控演进到可观测性,不需要一步到位。建议路径:
大多数团队处于 Level 2-3,Level 4 是目标。
常见误区
误区一:上了 Prometheus 就是可观测。Prometheus 是指标工具,没有链路追踪和日志关联,只能解决一部分问题。
误区二:可观测性不需要告警。可观测性解决的是定位问题,不是发现问题。告警仍然是必要的,只是告警的触发条件需要从「阈值」升级为「SLO 燃烧率」。
误区三:可观测性可以替代测试和发布流程。可观测性是事后分析工具,不能替代灰度发布和功能开关。
质量判断标准
读完本节后,你应该能够回答:
- 为什么说「监控越来越多,故障定位却越来越难」?传统监控的本质问题是什么?
- 可观测性和传统监控在「核心假设」上的根本区别是什么?
- 在故障定位效率上,可观测性相比传统监控的差距来自哪个关键能力?
- 哪些场景适合用传统监控(容量规划、SLO 报告),哪些场景必须用可观测性?
- 从传统监控演进到可观测性,Level 3(链路追踪)的核心工作是什么?