可观测性的三大误区:日志、指标和追踪都不是答案

博客分类: 

当你的生产系统在凌晨两点宕机时,你打开监控面板,看到的是什么?是满屏的红色告警?是上下跳动的 CPU 曲线?还是密密麻麻的错误日志?

如果你的答案是"以上都有",那么恭喜你,你可能正在经历可观测性实践中最常见的困境:拥有大量数据,却无法理解系统到底发生了什么

过去五年,可观测性(Observability)从一个新兴概念发展成了行业热词。OpenTelemetry 成为 CNCF 的明星项目,eBPF 技术让内核级监控成为可能,各大云厂商都推出了自己的可观测性解决方案。但与此同时,我们也看到了一个悖论:可观测性工具越来越多,系统却越来越难以理解

问题出在哪里?答案可能会让你意外:不是工具不够好,而是我们对可观测性的理解存在根本性偏差。

 

误区一:可观测性 = 日志 + 指标 + 追踪

 

这是最流行的可观测性定义,也是最具误导性的定义之一。

行业内将日志(Logs)、指标(Metrics)、追踪(Traces)称为可观测性的"三大支柱"(Three Pillars),许多公司的可观测性实践也是围绕这三个维度展开的:部署 ELK 收集日志,用 Prometheus 采集指标,用 Jaeger 做分布式追踪。

但这种"支柱思维"带来的第一个问题是数据孤岛

想象一个真实场景:某电商网站的订单支付成功率突然下降。你打开 Grafana 看到支付服务的 P99 延迟飙升,于是去查 Elasticsearch 中的错误日志,发现大量"database connection timeout"。再去 Jaeger 看追踪数据,发现是数据库查询变慢了。但到这里,你仍然不知道根本原因——是数据库负载过高?还是某个慢查询?还是网络问题?

你需要在三个不同的系统中来回切换,手动关联时间戳和请求 ID,像侦探一样拼凑线索。这不是可观测性,这是碎片化的数据考古

第二个问题是维度爆炸

当你开始认真实践"三大支柱"时,你会发现数据量呈指数级增长:
- 每个微服务产生 GB 级别的日志
- Prometheus 的时序数据库存储压力巨大
- 分布式追踪的采样率不得不降到 1% 以下

然后你陷入了一个两难境地:要么花大价钱扩容存储,要么降低采样率、精简日志,从而失去关键信息。最讽刺的是,数据越多,有用的信号越难找到

更深层的问题在于,"三大支柱"本质上是以数据类型为中心的思维方式,而不是以问题为中心的。它假设只要收集了足够多的数据,问题自然会浮现。但实际上,可观测性的核心不是"拥有数据",而是能够提出并回答任何关于系统行为的问题

 

误区二:可观测性是运维团队的事

 

在许多组织中,可观测性被视为运维(Ops)或 SRE 团队的职责。开发团队负责写代码,运维团队负责监控和告警。这种分工看似合理,实际上却是将可观测性外包的危险做法。

问题的根源在于:只有写代码的人,才真正理解代码应该如何被观测

一个典型的反模式是:开发团队交付了一个微服务,运维团队根据通用模板添加了 CPU、内存、QPS 等基础指标监控。上线后一切正常,直到某天凌晨,服务突然开始频繁超时。运维团队看到的是资源使用率正常,但请求延迟异常。他们不知道这个服务的业务逻辑,不知道哪些代码路径是关键的,不知道正常情况下各个组件的交互模式。

这时候只能叫醒开发人员,而开发人员同样茫然——因为他们从未考虑过如何让这个服务可被观测

真正的可观测性需要在设计阶段就融入系统架构:
- 关键的业务逻辑应该主动暴露内部状态
- 异步操作需要可追踪的上下文传播
- 错误处理不应该吞掉有价值的诊断信息
- 性能敏感的代码路径应该有细粒度的计时

这些都不是事后能添加的监控脚本,而是必须在代码层面设计的可观测性契约

另一个被忽视的维度是成本意识

当可观测性成为运维团队的 KPI 时,倾向是"采集一切"——反正存储成本不在开发团队的预算里。但在云原生时代,可观测性的成本可能占到基础设施总支出的 20-30%。一个未经优化的追踪系统,可能比被追踪的服务本身还要消耗更多资源。

