Trace 与 Span

微服务时代的难题

指标能告诉我们「支付接口 P95 变慢了」,日志能告诉我们「某个订单处理失败了」,但在微服务架构中,一次请求可能经过 API 网关、订单服务、支付服务、库存服务、消息队列和数据库。

链路追踪要回答的问题是:这次请求到底卡在哪里?

基本模型

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

一个 trace 由多个 span 组成:

一次请求的 Trace / Span

GET /api/orders220ms · 总耗时
trace_id=4bf92f35...
API Gateway20ms
Order Service180ms
Payment Service150ms
MySQL query120ms · 慢
MQ publish8ms
关键认知: Trace 是一次完整请求的全局轨迹, Span 是请求中的一个操作。每个 span 记录开始/结束时间、服务名、操作名、父 span、状态和错误信息。 上图一眼看出瓶颈:MySQL query 占了 120ms,是排障的突破口。

每个 span 要记录什么

  • 开始时间、结束时间。
  • 服务名、操作名。
  • 父 span(树形结构)。
  • 状态和错误信息。

为什么用树形结构

Span 不是平铺的,而是树形的:

Trace
├── API Gateway (根 span)
│   ├── Order Service
│   │   ├── Payment Service
│   │   └── MySQL query
│   └── MQ publish

树形结构能还原调用层级:谁调用了谁、每层花了多少时间。

一句话

Trace 是一次完整请求的全局轨迹,Span 是其中的一个操作。树形 span 结构让你一眼看到请求卡在哪一层——这就是排障的突破口。

发现内容有问题?

告诉我们哪里需要改进。