可观测性落地:日志、指标、链路追踪怎么统一

3 阅读2分钟

系统出了问题,最怕两件事:

  • 看不到问题发生在哪
  • 看到了告警但无法定位根因

可观测性的目标不是“采集更多数据”,而是“更快回答问题”。


【场景:接口超时,但每个服务都说自己正常】

常见排障困境:

  1. 网关提示超时。
  2. A 服务日志正常。
  3. B 服务偶发慢调用。
  4. 数据库监控无明显异常。

如果没有统一的 traceId,很难还原一次请求在多服务间的真实路径。


【三件套角色分工】

1)日志(Logs)

回答“发生了什么”。

2)指标(Metrics)

回答“系统状态如何变化”。

3)链路(Traces)

回答“请求在哪一步变慢或失败”。

三者合在一起,才能完成闭环定位。


【日志:先统一字段,再谈平台】

建议统一日志字段:

  • timestamp
  • level
  • service
  • traceId
  • spanId
  • requestId
  • businessKey
{
  "service": "order-service",
  "traceId": "6fc3...",
  "requestId": "req-20260227-001",
  "message": "create order success"
}

【指标:先定义 SLI/SLO】

核心指标建议:

  • 延迟:P50/P95/P99
  • 错误率:5xx 比例
  • 吞吐:QPS/TPS
  • 资源:CPU、内存、连接池、线程池

建议先给核心接口定义 SLO:

  • 比如“P95 < 300ms,错误率 < 0.5%”。

【链路追踪:每个入口都要打通 traceId】

关键点:

  • 网关生成或透传 traceId
  • 跨线程、跨服务、跨消息队列都要传递
  • 日志和 metrics 必须可按 traceId 关联
String traceId = Trace.currentTraceId();
log.info("traceId={}, create order start", traceId);

【告警设计:减少噪音,提升有效性】

反模式:

  • 单指标阈值告警太多
  • 告警没有上下文

建议:

  • 组合告警(错误率 + 延迟)
  • 告警附带最近异常日志、影响接口、责任服务
  • 明确告警分级(P1/P2/P3)

【一条可复用的排障路径】

  1. 先看告警面板确认影响范围。
  2. 用 traceId 找到慢节点。
  3. 结合该节点指标判断是资源瓶颈还是依赖抖动。
  4. 回到结构化日志看具体错误上下文。
  5. 定位后形成复盘与规则沉淀。

【可观测性检查清单】

  1. 是否统一了日志结构和关键字段?
  2. 是否定义了核心接口的 SLI/SLO?
  3. 是否全链路打通 traceId?
  4. 告警是否有降噪与分级策略?
  5. 是否能在 10 分钟内定位主要故障点?
  6. 是否有复盘闭环(问题→规则→防复发)?

下期预告:

《线上事故复盘模板:5步定位与防复发机制》