拆解炬鲸 OBSERVE 的统一字段模型:trace_id、span_id、service 三个字段如何把日志、指标、链路串起来,从一条告警直接下钻到出错日志与调用代码。
线上出问题时,最常见的一套动作是:监控大盘显示错误率突然拉高,点开告警只看到一条曲线和几个数字;想查日志得切到日志平台,用另一套语法翻几十个文件;想确认到底是哪个服务、哪个方法抛的错,又要再开链路追踪页面。三个系统、三套查询语法、三份权限,来回切换的时间足够让故障窗口持续扩大。
日志回答"发生了什么",指标回答"整体趋势如何",链路回答"一个请求从头到尾怎么走"。这三批数据其实来自同一批请求,只是因为分散在不同系统、字段命名各写各的,人工很难把它们对到一起。最常见的后果是:错误率告警响了,工程师拿着错误信息去日志里翻半天,找到了异常堆栈,却不知道这个请求的完整调用路径,于是又回头去链路系统里大海捞针。
炬鲸 OBSERVE 在采集侧就把三个关键字段统一了:
同一个 trace_id,会同时出现在 ERROR 日志里、链路中的某个 span 里,以及这条请求产生的延迟与错误指标里。字段一旦统一,"关联"就不再是人工拼接,而是查询层天然具备的能力。这也是为什么我们反复强调:可观测平台的价值不在"存了多少数据",而在"数据之间能不能对上号"。
假设告警提示 order-service 错误率超过 5%。在炬鲸 OBSERVE 里,排查路径只有四步:
-- 1. 找出错误率最高的接口
SELECT endpoint, count(*) AS err_cnt
FROM metrics
WHERE service = 'order-service' AND status = 'error' AND ts > now() - 10m
GROUP BY endpoint ORDER BY err_cnt DESC LIMIT 10;
-- 2. 取一个出错请求的 trace_id
SELECT trace_id
FROM logs
WHERE service = 'order-service' AND level = 'ERROR'
ORDER BY ts DESC LIMIT 1;
-- 3. 控制台按 trace_id 打开 Trace 详情,定位慢/失败的 span
-- 4. 回到日志,看这个 span 关联的日志上下文
SELECT * FROM logs WHERE trace_id = '<上一步的trace_id>' ORDER BY ts ASC;
四步走完,从"错误率高了"到"具体哪行日志、哪个方法超时",全程在一个平台内完成,不用在三个系统之间来回搬运 trace_id。查询语法是类 SQL,会写 SELECT ... WHERE ... 就能上手,运维、开发、测试用的是同一套语言,而不是各自维护一套专属语法。
字段统一是关联查询的前提,也是后续自动归因、AI 根因分析、异常检测这类能力的数据基础。先把字段这关做好,后面的一切高级特性才有地基。