1.1 核心概念
1 2 3 4 5 6
| Trace Id: a1b2c3d4e5f67890 ├─ Span A: API Gateway duration: 350ms │ ├─ Span B: OrderService.createOrder duration: 200ms │ │ ├─ Span D: MySQL SELECT duration: 80ms │ │ └─ Span E: Redis GET duration: 10ms │ └─ Span C: InventoryService.checkStock duration: 120ms
|
- Trace:一次完整请求链,由一组 Span 组成
- Span:单个逻辑操作,含起止时间、Tag、事件
- SpanContext:跨进程传递上下文(TraceId + SpanId + Baggage)
- 上下文传播:通过 HTTP Header
traceparent 或 gRPC Metadata 传递
1.2 OpenTelemetry 标准
OTel 统一了 OpenTracing + OpenCensus,成为可观测性采集标准:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Application Code │ ▼ ┌─────────────────┐ │ OTel API │ 手动埋点 │ OTel SDK │ 采样/导出/处理 └────────┬────────┘ │ ┌────┴────┬──────────┐ ▼ ▼ ▼ OTLP Jaeger Zipkin ← 可导出到任何后端 │ Thrift HTTP ▼ ▼ ▼ ┌─────────────────────────────┐ │ Collector (可选) │ 接收/处理/导出流水线 └─────────────────────────────┘ │ ┌────┴──────────┐ ▼ ▼ Jaeger(Traces) Prometheus(Metrics)
|
核心价值:厂商无关;统一 Traces + Metrics + Logs API;Java Agent 自动埋点 Spring/gRPC/Kafka/Redis。
1 2 3 4
| java -javaagent:opentelemetry-javaagent.jar \ -Dotel.service.name=order-service \ -Dotel.traces.exporter=otlp \ -jar order-service.jar
|
1.3 Jaeger 架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Service A/B/C + Jaeger Client │ Thrift/UDP ▼ ┌─────────────────┐ │ Jaeger Agent │ DaemonSet,每 Node 一个,批处理转发 └────────┬────────┘ │ gRPC ▼ ┌─────────────────┐ │ Jaeger Collector │ 验证/索引 → 写 Kafka → 写 ES/Cassandra └─────────────────┘ │ ┌────┴──────┐ ▼ ▼ Ingester Query Service + UI (Kafka→DB)
|
| 存储 |
适用场景 |
说明 |
| Elasticsearch |
生产首选 |
全文检索,与日志共用 ES 集群 |
| Cassandra |
超大流量 |
线性扩展,运维复杂 |
| ClickHouse |
新选择 |
列存高压缩,OLAP 分析快 |
1.4 SkyWalking
国人开源 APM,Java Agent 自动埋点极强,几乎零代码侵入。
1
| Service + SW Agent ──gRPC──▶ OAP(Receiver→Analyzer→Aggregator) ──▶ ES/MySQL ──▶ UI(RocketBot)
|
核心特性:服务拓扑图(实时调用量/延迟/成功率)、JVM 级指标、慢端点检测、内置告警。
1 2 3 4
| java -javaagent:skywalking-agent.jar \ -DSW_AGENT_NAME=order-service \ -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=oap:11800 \ -jar order-service.jar
|
自定义 Span:
1 2 3 4
| @Trace(operationName = "customBusinessLogic") public void processOrder(Order order) { ActiveSpan.tag("orderId", order.getId()); }
|
1.5 Spring Cloud Sleuth + Zipkin
1 2 3 4 5 6 7 8 9 10 11 12 13
| spring: application: name: order-service sleuth: sampler: probability: 0.1 baggage: remote-fields: - userId zipkin: base-url: http://zipkin:9411 sender: type: kafka
|
Sleuth 自动将 traceId 和 spanId 注入 MDC,日志输出:
1 2
| [order-service,a1b2c3d4e5f67890,a1b2c3d4e5f67890] INFO - order created [inventory-service,a1b2c3d4e5f67890,1234567890abcdef] INFO - stock deducted
|
1.6 采样策略
全量追踪成本极高。生产推荐混合策略:
1 2 3 4 5
| 入口层:10-30 ↓ 规则层:错误 Trace → 100 ↓ 收集层:异常服务提高采样率,正常流量降低
|
| 策略 |
说明 |
适用 |
| 固定采样 |
固定比例(10%) |
成本可预测 |
| 概率采样 |
根据延迟/错误动态调整 |
异常优先保留 |
| 头部采样 |
Trace 入口决定 |
实现简单 |
| 尾部采样 |
Trace 完成后根据结果决定 |
一定保留异常 |
Jaeger 配置:sampler.type: probabilistic; sampler.param: 0.1,关键操作 perOperationStrategies 设 100%。