jaeger客户端初始化必须显式指定agent地址:docker/wsl中用host.docker.internal:6831或网关ip,禁用go编译优化(-n -l),并手动透传jaeger_*环境变量至goland调试进程,否则span静默丢失。

Jaeger客户端初始化必须匹配本地agent地址
本地调试时,jaeger.NewUDPTransport 默认连 localhost:6831,但 GoLand 启动的进程若在 Docker 容器或 WSL 中运行,localhost 指向的是容器/子系统自身,而非宿主机上的 Jaeger agent。结果是 span 全丢,UI 里看不到任何链路。
解决办法是显式指定宿主机网关地址:
- macOS/Linux:用
host.docker.internal:6831(Docker Desktop 支持)或172.17.0.1:6831(Docker bridge 网关) - Windows + WSL2:用
172.28.0.1:6831或host.docker.internal:6831 - 纯本地进程(非容器):确认
jaeger-all-in-one是否真在localhost:6831运行:docker run -d -p 6831:6831/udp -p 16686:16686 jaegertracing/all-in-one:latest
GoLand 调试配置需禁用编译优化
启用 -gcflags "all=-N -l" 不只是为了断点生效,Jaeger 的 span 注入依赖未内联的函数调用栈。若没加这俩 flag,opentracing.StartSpan 可能被优化掉,或 span.context 无法正确传播,导致下游服务收不到 traceID。
在 GoLand 的 Run Configuration → go build 选项卡中填入:
gcflags: all=-N -l
注意:all= 前不能有空格,且该设置对 go run 无效——必须用 dlv debug 或构建后调试。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
OpenTracing 与 OpenTelemetry 兼容性陷阱
如果你项目用的是 opentracing-go,但本地启动的是 OpenTelemetry Collector 或新版 Jaeger UI(v2+),会发现 span 显示不全或 metadata 丢失。因为 OTel 协议和 OpenTracing wire format 不完全兼容。
临时绕过方式(仅限本地调试):
- 降级 Jaeger UI:
docker run -d -p 6831:6831/udp -p 16686:16686 jaegertracing/all-in-one:1.49 - 改用
jaeger-client-go官方维护分支(非社区 fork),确保Inject/Extract行为一致 - 避免混用:
opentracing.GlobalTracer()和otel.Tracer()不要同时注册,否则 context 传递错乱
环境变量未透传导致 tracer 初始化失败
GoLand 默认不会把 shell 中的 JAEGER_SERVICE_NAME、JAEGER_AGENT_HOST 等变量带进调试进程。即使代码里写了 os.Getenv("JAEGER_SERVICE_NAME"),运行时也返回空字符串,tracer 初始化直接 panic。
必须手动在 Run Configuration → Environment variables 里补全:
JAEGER_SERVICE_NAME=your-service-name JAEGER_AGENT_HOST=host.docker.internal JAEGER_AGENT_PORT=6831 JAEGER_SAMPLER_TYPE=const JAEGER_SAMPLER_PARAM=1
特别注意:JAEGER_AGENT_HOST 和代码中 NewUDPTransport 的 host 必须一致;大小写敏感,拼错一个字母就静默失效。
span.Context()。这个上下文是否被中间件、client 库、goroutine 启动方式意外截断,比配置本身更难排查。










