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 个阶段:
- 埋点注入: 应用通过 OpenTracing/OpenTelemetry SDK 创建 Span,携带 TraceID、SpanID、ParentSpanID。
- Agent 接收: Agent 通过 UDP 或 gRPC 接收 Span,放入内部缓冲区,按批次压缩后发送。
- Collector 处理: Collector 解压、校验 Span 结构,执行头采样或尾部采样策略,写入存储队列。
- Storage 持久化: 存储后端按 TraceID 索引写入,同时建立 ServiceName、OperationName、Tags 等二级索引。
- Query 检索: 用户通过 UI 或 API 发起查询,Query 服务从 Storage 读取 Span 并组装为完整 Trace。
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"
}
}
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 标签。