在Go-kit中桥接OpenTracing到OpenTelemetry遇导出器故障求助
问题分析与修复方案
核心问题
你代码里创建了两个独立的TracerProvider实例:
tp没有配置任何SpanProcessor,桥接时用的就是这个实例的Tracer,导致生成的追踪数据根本不会传递到导出器。tracerProvider虽配置了SpanProcessor和导出器,但仅被设为全局TracerProvider,未在桥接逻辑中使用。
修复后的代码
exp, err := otlptracehttp.New(ctx, otlptracehttp.WithInsecure(), otlptracehttp.WithEndpoint("localhost:4318")) if err != nil { panic(err) } // 仅创建一个TracerProvider,同时配置采样器和SpanProcessor tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithSpanProcessor(sdktrace.NewSimpleSpanProcessor(exp)), ) otel.SetTracerProvider(tracerProvider) // 桥接时使用配置完整的TracerProvider的Tracer otTracer, err := otbridge.NewTracerPair(tracerProvider.Tracer("service")) if err != nil { panic(err) } stdopentracing.SetGlobalTracer(otTracer) // 关键:程序退出前调用Shutdown,确保追踪数据被完整发送 defer func() { if err := tracerProvider.Shutdown(ctx); err != nil { log.Printf("failed to shutdown tracer provider: %v", err) } }()
额外检查项
- 确认OpenTelemetry Collector正在
localhost:4318监听HTTP请求,可通过curl http://localhost:4318/v1/traces测试连通性。 - 确保依赖包版本兼容,建议使用最新稳定版的
go.opentelemetry.io/otel、go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp和go.opentelemetry.io/otel/bridge/opentracing。 - 不要忽略
otbridge.NewTracerPair返回的错误,实际代码中需处理该错误以避免潜在问题。
内容的提问来源于stack exchange,提问作者paulturnip
相关产品推荐
相关产品推荐

