最小可行配置只需两步:安装 go.opentelemetry.io/otel/exporters/jaeger 并初始化 exporter,指定 WithAgentEndpoint 或 WithCollectorEndpoint 且必须包含 WithProcess;导出器需传给 sdktrace.NewTracerProvider 并设为全局 tracer,否则 Span 不生效。

Go 用 otel-exporter-jaeger 发 Trace 到 Jaeger 的最小可行配置
直接能跑通的配置就两步:装对包、初始化对 exporter。别碰 jaeger-client-go(老方案,已弃用),必须用 OpenTelemetry 官方维护的 go.opentelemetry.io/otel/exporters/jaeger(v1.12+ 推荐迁移到 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp + Jaeger 的 OTLP 接收器,但当前仍广泛用 Jaeger exporter)。
-
go get go.opentelemetry.io/otel/exporters/jaeger(注意不是jaeger-client-go) - 初始化时指定
jaeger.WithAgentEndpoint或jaeger.WithCollectorEndpoint,别漏掉jaeger.WithProcess,否则服务名在 Jaeger UI 里显示为空 - 若 Jaeger Agent 在本地 Docker,默认用
localhost:6831;若直连 Collector,端口是14268(HTTP)或14250(gRPC) - 导出器必须传给
sdktrace.NewTracerProvider,再设为全局 tracer —— 漏掉这步,trace.Span全是 noop
为什么 Span 不出现在 Jaeger UI?常见断点排查
90% 是 exporter 没生效或网络不通。先确认 tracer 是否真被用了:
- 打印
otel.GetTracerProvider().String(),输出不是NoopTracerProvider才算接入成功 - 启动时加
OTEL_LOG_LEVEL=debug,看日志里有没有Exporting span或connection refused - 用
telnet localhost 6831测试 Agent 端口是否可达;Docker 启动 Jaeger 时没加--network host或没映射端口,Go 进程就根本连不上 - Span 必须显式结束:
span.End()缺失会导致数据卡在内存 buffer 里不发
jaeger.WithAgentEndpoint vs jaeger.WithCollectorEndpoint 怎么选
Agent 模式轻量、低延迟,适合开发和中小流量;Collector 模式支持采样策略、认证、批量压缩,生产环境更稳。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- Agent(UDP,端口 6831):无连接、无重试,丢包不报错,适合本机或同局域网。代码里用
jaeger.WithAgentEndpoint(jaeger.WithAgentHost("localhost"), jaeger.WithAgentPort("6831")) - Collector(HTTP/gRPC):有响应、可重试、支持 TLS。HTTP 方式用
jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces"));gRPC 需额外加jaeger.WithCollectorEndpoint(..., jaeger.WithTLSCredentials(...)) - Agent 不做采样决策,全量转发给 Collector;Collector 可配
sampling.strategies-file实现动态采样
导出失败静默丢数据?必须加错误回调和超时控制
Jaeger exporter 默认不 panic,也不返回 error,失败就吞掉 Span。线上不能靠猜。
立即学习“go语言免费学习笔记(深入)”;
- 初始化 exporter 时传
jaeger.WithBatchTimeout(5 * time.Second),避免 buffer 积压太久 - 用
jaeger.WithNewExporter替代jaeger.New,可自定义exporter.WithErrorCallback,把失败写进日志或打监控指标 - 如果用 HTTP Collector,务必设
http.Client.Timeout,否则网络卡住会阻塞整个 trace pipeline - 别在
main()退出前忘了调tp.Shutdown(context.Background()),否则最后一批 Span 就丢了
Jaeger exporter 对 context deadline 敏感,Span 跨 goroutine 时容易因父 context cancel 导致导出被跳过 —— 这点常被忽略,尤其用 http.TimeoutHandler 或微服务间调用链里 context 传递不完整时。

















