微服务架构中,一个请求可能经过几十个服务。追踪让我们能:
Trace (一次完整请求)
├─ Span 1 (Service A 处理)
│ ├─ Span 1.1 (调用 Service B)
│ └─ Span 1.2 (调用 Redis)
└─ Span 2 (Service B 处理)
├─ Span 2.1 (查询 MySQL)
└─ Span 2.2 (调用 Service C)
| 概念 | 说明 |
|---|---|
| Trace | 一次完整的请求链路 |
| Span | 链路中的一个操作单元 |
| Trace ID | 全局唯一,贯穿整个链路 |
| Span ID | 单个 Span 的唯一标识 |
| Parent Span ID | 父 Span ID(建立层级关系) |
CNCF 的可观测性标准,统一 Metrics / Logging / Tracing 数据采集。
SDK / API → Collector → Backend
(OTLP 协议) (Jaeger / Tempo / Datadog)
关键概念:
Uber 开源的分布式追踪系统:
Application (Jaeger Client)
↓ (jaeger.thrift over UDP)
Jaeger Agent
↓
Jaeger Collector → Kafka → Jaeger Ingester
↓
Elasticsearch / Cassandra
↓
Jaeger Query (UI)
1. 用户反馈"API 慢"
2. 在 Grafana 检查 RED 看板 → p99 延迟飙升
3. 看 Tracing → 某个 Trace 在 Service D 耗时 3 秒
4. 展开 Service D 的 Span → 发现 MySQL 查询慢
5. 关联 Loki 日志(按 Trace ID)→ 看到慢查询 SQL
6. 定位:缺少索引的全表扫描