1. 分布式追踪基础

1.1 什么是分布式追踪

分布式追踪(Distributed Tracing)是一种用于监控和诊断微服务架构中请求全链路行为的可观测性技术。它通过为每个请求分配唯一的 Trace ID,并在服务间传播,将一次业务请求经过的所有服务节点、调用耗时、状态信息串联起来,形成一条完整的调用链路。

核心定义:分布式追踪 = 请求级端到端链路记录 + 跨服务上下文传播 + 时序与依赖关系还原。

1.2 分布式追踪的核心价值

价值维度 说明 典型场景
故障定位 快速定位错误发生在哪个服务、哪个接口、哪行代码,减少 MTTR 订单超时、支付失败、500 错误溯源
性能优化 识别调用链中的慢节点、串行瓶颈、冗余调用,量化各环节耗时 首页加载慢、API 响应延迟、数据库查询慢
依赖分析 可视化服务间调用关系,发现非预期依赖、循环调用、扇出过大 服务拓扑梳理、容量规划、架构治理
容量评估 基于链路流量数据,准确评估各服务的请求量和负载分布 大促压测、扩缩容决策、限流阈值设定

1.3 分布式追踪 vs 单体追踪

单体架构下,追踪通常依赖日志关键字或简单的请求 ID 关联,所有调用都在同一进程内完成,上下文天然共享。微服务架构下,请求跨进程、跨网络、跨语言,传统日志聚合方式无法还原完整调用链。

对比维度 单体追踪 分布式追踪
上下文传播 进程内共享(线程局部变量) 跨进程传递(HTTP Header / 消息队列属性)
数据关联 单一日志文件 + 请求 ID 过滤 Trace ID + Span ID 树形关联
调用边界 函数调用栈 服务间 RPC / HTTP / 消息调用
性能开销 低(进程内采样) 需考虑网络序列化、采样策略
故障排查 单机日志 + 堆栈 全链路拓扑 + 火焰图 + 服务依赖图
关键区别:单体追踪关注"一个请求在一台机器上做了什么";分布式追踪关注"一个请求在整个分布式系统中经历了什么"。

1.4 分布式追踪核心概念

  • Trace(追踪):一次完整业务请求的端到端链路,由多个 Span 组成树形结构。
  • Span(跨度):Trace 中的最小工作单元,记录一个操作(如一次 RPC 调用、一次数据库查询)的开始时间、结束时间、状态和元数据。
  • Span Context(跨度上下文):包含 Trace ID、Span ID、Baggage 等,用于跨进程传递追踪状态。
  • Parent-Child 关系:Span 之间的父子层级,构成 Trace 的树形拓扑。
分布式追踪核心概念:Trace 与 Span 树形结构 Trace 与 Span 树形结构示例 入口服务 (Root Span) Trace ID: abc-123 用户服务 Span ID: span-1 订单服务 Span ID: span-2 MySQL 查询 Span ID: span-3 Redis 缓存 Span ID: span-4 支付服务 Span ID: span-5 第三方支付 Span ID: span-6 每个 Span 记录开始时间、结束时间、状态和标签;所有 Span 通过 Trace ID 关联为树形结构

1.5 分布式追踪的典型数据模型

一个完整的 Trace 数据通常包含以下字段,以 JSON 格式存储于追踪后端:

{
  "traceId": "abc123def456",
  "spans": [
    {
      "spanId": "span-1",
      "parentSpanId": null,
      "operationName": "POST /api/order",
      "startTime": 1710000000000000,
      "endTime":   1710000000123000,
      "durationMs": 123,
      "status": "OK",
      "serviceName": "api-gateway",
      "tags": {
        "http.method": "POST",
        "http.status_code": 200
      }
    },
    {
      "spanId": "span-2",
      "parentSpanId": "span-1",
      "operationName": "createOrder",
      "startTime": 1710000000010000,
      "endTime":   1710000000110000,
      "durationMs": 100,
      "status": "OK",
      "serviceName": "order-service",
      "tags": {
        "db.type": "mysql",
        "db.statement": "INSERT INTO orders ..."
      }
    }
  ]
}
注意:分布式追踪的数据量随服务规模和流量线性增长。生产环境必须配置合理的采样策略(如头部采样、尾部采样、概率采样),否则存储和网络开销将不可控。

1.6 分布式追踪的典型工作流程

  1. 注入:请求入口处生成 Trace ID,并注入到请求上下文(如 HTTP Header x-trace-id)。
  2. 传播:Trace ID 和 Span Context 随请求在服务间传递,每个服务创建新的 Span 并记录父子关系。
  3. 采集:各服务将 Span 数据异步发送到追踪 Collector(如 Jaeger Agent、OpenTelemetry Collector)。
  4. 存储:Collector 将 Span 写入后端存储(如 Elasticsearch、Cassandra、ClickHouse)。
  5. 查询:通过追踪 UI 按 Trace ID、服务名、标签、时间范围检索链路。
  6. 分析:查看火焰图、服务拓扑、耗时分布,定位瓶颈或错误。
分布式追踪工作流程 分布式追踪工作流程 ① 注入 生成 Trace ID ② 传播 跨服务传递 ③ 采集 异步上报 ④ 存储 持久化 ⑤ 查询 UI 检索 ⑥ 分析 火焰图 / 拓扑 / 耗时 整个流程对业务代码侵入最小化,通常通过 SDK 自动插桩或 Agent 字节码增强实现

1.7 平台工程视角:为什么需要自助查询接口

在平台工程实践中,分布式追踪不仅是 SRE 的排障工具,更应成为所有研发团队的自助能力。传统模式下,开发者需要向 SRE 申请 Trace ID 查询权限或依赖 Grafana 等复杂 UI,效率低下。平台工程的目标是提供 自助查询接口,让开发者通过简单的 API 或 CLI 即可按 Trace ID、服务名、标签、时间范围检索链路,并直接嵌入到 CI/CD 流水线、告警通知和日常排障流程中。

平台工程核心主张:将分布式追踪能力封装为平台服务,提供标准化、可编程的查询接口,降低认知负载,提升排障效率。