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 个阶段:
- 应用端生成 Span:通过 Jaeger Client SDK(Java/Go/Python/Node.js 等)在服务调用边界创建 Span,携带 TraceID、SpanID、ParentSpanID、OperationName、Tags、Logs。
- Agent 接收与批处理:Agent 通过 Thrift 协议(UDP)接收 Span,在内存中按批次压缩,使用 gRPC 或 Thrift(TCP)转发给 Collector。
- Collector 校验与存储:Collector 对 Span 进行 schema 校验、采样判断、服务名归一化,然后写入后端存储(Cassandra / Elasticsearch / Badger)。
- Query 索引与检索:Query 从存储层读取索引(服务名、Operation、Tags),根据用户查询条件组装完整的 Trace 树。
- UI 渲染:UI 通过 gRPC Gateway 调用 Query 的 HTTP API,将 JSON 格式的 Trace 数据渲染为时序图、火焰图或依赖图。
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 资源不足引起。
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 两个指标建立基线。若变更后这两个指标出现异常波动,应立即回滚或启动降级采样策略。