链路追踪

指标能告诉我们“支付接口 P95 变慢了”,日志能告诉我们“某个订单处理失败了”,但在微服务架构中,一次请求可能经过 API 网关、订单服务、支付服务、库存服务、消息队列和数据库。链路追踪要回答的问题是:这次请求到底卡在哪里?

Trace 与 Span

链路追踪的基本模型是:

  • Trace:一次完整请求的全局轨迹。
  • Span:请求中的一个操作,例如调用订单服务、查询数据库、发送消息。

一个 trace 由多个 span 组成:

trace_id=abc
  API Gateway  20ms
    Order Service  180ms
      Payment Service  150ms
        MySQL query  120ms

每个 span 需要记录开始时间、结束时间、服务名、操作名、父 span、状态和错误信息。

上下文传播

链路追踪能工作,关键在于上下文传播。入口服务生成 trace_id,后续每次 HTTP、RPC、消息队列调用都要把它传下去。常见方式是放在请求头:

traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01

如果某个服务没有继续传递 trace,上下游链路就会断开。平台需要监控 trace 覆盖率,发现未接入或传播失败的服务。

采样策略

不是所有请求都能完整追踪。高流量服务如果 100% 采集 trace,存储成本会很高。常见采样策略有:

  • 固定比例采样,例如 1%。
  • 错误请求全量采样。
  • 慢请求提高采样率。
  • 重要租户或核心链路定向采样。

采样要避免一个问题:入口采样后,下游必须遵循同一个采样决策,否则 trace 会残缺。

与日志和指标关联

链路追踪不能孤立存在。日志里要带 trace_id,指标标签里可以保留服务和接口维度,告警里应该给出典型 trace 链接。

排障路径应该是:

告警 -> 指标看板 -> 慢 trace -> 相关日志 -> 根因

例如,告警显示支付回调 P95 超过 2 秒,点击看板看到延迟集中在 Payment Service,再打开慢 trace 发现 MySQL 查询耗时异常,最后通过 trace_id 搜到 SQL 参数和错误日志。

链路追踪让单次请求透明化。下一章会把日志、指标、trace 和告警放到可视化工作台里。