先说个真实故事。
有一次,一个哥们凌晨两点被电话吵醒,告警说服务不可用。他爬起来一顿操作,最后发现是数据库连接池漏了。但最让他崩溃的不是故障本身——而是故障其实在晚上十点就开始有苗头了,数据库慢查询一点点增加,连接数一点点爬升,如果当时有人看一眼监控,十分钟就能解决。
但没有。所有人都睡着了,直到线上炸了。
这不是个例。我见过的90%的团队,不是没有监控,而是监控形同虚设——装了一堆 Dashboard,P99延迟、QPS、错误率全都有,但真正出事了照样不知道。
问题在哪?
监控不是装了就完事的
很多人以为监控就是装个 Prometheus + Grafana,配几个指标,然后以为就安全了。但真正的可观测性不是这么玩的。
三个维度:
Metrics(指标)——告诉你"发生了什么"。比如每秒请求数、CPU使用率、错误率。但你不知道是谁、为什么。
Logs(日志)——告诉你"具体细节"。但数据量大了之后,查询慢,而且关联性差。
Traces(链路追踪)——告诉你"请求的一生"。从用户发起请求,到每一个微服务的调用链,哪个环节慢了,清清楚楚。
但大多数团队的现状是:Metrics 有一堆,Logs 有一堆,Traces?对不起,没装。
然后出事了就开始"盲猜"——看日志猜,看监控猜,最后拉会讨论猜。
链路追踪才是被低估的那个
我之前带过一个项目,线上有个接口偶尔超时,但 Metrics 显示一切正常,QPS 稳定,CPU 正常,错误率基本为零。你猜怎么着?
最后是链路追踪救了我们。一个请求内部调用了三个服务,其中一个服务每次都要等一个第三方接口,耗时 800ms,但这个第三方接口平时响应很快,只有在特定条件下才会变慢。
如果没有链路追踪,这种偶发的、局部的、只影响部分请求的慢,你怎么查?靠日志猜?靠经验蒙?
链路追踪的核心价值就在这:它把一次请求的完整生命旅程记录下来,哪个节点慢,一目了然。
主流方案:
Jaeger——CNCF 毕业项目,Uber 开源,入门简单,UI 友好。
Zipkin——Twitter 开源,轻量级,适合中小规模。
SkyWalking——国产之光,对 Java 生态支持极好,还有自动探针。
OpenTelemetry——未来的趋势,一次接入,多后端可插拔,现在是万物皆可 OTel。
告警的正确姿势
光有监控不够,还得有告警。但告警这事儿,90% 的团队做的一塌糊涂。
两个极端:
告警狂魔——装了一百个告警规则,稍微风吹草动就发短信,结果真正的告警来了没人看,全当噪音了。
沉默的羔羊——只装了 CPU 100% 这种基础告警,等于没装,因为等你收到这种告警的时候,服务已经挂了。
正确的告警应该是这样的:
1. 关键指标,适度阈值——比如 P99 延迟超过 500ms 告警,不要等 CPU 100% 了才告警。
2. 趋势告警 > 阈值告警——"过去 5 分钟错误率上升了 50%"这种趋势告警,比"错误率达到 5%"更有意义。
3. 告警分级——严重、警告、提示,不同级别走不同的通知渠道。严重问题电话打过来,提示问题发个 Slack 就行。
4. 告警要能自愈——比如连接池耗尽,你告警了,人肉去重启服务,下次还会发生。好的做法是用自动化脚本做初步处理,比如自动重启异常容器、自动扩容。
真实踩坑:一个慢查询的追凶之旅
说个我亲眼见过的案例。
线上有个接口,平常响应时间 50ms,偶尔会飙到 2-3 秒。团队查了一周,日志没发现异常,数据库慢日志也没有,CPU 和内存都正常。
最后怎么查出来的?
上了链路追踪后发现,这个接口内部调用了一个第三方天气 API,而这个 API 在某些地区部署的节点不稳定,偶尔会超时。但更坑的是,代码里这个调用的超时设置是 5 秒——也就是说,每次这个第三方抽风,请求就会卡住 5 秒。
解决方案很简单:把超时从 5 秒改成 500ms,加重试。
但问题的关键是——没有链路追踪,你根本不知道那个慢的环节在哪。你只能对着自己的代码干瞪眼,然后开始"代码直觉"式的猜测。
可观测性建设的三个阶段
如果你现在监控系统还是一片空白,别想着一步到位。从这三个阶段来:
第一阶段:基础设施监控——CPU、内存、磁盘、网络,这是底座,没有这个一切都免谈。
第二阶段:应用层监控——QPS、延迟、错误率、活跃请求数。这一层能让你知道服务是否活着。
第三阶段:链路追踪——接入 OpenTelemetry,追踪请求的全链路。这一层能让你知道服务为什么慢、哪里慢。
大多数团队,连第一阶段都没做好,就想着搞链路追踪、本地调试。基础不牢,地动山摇。
最后说两句
可观测性这件事,说重要所有人都说重要,但真正投入资源做的团队,10 个里面不到 2 个。
为什么?因为它不直接产生业务价值。你加了一个链路追踪,老板问这能带来多少用户?能多赚多少钱?你答不上来。
但如果你问:服务挂了才知道和提前十分钟知道,损失差多少?答案就清晰了。
可观测性不是成本,是保险。你希望它永远不用,但你必须得有。
下次凌晨两点被电话吵醒的时候,你就会感激这套系统了——虽然你可能还是得爬起来,但至少你知道该往哪走了。
PS:如果你现在还在用"看日志猜问题"的方式开发,我建议你把这篇文章转发给你们领导,然后问一句:咱们什么时候能上链路追踪?
PPS:别问我为什么不提 Datadog,问就是穷。