Docker Jaeger Agent 部署指南
本文介绍如何使用 Docker 部署 Jaeger Agent。Jaeger 是一个开源的分布式追踪系统,用于监控和排查微服务架构中的请求流程。
📋 前置要求
- Docker 20.10+ 已安装
- Docker Compose V2 已安装(推荐)或 Docker Compose V1
- 如需使用阿里云 Tracing Analysis,需要 Access Token
🚀 快速部署
1. 克隆项目(如果使用项目模板)
1 2
| git clone https://github.com/noahzaozao/docker-jaeger-agent.git cd docker-jaeger-agent
|
2. 配置环境变量
1 2
| cp .env-trunk .env vi .env
|
编辑 .env 文件,设置 Jaeger Access Token(如果使用阿里云 Tracing Analysis):
1
| JAEGER_ACCESS_TOKEN=your_access_token_here
|
3. 使用 Docker Compose 部署
1 2 3 4 5
| docker compose up -d
docker-compose up -d
|
4. 验证部署
1 2 3 4 5
| docker compose ps
docker compose logs jaeger-agent
|
📝 Docker Compose 配置示例
基础配置(阿里云 Tracing Analysis)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| version: '3.8'
services: jaeger-agent: image: jaegertracing/jaeger-agent:latest container_name: jaeger-agent command: - "--reporter.grpc.host-port=tracing-analysis-dc-sh.aliyuncs.com:1883" - "--jaeger.tags=Authentication=${JAEGER_ACCESS_TOKEN}" ports: - "5775:5775/udp" - "6831:6831/udp" - "6832:6832/udp" - "5778:5778" - "14271:14271" restart: unless-stopped healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:14271/"] interval: 30s timeout: 10s retries: 3
|
完整 Jaeger 部署(包含 Collector 和 UI)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| version: '3.8'
services: jaeger-agent: image: jaegertracing/jaeger-agent:latest container_name: jaeger-agent command: - "--reporter.grpc.host-port=jaeger-collector:14250" ports: - "5775:5775/udp" - "6831:6831/udp" - "6832:6832/udp" - "5778:5778" restart: unless-stopped networks: - jaeger_network depends_on: - jaeger-collector
jaeger-collector: image: jaegertracing/jaeger-collector:latest container_name: jaeger-collector environment: - SPAN_STORAGE_TYPE=elasticsearch - ES_SERVER_URLS=http://elasticsearch:9200 ports: - "14250:14250" - "14268:14268" - "14269:14269" restart: unless-stopped networks: - jaeger_network depends_on: - elasticsearch
jaeger-query: image: jaegertracing/jaeger-query:latest container_name: jaeger-query environment: - SPAN_STORAGE_TYPE=elasticsearch - ES_SERVER_URLS=http://elasticsearch:9200 ports: - "16686:16686" - "16687:16687" restart: unless-stopped networks: - jaeger_network depends_on: - elasticsearch
elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 container_name: elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false ports: - "9200:9200" volumes: - elasticsearch_data:/usr/share/elasticsearch/data restart: unless-stopped networks: - jaeger_network
volumes: elasticsearch_data:
networks: jaeger_network: driver: bridge
|
使用内存存储(开发环境)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| version: '3.8'
services: jaeger-agent: image: jaegertracing/jaeger-agent:latest container_name: jaeger-agent command: - "--reporter.grpc.host-port=jaeger-collector:14250" ports: - "5775:5775/udp" - "6831:6831/udp" - "6832:6832/udp" - "5778:5778" restart: unless-stopped networks: - jaeger_network depends_on: - jaeger-collector
jaeger-collector: image: jaegertracing/jaeger-collector:latest container_name: jaeger-collector environment: - SPAN_STORAGE_TYPE=memory ports: - "14250:14250" - "14268:14268" restart: unless-stopped networks: - jaeger_network
jaeger-query: image: jaegertracing/jaeger-query:latest container_name: jaeger-query environment: - SPAN_STORAGE_TYPE=memory ports: - "16686:16686" restart: unless-stopped networks: - jaeger_network
networks: jaeger_network: driver: bridge
|
🔧 常用操作
查看日志
1
| docker compose logs -f jaeger-agent
|
查看 Agent 状态
1 2 3 4 5
| curl http://localhost:14271/
curl http://localhost:14271/metrics
|
重启服务
1
| docker compose restart jaeger-agent
|
🔌 应用集成
Java 应用集成
在应用中添加 Jaeger 客户端依赖:
1 2 3 4 5
| <dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>1.8.1</version> </dependency>
|
配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import io.jaegertracing.Configuration; import io.jaegertracing.internal.samplers.ConstSampler; import io.opentracing.Tracer;
Configuration config = new Configuration("my-service") .withSampler(new Configuration.SamplerConfiguration() .withType(ConstSampler.TYPE) .withParam(1)) .withReporter(new Configuration.ReporterConfiguration() .withLogSpans(true) .withAgentHost("localhost") .withAgentPort(6831));
Tracer tracer = config.getTracer();
|
Python 应用集成
安装依赖:
1
| pip install jaeger-client
|
配置:
1 2 3 4 5 6 7 8 9 10 11 12 13
| from jaeger_client import Config
config = Config( config={ 'sampler': { 'type': 'const', 'param': 1, }, 'logging': True, }, service_name='my-service', ) tracer = config.initialize_tracer()
|
Go 应用集成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import ( "github.com/uber/jaeger-client-go" "github.com/uber/jaeger-client-go/config" )
cfg := config.Configuration{ Sampler: &config.SamplerConfig{ Type: "const", Param: 1, }, Reporter: &config.ReporterConfig{ LogSpans: true, LocalAgentHostPort: "localhost:6831", }, }
tracer, closer, err := cfg.New("my-service", config.Logger(jaeger.StdLogger))
|
🔐 安全配置建议
1. 使用 TLS 加密
1 2 3 4 5 6 7 8
| command: - "--reporter.grpc.host-port=tracing-analysis-dc-sh.aliyuncs.com:1883" - "--reporter.grpc.tls.enabled=true" - "--reporter.grpc.tls.cert=/tls/client.crt" - "--reporter.grpc.tls.key=/tls/client.key" - "--reporter.grpc.tls.ca=/tls/ca.crt" volumes: - ./tls:/tls
|
2. 限制网络访问
生产环境建议不暴露端口,或使用防火墙限制:
1 2 3 4 5 6 7 8
|
networks: - internal_network
|
3. 使用环境变量保护敏感信息
1 2
| JAEGER_ACCESS_TOKEN=your_token_here
|
📊 监控与维护
查看 Agent 指标
Jaeger Agent 在 /metrics 端点提供 Prometheus 格式的指标:
1
| curl http://localhost:14271/metrics
|
常见指标
jaeger_agent_spans_received_total: 接收的 span 总数jaeger_agent_spans_dropped_total: 丢弃的 span 总数jaeger_agent_reporter_batches_submitted_total: 提交的批次总数
🐛 常见问题
1. Agent 无法连接到 Collector
- 检查 Collector 地址和端口是否正确
- 确认网络连通性
- 查看日志:
docker compose logs jaeger-agent
2. 没有追踪数据
- 确认应用配置的 Agent 地址和端口正确
- 检查采样率配置
- 验证应用是否正确发送追踪数据
3. 端口冲突
修改 docker-compose.yml 中的端口映射:
1 2 3
| ports: - "5776:5775/udp" - "6833:6831/udp"
|
📚 参考资源