Jaeger在Go中需手动集成SDK并配置reporter地址,否则span静默丢弃;必须设service_name、span.kind和component标签,调用Finish(),且跨goroutine或HTTP/gRPC调用时透传context与header。

Jaeger 在 Go 里不是开箱即用的“插件”,必须手动集成 SDK、配置采样策略、指定上报地址,且默认不自动捕获 HTTP/gRPC 入口——不配 jaegerhttp 或 jaegerthrift reporter,span 就发不出去,拓扑图永远为空。
Go 项目中初始化 Jaeger tracer 的正确姿势
别直接调 jaeger.NewTracer 手动拼 config;用官方推荐的 config.FromEnv + config.WithServiceName 组合,避免遗漏 reporter 配置。关键点是 reporter 必须显式设置 endpoint(如 http://localhost:14268/api/traces),否则 tracer 创建成功但 span 被静默丢弃。
-
service_name必须设,Jaeger UI 按该字段聚合服务节点 - 本地开发建议用
const jaeger.AllSampler,生产环境切jaeger.ProbabilisticSampler并设0.01类似值 - 若用 Docker 启 Jaeger,确保 Go 客户端能访问容器内网:host.docker.internal(Mac/Win)或宿主机 IP(Linux)
HTTP handler 中注入 context 并创建 span 的常见漏点
很多人只在 handler 里调 tracer.StartSpan,但没把 span ctx 注入到后续调用链中,导致下游服务无法继续 trace。核心是用 opentracing.ContextWithSpan 包装请求 context,并在所有跨 goroutine 或远程调用前传入。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- HTTP middleware 中应从
r.Context()提取 parent span,再StartSpanFromContext - 调下游 HTTP 时,必须用
othttp.Transport(不是原生http.Transport),否则 header 不带uber-trace-id - gRPC 场景需用
grpc_opentracing.UnaryClientInterceptor和grpc_opentracing.UnaryServerInterceptor
Jaeger UI 看不到拓扑图?先查这三件事
拓扑图依赖 service name + span tag + child-of 关系,缺一不可。最常踩的坑是 span 没打 span.SetTag("span.kind", "server") 或 "client",Jaeger 后端无法识别调用方向。
立即学习“go语言免费学习笔记(深入)”;
- 检查 span 是否调了
Finish():defer 写错位置(比如写在 if 分支外)会导致 span 不上报 - 确认所有 span 都有
span.SetTag("component", "net/http")这类标识,否则拓扑图节点不归类 - 用
curl -s http://localhost:16686/api/services查服务名是否注册成功;返回空数组说明 tracer 根本没连上
拓扑图生成依赖 span 间的父子关系和 tag 语义,不是只要 tracer 创建成功就自动出现。尤其要注意跨 goroutine 时 context 丢失、HTTP header 未透传、span kind 缺失这三点,它们比配置 endpoint 更容易被忽略。

















