以下是 Jaeger 组件(Collector、UI 等)的详细部署和使用步骤,涵盖 Docker 和 Kubernetes 两种常见环境:
一、部署前准备
-
选择存储后端 :
Jaeger 依赖外部存储,常用选项: • Elasticsearch (推荐):适合生产环境,支持高吞吐量和复杂查询。 • Cassandra :适合大规模写入场景,但查询性能较弱。 • 内存存储(测试用):仅用于快速验证,数据不持久化。
-
环境准备 :
• 安装 Docker 和 Docker Compose(Docker 部署) 或 Kubernetes 集群(如 Minikube)。 • 下载 Jaeger 官方镜像:
jaegertracing/all-in-one
(测试用)或分体组件。
二、部署方案 1:使用 Docker Compose(适合本地测试)
步骤 1:编写 docker-compose.yml
yaml
version: '3'
services:
# 存储后端:Elasticsearch
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "9200:9200"
- "9300:9300"
volumes:
- esdata:/usr/share/elasticsearch/data
# Jaeger 组件
jaeger-collector:
image: jaegertracing/jaeger-collector:1.42
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
ports:
- "14250:14250" # 接收 Agent 发送的 Thrift 格式数据
- "14268:14268" # 接收客户端直接发送的 JSON 数据
depends_on:
- elasticsearch
jaeger-query:
image: jaegertracing/jaeger-query:1.42
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
ports:
- "16686:16686" # Jaeger UI 访问端口
depends_on:
- elasticsearch
volumes:
esdata:
步骤 2:启动服务
bash
docker-compose up -d
步骤 3:验证服务
-
检查 Elasticsearch:
bashcurl http://localhost:9200/_cat/health
输出应为
green
状态。 -
访问 Jaeger UI :
打开浏览器访问
http://localhost:16686
。
三、部署方案 2:使用 Kubernetes(适合生产环境)
步骤 1:通过 Helm 快速部署
bash
# 添加 Jaeger Helm 仓库
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update
# 部署 Elasticsearch(若尚未部署)
helm install elasticsearch elastic/elasticsearch --version 7.14.0
# 部署 Jaeger
helm install jaeger jaegertracing/jaeger \
--set storage.type=elasticsearch \
--set storage.elasticsearch.host=elasticsearch-master \
--set storage.elasticsearch.port=9200
步骤 2:暴露 Jaeger UI
bash
kubectl port-forward svc/jaeger-query 16686:16686
访问 http://localhost:16686
。
部署可以参考官方文档:github.com/jaegertraci...
四、配置微服务发送数据到 Jaeger
Go 服务示例(使用 OpenTelemetry SDK)
-
初始化 Tracer Provider:
gopackage main import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" ) func initTracer() { // 1. 创建 Jaeger Exporter exporter, _ := jaeger.New(jaeger.WithCollectorEndpoint( jaeger.WithEndpoint("http://jaeger-collector:14268/api/traces"), )) // 2. 配置 Tracer Provider tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), sdktrace.WithResource(resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceNameKey.String("my-go-service"), )), ) // 3. 注册为全局 Tracer otel.SetTracerProvider(tp) } func main() { initTracer() // ... 启动 HTTP/RPC 服务 }
-
发送追踪数据 :
确保服务网络可访问
jaeger-collector
的端点(如 Kubernetes 中通过 Service 名访问)。
五、使用 Jaeger UI 分析数据
-
查找 Trace :
• 在 Jaeger UI 中选择服务名(如
my-go-service
),设置时间范围后点击Find Traces
。 -
分析 Trace 详情 :
• 查看完整的调用链、Span 耗时和层级关系。
• 点击单个 Span 可查看标签(Tags)、日志(Logs)和错误状态。
-
过滤和搜索 :
• 使用标签(如
http.method=GET
)或操作名(Operation)过滤 Trace。
六、关键配置说明
组件 | 配置项 | 说明 |
---|---|---|
Collector | SPAN_STORAGE_TYPE |
指定存储类型(如 elasticsearch 、cassandra ) |
ES_SERVER_URLS |
Elasticsearch 集群地址(多个节点用逗号分隔) | |
Query (UI) | SPAN_STORAGE_TYPE |
必须与 Collector 的存储类型一致 |
Agent | JAEGER_AGENT_HOST |
微服务通过 Agent 上报数据时指定的主机(通常为 localhost 或 Service 名) |
JAEGER_AGENT_PORT |
Agent 监听端口(默认 6831 UDP) |
七、常见问题排查
-
Collector 无法连接 Elasticsearch :
• 检查网络连通性(如防火墙、Kubernetes Service 名称)。
• 验证 Elasticsearch 健康状态:
curl http://elasticsearch:9200/_cat/health
。 -
Jaeger UI 无数据 :
• 确认微服务是否正确配置了 Exporter 端点。
• 检查 Collector 日志:
docker logs <collector-container-id>
。 -
存储性能瓶颈 :
• 增加 Elasticsearch 分片数或使用更高性能的存储(如 SSD)。
• 调整 Jaeger 的采样率(如仅收集 10% 的请求)。
通过以上步骤,您可以快速搭建一个完整的 Jaeger 追踪系统,并集成到 Go 微服务中。