Jaeger客户端初始化报invalid endpoint的根本原因是传输地址格式错误:Docker中应使用服务名如"jaeger-agent:6831"而非"localhost",HTTP reporter需完整URL如"http://jaeger-collector:14268/api/traces"。

Jaeger客户端初始化为什么总报 invalid endpoint
根本原因是 jaeger.NewUDPTransport 或 jaeger.NewHTTPTransport 的地址格式不对,不是“host:port”就是协议头写错了。本地开发常直接填 "localhost:6831",但 Docker 环境里 Jaeger Agent 默认只监听 0.0.0.0:6831,而 Go 进程若跑在另一个容器里,localhost 指向的是自己,不是 Agent 容器。
- 用 Docker Compose 时,Agent 地址应写成
"jaeger-agent:6831"(服务名),不是"localhost" - HTTP reporter(比如对接 Jaeger Collector)要用完整 URL:
"http://jaeger-collector:14268/api/traces",漏掉/api/traces就会 404 - UDP transport 不校验连通性,错填地址也不会立刻 panic,但 tracer 发出去的 span 全丢,得靠
jaeger.ReporterBuilder.SetLocalAgentHostPort配合日志确认是否真正连上了
opentracing.StartSpan 的 Tags 和 Logs 到底该填什么
Tags 是 span 的元数据,用于过滤和聚合;Logs 是事件快照,带时间戳,适合记录中间状态。混用会导致 UI 里查不到关键字段,或埋点膨胀。
- 必设 Tags:
"span.kind"("client"/"server")、"http.url"、"http.status_code"—— Jaeger UI 的「Trace Search」依赖这些字段做筛选 - 避免把大结构体 JSON 序列化后塞进 Tag,Tag 值建议控制在几百字节内;大日志用
span.LogFields(),比如log.String("sql", query) - 不要在循环里反复
span.Log(),高频打点会让 trace 存储暴涨;改用计数器 Tag:span.SetTag("db.query.count", count)
Go HTTP 中间件里怎么正确注入/提取 trace context
核心是用 opentracing.HTTPHeadersCarrier,而不是手动读写 X-B3-TraceId 这类 Zipkin 头。Jaeger 默认兼容 B3,但 Go client 默认走 Jaeger 自己的 uber-trace-id 格式,不一致就会断链。
- 服务端提取:用
tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)),别自己 parser.Header.Get("uber-trace-id") - 客户端注入:用
tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)),自动处理大小写和多值分隔 - 如果下游是 Python/Java 服务且只认 B3,启动 tracer 时加配置:
jaeger.TracerOptions.Injector(opentracing.HTTPHeaders, b3injector.NewB3Injector())
为什么本地能看到 trace,上 K8s 就全丢了
大概率是 Reporter 没配对采样策略,或者 sidecar 模式下 UDP 包被网络策略拦截。Jaeger 默认采样率 1(100%),但生产环境通常设成 0.001,低流量服务几乎没 span 上报。
立即学习“go语言免费学习笔记(深入)”;
- 检查
jaeger.NewReporter是否传了jaeger.SamplerConfig{Type: "const", Param: 1},K8s 环境建议用"probabilistic"并显式设Param: 1.0保底调试 - UDP 报文在 K8s 里可能被 CNI 插件限速或丢弃,优先换 HTTP reporter:
jaeger.NewHTTPReporter("http://jaeger-collector:14268/api/traces") - Pod 内应用启动早于 jaeger-agent sidecar,
NewUDPTransport初始化失败却静默忽略,得加健康检查:调transport.Close()后看 error 是否为 nil
最麻烦的其实是 context 传递被中间件截断——比如用了 gorilla/mux 但没把 req.Context() 透给 handler,或者自定义中间件忘了用 req.WithContext()。这种断链不会报错,trace 就突然变短一截。










