3. Jaeger 部署与配置:使用 Docker Compose 快速搭建 Jaeger 全栈环境,配置采样策略

在生产值班场景中,快速搭建一套可用的 Jaeger 全栈环境是开展分布式追踪故障排查的前提。本章将指导你使用 Docker Compose 一键部署 Jaeger 后端组件(Collector、Query、Agent、Storage),并深入讲解三种核心采样策略的配置方法,确保在资源有限的情况下既能捕获关键故障链路,又不会因采样率过高导致存储压力。

3.1 全栈架构组件概览

Jaeger 全栈环境由以下核心组件构成,它们协同完成 Trace 数据的接收、处理、存储与查询:

组件 角色 默认端口 值班关注点
jaeger-agent Sidecar 代理,接收应用端 Span 并批量转发 6831/6832 (UDP) 应用端无需感知 Collector 地址
jaeger-collector 接收 Agent/直连 Span,校验、采样、写入存储 14250 (gRPC), 14268 (HTTP) 采样策略在此生效
jaeger-query 提供 API 与 Web UI,支持 Trace 检索与依赖图 16686 值班排查入口
Storage Backend 持久化 Span 数据(Elasticsearch / Cassandra / Badger) 9200 (ES) 磁盘与索引性能影响查询速度
Jaeger 全栈组件架构与数据流 微服务 A 微服务 B jaeger-agent jaeger-collector 采样策略 Elasticsearch jaeger-query Web UI :16686 Agent 推荐以 Sidecar 模式部署

3.2 Docker Compose 快速部署

以下 docker-compose.yml 文件可一键启动 Jaeger 全栈环境(使用 Elasticsearch 作为存储后端),适合值班环境快速验证:

version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - "9200:9200"
      - "9300:9300"

  jaeger-collector:
    image: jaegertracing/jaeger-collector:1.52
    ports:
      - "14250:14250"
      - "14268:14268"
      - "14269:14269"
    environment:
      - SPAN_STORAGE_TYPE=elasticsearch
      - ES_SERVER_URLS=http://elasticsearch:9200
      - COLLECTOR_OTLP_ENABLED=true
    depends_on:
      - elasticsearch

  jaeger-query:
    image: jaegertracing/jaeger-query:1.52
    ports:
      - "16686:16686"
    environment:
      - SPAN_STORAGE_TYPE=elasticsearch
      - ES_SERVER_URLS=http://elasticsearch:9200
    depends_on:
      - elasticsearch

  jaeger-agent:
    image: jaegertracing/jaeger-agent:1.52
    ports:
      - "6831:6831/udp"
      - "6832:6832/udp"
      - "5778:5778"
    environment:
      - REPORTER_GRPC_HOST_PORT=jaeger-collector:14250
    depends_on:
      - jaeger-collector
值班提示: 首次启动建议使用 docker-compose up -d 后台运行,通过 docker-compose logs -f jaeger-collector 观察 Collector 启动日志,确认采样策略加载成功。

3.3 采样策略配置详解

采样策略是 Jaeger 部署中最关键的配置项之一,直接影响故障排查时能否捕获到异常链路。Jaeger 支持三种采样模式,可通过 Collector 的环境变量或配置文件动态下发。

3.3.1 固定采样(Constant Sampler)

固定采样对所有 Span 执行统一决策,适用于调试环境或全量采集场景。

  • always:采样率为 1.0,采集所有 Trace。
  • never:采样率为 0.0,不采集任何 Trace。
# 采集所有 Trace(调试环境)
COLLECTOR_SAMPLING_STRATEGIES='{
  "default_strategy": {
    "type": "const",
    "param": 1
  }
}'

3.3.2 概率采样(Probabilistic Sampler)

根据设定的概率值(0.0 ~ 1.0)随机采样,适合生产环境控制存储成本。

  • param=0.1:采集 10% 的 Trace。
  • param=0.01:采集 1% 的 Trace(高流量服务推荐)。
# 采集 10% 的 Trace
COLLECTOR_SAMPLING_STRATEGIES='{
  "default_strategy": {
    "type": "probabilistic",
    "param": 0.1
  }
}'

3.3.3 速率限制采样(Rate Limiting Sampler)

限制每秒采集的 Span 数量,适用于突发流量场景,防止存储被瞬时洪峰冲垮。

  • param=10:每秒最多采集 10 个 Span。
  • param=100:每秒最多采集 100 个 Span。
# 每秒最多采集 50 个 Span
COLLECTOR_SAMPLING_STRATEGIES='{
  "default_strategy": {
    "type": "ratelimiting",
    "param": 50
  }
}'

3.4 采样策略对比与选型建议

策略类型 适用场景 优点 缺点 值班推荐
固定采样 调试、全量审计 配置简单,无遗漏 高流量下存储压力大 仅用于预发环境
概率采样 生产环境常规监控 均匀采样,统计偏差小 低流量服务可能漏采 默认推荐 0.01~0.1
速率限制 高突发流量、限流场景 保护存储,避免洪峰 低峰期采样不足 配合概率采样使用
根因定位陷阱: 概率采样下,如果故障发生在低概率窗口,可能导致关键错误链路未被采集。值班期间建议对已知高风险服务单独配置 固定采样=1.0,确保异常链路 100% 落盘。

3.5 服务级别采样策略配置

生产环境中,不同服务的重要性和流量特征差异很大。Jaeger 支持按服务名覆盖默认采样策略,实现精细化控制:

COLLECTOR_SAMPLING_STRATEGIES='{
  "default_strategy": {
    "type": "probabilistic",
    "param": 0.01
  },
  "service_strategies": [
    {
      "service": "payment-service",
      "type": "const",
      "param": 1
    },
    {
      "service": "notification-service",
      "type": "ratelimiting",
      "param": 100
    }
  ]
}'
  • payment-service:全量采集,确保每一笔交易都可追踪。
  • notification-service:速率限制,每秒最多 100 个 Span,避免通知洪峰影响存储。
  • 其他服务:默认概率 1%,平衡成本与可观测性。

3.6 验证采样策略生效

部署完成后,通过以下步骤验证采样策略是否按预期工作:

  1. 访问 http://localhost:16686 打开 Jaeger Web UI。
  2. 在 Search 页面选择服务名,观察 Trace 数量是否符合采样率预期。
  3. 查看 Collector 日志,确认采样策略加载成功:
    docker-compose logs jaeger-collector | grep "sampling"
  4. 使用 Jaeger 客户端 SDK 的 sampler.type 和 sampler.param 标签验证采样决策。
值班速查: 如果发现 Trace 数量异常(过多或过少),优先检查 COLLECTOR_SAMPLING_STRATEGIES 环境变量是否被正确注入,以及 JSON 格式是否合法。常见错误是 JSON 末尾多逗号或引号不匹配。