2. Jaeger 基础架构回顾:Agent、Collector、Query、Storage 组件及数据流

在深入质量门禁与发布异常定位之前,必须重新梳理 Jaeger 的四大核心组件及其数据流转路径。理解每个组件的职责边界与通信方式,是后续配置采样策略、排查数据丢失、优化查询性能的根基。

2.1 组件职责与部署形态

组件 核心职责 典型部署形态 关键协议/端口
Agent 接收应用端 Span,批量压缩后转发给 Collector Sidecar 或 DaemonSet(每节点一个) gRPC (16686) / Thrift (6831/6832)
Collector 校验、聚合、存储 Span,执行采样决策 无状态 Deployment,可水平扩展 gRPC (14250) / HTTP (14268)
Query 提供 API 与 UI 查询已存储的 Trace 数据 无状态 Deployment,通常与 Collector 同集群 HTTP (16686)
Storage 持久化 Span 数据,支持检索与聚合 有状态服务(Cassandra/Elasticsearch/Badger) 各存储原生端口
质量门禁关注点: Agent 与 Collector 之间的网络抖动会直接导致 Span 丢失,进而使门禁判定“无数据”而误阻断发布。建议在 Agent 侧开启 --reporter.grpc.retry.max=5 并配置健康检查端点。

2.2 数据流全景

一条 Trace 从应用产生到 UI 展示,经历以下 5 个阶段:

  1. 埋点注入: 应用通过 OpenTracing/OpenTelemetry SDK 创建 Span,携带 TraceID、SpanID、ParentSpanID。
  2. Agent 接收: Agent 通过 UDP 或 gRPC 接收 Span,放入内部缓冲区,按批次压缩后发送。
  3. Collector 处理: Collector 解压、校验 Span 结构,执行头采样或尾部采样策略,写入存储队列。
  4. Storage 持久化: 存储后端按 TraceID 索引写入,同时建立 ServiceName、OperationName、Tags 等二级索引。
  5. Query 检索: 用户通过 UI 或 API 发起查询,Query 服务从 Storage 读取 Span 并组装为完整 Trace。
Jaeger 数据流架构图 Jaeger 数据流架构图 应用服务 Agent Collector Storage Query 用户/UI gRPC/UDP gRPC 写入 读取 API/UI 说明:Agent 通常以 DaemonSet 形式部署在每台节点上,Collector 与 Query 为无状态服务,Storage 为有状态后端。

2.3 关键数据流细节

2.3.1 Agent 到 Collector 的批量传输

Agent 默认每 1 秒 或缓冲区达到 1000 条 Span 时触发一次批量发送。若 Collector 不可用,Agent 会重试最多 3 次(默认),超出后丢弃 Span。此行为在发布高峰期可能导致数据丢失。

门禁调优建议: 在 Agent 启动参数中增加 --reporter.grpc.retry.max=10 和 --reporter.grpc.retry.backoff=2s,提升发布期间的容错能力。

2.3.2 Collector 的采样决策点

Collector 支持两种采样模式:

  • 头采样(Head Sampling): 在 Span 进入 Collector 时立即决策,适用于低延迟场景,但无法保证完整 Trace 被采样。
  • 尾部采样(Tail Sampling): 等待 Trace 所有 Span 到达后再决策,可保证完整 Trace,但引入额外延迟与内存开销。
采样模式 延迟影响 Trace 完整性 内存开销 适用场景
头采样 低 低(可能截断) 低 高吞吐、低延迟要求
尾部采样 中 高(完整 Trace) 中高 质量门禁、异常分析
质量门禁陷阱: 若使用头采样且采样率低于 100%,门禁可能因“未采样到异常 Trace”而漏判。建议在发布窗口期临时将采样率提升至 100%,或启用尾部采样策略。

2.4 存储模型与索引策略

Jaeger 的存储模型以 TraceID 为主键,同时建立以下二级索引以支持快速检索:

  • ServiceName + StartTime: 按服务名与时间范围查询。
  • OperationName + StartTime: 按操作名与时间范围查询。
  • Tags: 支持自定义标签过滤(如 error=true)。
  • Duration: 按耗时范围查询慢 Trace。

以 Elasticsearch 为例,Span 文档结构如下:

{
  "traceID": "abc123",
  "spanID": "def456",
  "operationName": "HTTP GET /api/order",
  "startTime": 1710000000000000,
  "duration": 150000,
  "tags": [
    {"key": "http.status_code", "value": "500"},
    {"key": "error", "value": "true"}
  ],
  "process": {
    "serviceName": "order-service"
  }
}
Jaeger 存储索引结构图 Jaeger 存储索引结构图 主键:TraceID ServiceName + StartTime OperationName + StartTime Tags 索引 说明:二级索引用于加速查询。质量门禁通常按 ServiceName + error=true 标签组合检索异常 Trace。 若索引未正确配置,门禁查询可能超时或返回空结果。

2.5 组件通信协议汇总

通信路径 协议 端口 序列化格式 备注
应用 → Agent gRPC / Thrift 6831 (Thrift UDP) / 16686 (gRPC) Protobuf / Thrift 推荐 gRPC,支持流式传输
Agent → Collector gRPC 14250 Protobuf 支持压缩与批量
Collector → Storage 存储原生协议 ES: 9200 / Cassandra: 9042 JSON / CQL Collector 作为写入客户端
Query → Storage 存储原生协议 同上 同上 Query 作为读取客户端
用户 → Query HTTP / gRPC 16686 JSON / Protobuf UI 使用 HTTP,API 可选用 gRPC
门禁集成要点: 质量门禁系统通常通过 Query 的 HTTP API(/api/traces?service=xxx&tags=error:true)拉取异常 Trace。确保 Query 服务在门禁网络可达,且 Storage 索引覆盖 error 标签。