2. Jaeger 基础架构:组件与数据流

在事故响应场景中,理解 Jaeger 的组件拓扑和数据流转路径,是快速定位采集失败、数据延迟、查询超时等故障的前提。Jaeger 采用微服务架构,核心组件包括 Agent、Collector、Query 和 UI,它们通过标准协议协作完成从数据采集到可视化展示的全链路。

2.1 核心组件与职责

组件 部署位置 核心职责 事故响应关注点
Agent 与业务容器同机部署(DaemonSet / Sidecar) 接收应用发出的 Span,批量压缩后转发给 Collector Agent 崩溃或端口被占用 → 数据丢失
Collector 独立部署(无状态服务) 校验、聚合、存储 Span;支持采样策略下发 Collector 队列积压 → 数据延迟
Query 独立部署(无状态服务) 提供 gRPC/HTTP API 查询 Trace 和 Span Query 超时 → 前端无法加载 Trace
UI 与 Query 同进程或独立部署 可视化 Trace 拓扑、火焰图、服务依赖图 UI 白屏 → 后端 Query 或存储异常
事故响应提示: 变更窗口期间,Agent 的端口映射(默认 6831/6832 UDP)最容易被 Sidecar 注入或网络策略误拦截。建议在变更前使用 netstat -lpn | grep 6831 确认 Agent 监听状态。

2.2 数据流全景

一条完整的 Trace 从业务应用发出到 UI 展示,经历以下 5 个阶段:

  1. 应用端生成 Span:通过 Jaeger Client SDK(Java/Go/Python/Node.js 等)在服务调用边界创建 Span,携带 TraceID、SpanID、ParentSpanID、OperationName、Tags、Logs。
  2. Agent 接收与批处理:Agent 通过 Thrift 协议(UDP)接收 Span,在内存中按批次压缩,使用 gRPC 或 Thrift(TCP)转发给 Collector。
  3. Collector 校验与存储:Collector 对 Span 进行 schema 校验、采样判断、服务名归一化,然后写入后端存储(Cassandra / Elasticsearch / Badger)。
  4. Query 索引与检索:Query 从存储层读取索引(服务名、Operation、Tags),根据用户查询条件组装完整的 Trace 树。
  5. UI 渲染:UI 通过 gRPC Gateway 调用 Query 的 HTTP API,将 JSON 格式的 Trace 数据渲染为时序图、火焰图或依赖图。
Jaeger 数据流架构图 业务应用 (Client SDK) Agent (DaemonSet) Collector (无状态) 后端存储 (ES / Cassandra) Query (API 服务) UI (可视化) Thrift UDP gRPC / Thrift TCP 批量写入 读取索引 HTTP JSON 🔍 事故响应关键路径: Agent → Collector 链路中断 → 数据丢失;Collector → 存储写入慢 → 查询延迟;Query → 存储读取超时 → UI 白屏。

2.3 组件间通信协议

不同组件之间的通信协议决定了数据格式、传输可靠性和故障隔离边界。下表总结了关键协议及其在事故场景中的影响:

链路 协议 传输方式 故障模式
应用 → Agent Thrift (Compact / Binary) UDP UDP 丢包不重试,Agent 不可达时 Span 静默丢失
Agent → Collector gRPC / Thrift (Binary) TCP TCP 连接断开 → Agent 本地缓冲积压 → OOM
Collector → 存储 ES HTTP / Cassandra CQL TCP 存储写入限流 → Collector 背压 → 数据延迟
Query → 存储 ES HTTP / Cassandra CQL TCP 查询超时 → 前端 Trace 加载失败
UI → Query HTTP (REST / gRPC-Gateway) TCP Query 负载高 → UI 请求排队 → 页面卡顿
⚠️ 变更窗口避坑: 当 Collector 进行滚动更新时,Agent 的 gRPC 长连接会断开并触发重连。如果重连策略配置不当(例如 reconnect_interval 过长),会导致分钟级的数据空洞。建议在变更前将 Agent 的 reconnect_interval 临时调整为 1s。

2.4 数据流中的关键故障点

基于上述架构,事故响应团队在变更窗口应重点监控以下 4 个故障点:

  • Agent 端 UDP 丢包:使用 jaeger_agent_thrift_udp_server_packets_dropped_total 指标监控,若持续增长说明 Agent 处理能力不足或网络拥塞。
  • Collector 队列积压:监控 jaeger_collector_queue_length,当队列长度超过阈值(如 10000)时,说明 Collector 消费速度跟不上生产速度。
  • 存储写入延迟:Elasticsearch 场景下监控 jaeger_collector_spans_written_latency,若 P99 超过 500ms,需排查 ES 集群负载或索引性能。
  • Query 查询超时:监控 jaeger_query_trace_latency,若 P99 超过 3s,通常由存储层慢查询或 Query 资源不足引起。
变更窗口关键故障点监控拓扑 应用 Agent Collector 存储 Query F1 F2 F3 F4 F1: UDP 丢包 | F2: Agent 缓冲积压 | F3: Collector 队列积压 / 存储写入慢 | F4: Query 查询超时

2.5 组件部署拓扑与变更窗口影响

在生产环境中,Jaeger 组件的部署拓扑直接影响变更窗口的风险面。以下是两种典型部署模式及其事故响应差异:

部署模式 Agent 位置 Collector 规模 变更影响范围 推荐场景
Sidecar 模式 每个 Pod 内一个 Agent 容器 小规模(2-3 副本) Agent 随应用滚动更新重启,短暂丢数据 Kubernetes 集群,精细控制
DaemonSet 模式 每个 Node 一个 Agent 中大规模(3-10 副本) Agent 变更影响整节点应用,但资源开销低 大规模集群,资源敏感
All-in-One 模式 嵌入 Collector 进程 单实例 变更导致全链路中断 开发/测试环境
📌 事故响应最佳实践: 在变更窗口前,使用 jaeger_agent_collector_proxy_failures_total 和 jaeger_collector_queue_length 两个指标建立基线。若变更后这两个指标出现异常波动,应立即回滚或启动降级采样策略。