开发团队需要理解:每一行日志、每一个指标、每一次追踪,都是有成本的。哪些数据对诊断问题真正有价值?哪些是噪音?这个判断不能外包给运维团队,因为只有开发者知道答案。

 

误区三:可观测性是为了出问题时排查故障

 

这可能是最致命的误区:将可观测性视为"事后诸葛亮"式的故障排查工具。

大多数组织的可观测性实践遵循这样的模式:
1. 系统正常运行时,监控面板无人关注
2. 告警触发时,团队冲进去查日志、看指标、追踪链路
3. 问题解决后,一切恢复平静,直到下一次告警

这种模式的问题在于,它将可观测性降级为被动响应机制,而忽略了可观测性最重要的价值:主动理解系统,预测和预防问题

想象一下,如果医生只在你心脏病发作时才开始监测你的心率和血压,那还叫"健康监测"吗?

真正的可观测性应该让你能够:
- 在用户感知到问题之前,识别出性能下降的早期信号
- 在系统设计阶段,通过模拟和压测验证可观测性的有效性
- 在日常开发中,持续验证代码变更对系统行为的影响
- 在容量规划时,基于真实数据做出决策,而不是拍脑袋

Netflix 的 Chaos Engineering 就是这种思维方式的体现:不是等系统出问题再排查,而是主动注入故障,验证系统的可观测性和恢复能力

更进一步,可观测性应该成为持续改进的反馈循环
1. 通过可观测性数据识别系统瓶颈和异常模式
2. 提出假设并进行实验验证
3. 基于验证结果优化系统设计
4. 更新可观测性策略,监测改进效果

这不是"出问题时排查故障",而是将可观测性作为工程文化的核心

 

那么,可观测性的答案是什么?

 

如果日志、指标、追踪都不是答案,那答案是什么?

答案是:可观测性不是技术问题,而是思维方式问题

我见过花了百万美元构建可观测性平台,却在关键故障时依然束手无策的团队;也见过用开源工具和自研脚本,就能在分钟级定位问题的小团队。区别不在于工具,而在于是否建立了以问题为导向的可观测性文化

这种文化包括三个核心原则:

 

1. 语义优先,而非数据优先

 

不要问"我们应该收集什么数据",而要问"我们需要回答什么问题"。

比如,与其收集所有 HTTP 请求的响应时间,不如明确:我们关心的是哪些关键业务流程的延迟?用户感知的端到端延迟是多少?哪些延迟是可接受的,哪些是不可接受的?

这意味着可观测性指标应该用业务语言定义,而不是技术术语。"支付成功率"比"HTTP 200 占比"更有意义,"库存同步延迟"比"消息队列消费延迟"更直观。

 

2. 上下文优先,而非隔离数据

 

可观测性的价值不在于数据本身,而在于数据之间的关联

一个请求 ID 能串联日志、指标和追踪;一个用户会话能关联前端行为和后端调用;一个部署事件能解释性能突变。这些关联不应该依赖人工拼凑,而应该在数据采集时就被编码进去

OpenTelemetry 的上下文传播(Context Propagation)机制就是这个思路:用统一的语义标签(Semantic Conventions)确保数据在不同系统间的可关联性。

 

3. 实验优先,而非被动等待

 

最好的可观测性实践不是等故障发生,而是主动设计实验来验证系统的可理解性

游戏日(Game Days)、故障演练(Failure Drills)、负载测试(Load Testing)——这些不应该是偶尔进行的活动,而应该是持续的工程实践。在实验中,你会发现现有可观测性的盲点,会学会如何更快地提出假设和验证。

---

 

写在最后:可观测性的终极目标

 

可观测性不是为了拥有完美的监控系统,而是为了在不确定性中获得确定性

现代软件系统的复杂度已经超越了任何单个人的理解能力。我们无法预知所有可能的故障模式,无法提前定义所有需要监控的指标。可观测性的价值在于,当未知的问题出现时,我们有能力通过提问和探索来理解它

这需要的不是更多的工具,而是:
- 开发团队对系统行为的深刻理解
- 将可观测性作为一等公民的架构设计
- 持续实验和改进的工程文化
- 以业务价值为导向的指标体系

如果你的可观测性实践仍然停留在"收集日志、绘制图表、设置告警"的层面,那可能是时候重新思考了:

我们真正想要的不是"被观测的系统",而是"可被理解的系统"。

你的团队准备好了吗?

You voted 2. Total votes: 21

添加新评论