跳到主要内容

排障慢,不一定是日志少,可能只是前端没把 requestId 打出来

阅读需 4 分钟

最近客户端给我发来一条日志,说服务端报错了。

但那条日志里只有“报错了”,没有完整的服务端错误信息,也没有 requestId。结果一个本来几分钟就能定位的问题,我硬是查了很久,最后才发现根因不是代码,而是某个服务根本没发布。

以前我排查这类问题其实很快。因为客户端会把服务端返回的错误信息完整带回来,尤其是 requestId。有了这个 ID,我几乎可以直接去服务端日志里定位到那一次请求。

但这次没有,我只能根据用户名、时间窗口、接口路径、操作类型这些外围信息去反查,效率一下就掉下来了。

这件事让我重新意识到:很多排障效率,不是由“系统有没有能力”决定的,而是由“链路有没有把关键信息交到人手里”决定的。

问题不是没有 requestId,而是没人把它展示出来

很多时候,团队会下意识觉得“客户端没有打印 requestId”只是一个小问题。

但对排障来说,这根本不是小问题。

没有 requestId 的时候,你就只能靠各种旁路信息去猜:

  • 哪个用户触发的
  • 大概是什么时间发生的
  • 调的是哪个接口
  • 是不是同一批请求里的某一个

这种排查方式不是不能用,但非常慢,而且很容易查偏。尤其是线上并发一高,日志一多,定位成本会一下子放大。

更关键的是,这类问题经常不被当成问题。因为系统“还能用”,接口“也正常返回”,所以没人专门排期去修。但真正干活的人会被这种小缺口持续消耗时间。

我设计的 hono-vite-admin,在这条链路上就比较完整

我自己设计的 hono-vite-admin 在这条链路上就考虑得比较完整。

服务端会统一生成 requestId。如果请求报错,错误响应 body 里会直接带上 requestId。同时它还会放到响应 header 的 X-Request-ID 里返回。

这有两个直接好处:

  • 报错时,前端只要把错误信息打出来,就能顺手把 requestId 展示给排障的人
  • 即使请求没有报错,只是“慢”,也可以通过响应 header 里的 X-Request-ID 去服务端日志里反查整条请求链路

这才是一条真正有用的排障链路。

很多系统的问题不是没有日志,不是没有监控,也不是后端没有埋字段,而是这些信息最后没有穿透到最需要它的人手里。

工程效率经常死在这种小细节上

这次让我很有感触的一点是,真正浪费我时间的,并不是那个“没发布的服务”本身,而是排障信息没有闭环。

如果客户端当时能把服务端返回的错误信息和 requestId 一起带出来,我基本上几分钟就能定位。结果现在只能凭一些模糊属性去搜日志,效率自然差很多。

这类细节平时很少有人在意,因为它看起来不算“大需求”,也不会直接影响主流程。但工程效率恰恰就是被这些“没人管的小地方”一点点吃掉的。

说实话,我在公司里经常能感受到这种随意:事情能跑就行,细节没人盯,协作成本也没人算。

这也是为什么很多开源项目反而会给我更好的印象。它们不一定功能更多,但在契约、日志、错误信息、文档和调试体验这些地方,往往更认真。

AI 时代下,工程师至少要有 full-stack 视角

这次我最大的感受不是“前端应该补一下”,而是如果我自己对前后端都足够熟,这种问题本来就应该被顺手消灭掉。

以前前后端分工很细,很多问题会卡在边界上:

  • 后端说接口已经返回了
  • 前端说页面只是按设计展示
  • 测试说功能能用

最后没有人对“这条链路是否真的方便排障”负责。

但在 AI 时代,这种边界正在快速变薄。

现在很多时候,AI 可以直接读后端代码,理解错误结构、header 设计、OpenAPI schema,再顺手把前端调用和展示补齐。以前要跨几个角色沟通的事情,现在一个人加上 AI 就能直接做完。

所以我现在越来越觉得,工程师至少要有 full-stack 视角。未必要每一层都做到专家级,但你得能看懂整条链路,知道问题卡在哪一层,也能把关键的小口子补上。

接口文档不会消失,但二手文档的价值在下降

我现在还有一个越来越强烈的感觉:那种写完就过时、只给人看的二手接口文档,价值会越来越低。

因为 AI 直接读代码、读 schema、读类型定义,很多信息它比人翻 wiki 还快。

但这不代表文档不重要。相反,OpenAPI 这种可以作为一手协议来源的文档会更重要。因为它不只是给人看,还能生成类型、校验请求响应、约束前后端契约。

requestId 这种字段,只有它同时存在于后端实现、响应 body、响应 header、OpenAPI schema 和前端展示里,这件事才算真的做完。

只存在于后端代码里,不算。

总结

这次问题最后的根因其实很简单:某个服务没发布。

但真正拖慢排障的,不是这个根因本身,而是客户端没有把本来已经存在的 requestId 展示出来。

所以我现在越来越认同一件事:

不是所有效率问题都要靠更复杂的架构解决。很多时候,提升协作效率的关键,就是把那些已经存在但没有打通的工程细节真正闭环。

而在 AI 时代,工程师也确实越来越需要 full-stack 视角。因为你不再只是写某一层的代码,你还得对整条链路的可观测性、可排障性和协作效率负责。

Loading Comments...