发布于2026-07-11 阅读(0)
扫一扫,手机访问
在微服务架构中,调用链追踪的能力已经成为定位性能瓶颈的关键手段。不过,很多团队在实际落地Jaeger时,往往会碰到一些让人头疼的“坑”——不是数据出不来,就是查到了也对不上号。今天,我们就来拆解几个常见场景,看看问题到底出在哪。

一个很典型的场景是:直接调用 opentracing.GlobalTracer().StartSpan(),然后程序就 panic 了,报 nil pointer dereference。有些同学第一反应是代码写错了,但其实问题根源在于初始化没成功,却让代码继续跑下去了。
Go 的 opentracing.GlobalTracer() 默认返回的是一个空实现,正常情况下不会 panic,但一旦真正调用了那个空实现的 StartSpan,就会崩。这里有几条硬核建议:
cfg.NewTracer(),并且检查 err 返回值,千万别忽略它log.Printf("global tracer: %v", opentracing.GlobalTracer()),确认它不再是 SERVICE_NAME 读localhost:6831,但在 Docker 或 WSL 环境下经常不通。这时候可以改用 ReporterConfig.AgentHost 指向宿主机 IP,或者直接切到 HTTP reporter,比如配置 WithCollectorEndpoint("http://jaeger-collector:14268/api/traces")你可能在 Jaeger UI 里看到一堆孤立的 Span,没有 Parent Span ID,而且 TraceID 在各服务间对不上——这不是 Jaeger 没收到数据,而是上下文根本没传下去。
这里面有几个关键点:
http.Request.Context() 是唯一可信的载体。手动在 Header 里设 X-Trace-ID 只能传 ID,但丢失了采样决策和 Span 状态tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) 解析出父 contexttracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) 注入上下文ctx = context.WithValue(parentCtx, key, val) 传递 span,否则它会新建一条 trace火焰图里只看到一个 “http.handle” 耗时 800ms,但根本不知道是 DB 慢、Redis 卡还是下游 gRPC 超时——这就是 Span 太粗了。反过来,如果在 for 循环里给每个 db.QueryRow 都建一个 Span,Jaeger 的存储会暴涨,查询也会变得很卡——这就是 Span 太细了。
合理的做法是:
opentracing.StartSpanFromContext(ctx, "http.handle"),类型设为 ext.SpanKindRPCServertracer.StartSpan("db.query", opentracing.ChildOf(parentSpan.Context()))SamplerTypeConst 配参数 1,改用 SamplerTypeProbabilistic 配 0.01,或者接 jaeger.RemoteSampler 实现动态调控本地跑一个 docker run -d --name jaeger -p 16686:16686 jaegertracing/all-in-one,UI 打开却搜不到自己服务的 trace。这时候很多人会开始怀疑代码是不是写错了,但其实数据根本没到 collector。
可以先做几步基础检查:
netstat -uln | grep 6831,在宿主机上用 nc -u localhost 6831 测试连通性service.name: "deardai-shop"(带引号)来验证database/sql、redis-go,需要额外接入 otel/instrumentation 包,否则 DB 和 Redis 的调用不会自动生成子 Span说到底,真正卡住你的地方往往不是 Span 创建本身,而是 context 传递中断、goroutine 分支漏传、或第三方库没有插桩。这些点不补上,哪怕埋点再细,也只是一堆孤岛。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8