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) | 磁盘与索引性能影响查询速度 |
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 验证采样策略生效
部署完成后,通过以下步骤验证采样策略是否按预期工作:
- 访问
http://localhost:16686打开 Jaeger Web UI。 - 在 Search 页面选择服务名,观察 Trace 数量是否符合采样率预期。
- 查看 Collector 日志,确认采样策略加载成功:
docker-compose logs jaeger-collector | grep "sampling" - 使用 Jaeger 客户端 SDK 的
sampler.type和sampler.param标签验证采样决策。
值班速查: 如果发现 Trace 数量异常(过多或过少),优先检查
COLLECTOR_SAMPLING_STRATEGIES 环境变量是否被正确注入,以及 JSON 格式是否合法。常见错误是 JSON 末尾多逗号或引号不匹配。