Go语言如何用Jaeger_Go语言Jaeger链路追踪教程【完整】
Jaeger客户端初始化报nil pointer dereference的根本原因是未调用cfg.NewTracer()或调用前未设置cfg.ServiceName和cfg.SamplerServiceName必设Sampler需指定type与param须defer tracer.Close()防goroutine泄漏HTTP/gRPC需手动注入提取trace上下文Reporter端口协议要匹配跨goroutine finish span会导致链路截断。Jaeger客户端初始化为什么总报nil pointer dereference根本原因是没调用cfg.NewTracer()或者调用前没正确设置cfg.ServiceName和cfg.Sampler。Jaeger的config.Configuration是值类型修改字段后必须显式调用NewTracer()生成实例否则tracer为nil。必须设置cfg.ServiceName否则NewTracer()返回nil且不报错采样器不能留空本地开发用cfg.Sampler.Type const cfg.Sampler.Param 1生产环境建议probabilistic忘记defer tracer.Close()会导致goroutine泄漏尤其在短生命周期命令行工具里特别明显HTTP服务注入/提取traceID时opentracing.HTTPHeaders不起作用Go标准库http.Client和http.ServeMux都不自动处理trace上下文必须手动在RoundTrip和Handler里注入/提取。直接传opentracing.HTTPHeaders只是个键名不是自动行为。客户端侧用othttp.Transport包装http.DefaultTransport或自己实现RoundTripper调用tracer.Inject()服务端侧用othttp.Middleware包装handler它会从uber-trace-id头读取并创建span别依赖req.Header.Set(uber-trace-id, ...)手写——格式要符合Jaeger的TraceID:SpanID:ParentID:Flags十六进制字符串错一位就丢链路Go微服务间gRPC调用怎么透传trace上下文gRPC默认不传递OpenTracing上下文必须用grpc_opentracing插件且要注意拦截器注册顺序和context传递时机。服务端注册grpc.StreamInterceptor(otgrpc.OpenTracingStreamServerInterceptor(tracer))和grpc.UnaryInterceptor(...)客户端调用时必须把span context塞进context.Context用opentracing.ContextWithSpan(ctx, span)再传给client.Method(ctx, req)如果用了grpc.WithBlock()或自定义DialOptions确保拦截器在WithUnaryInterceptor之后注册否则context丢失注意grpc-go v1.38对context.WithValue更严格避免在中间件里覆盖原context的span键本地调试时Jaeger UI看不到span但日志显示reporter: submitting X spans大概率是Reporter配置没对齐本地Jaeger Agent默认监听localhost:6831compact thrift而Go客户端默认走localhost:6832binary thrift或直连Collector HTTP端口协议不匹配导致静默丢数据。 AI Code Reviewer AI自动审核代码