为python-dependency-injector编写OpenTelemetry Provider遇导出失败问题
1. 确认Jaeger服务正常运行
- 若用Docker部署Jaeger,执行
docker ps检查容器是否处于运行状态,确保启动命令映射了14250端口:docker run -d --name jaeger \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 16686:16686 \ -p 14268:14268 \ -p 14250:14250 \ jaegertracing/all-in-one:latest - 本地部署的Jaeger,检查服务是否启动,14250端口是否被监听(可执行
netstat -an | grep 14250或ss -tulpn | grep 14250验证)。
2. 修正Collector Endpoint格式
代码中collector_endpoint缺少协议前缀,GRPC exporter需要完整的URL:
jaeger_exporter = grpc.JaegerExporter( collector_endpoint="http://localhost:14250", # 添加http://前缀 insecure=True, )
3. 确保Span被正确导出(处理异步批量逻辑)
BatchSpanProcessor默认异步批量导出,程序结束前可能未完成导出,需手动关闭TracerProvider等待导出完成:
在return tracer之前添加:
# 等待所有span导出完成 trace.get_tracer_provider().shutdown()
若程序为长期运行服务,此步骤可放在程序退出时执行。
4. 代码优化(避免私有属性访问)
不要直接访问私有属性span._context.span_id,改用公开API:
print(span.get_span_context().span_id)
修正后的完整代码
from dependency_injector import providers from opentelemetry import trace from opentelemetry.exporter.jaeger.proto import grpc from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor class OpenTelemetryProvider(providers.Provider): def _provide(self, *args, **kwargs): # 初始化TracerProvider tracer_provider = TracerProvider() trace.set_tracer_provider(tracer_provider) tracer = trace.get_tracer(__name__) # 修正Collector Endpoint格式 jaeger_exporter = grpc.JaegerExporter( collector_endpoint="http://localhost:14250", insecure=True, ) span_processor = BatchSpanProcessor(jaeger_exporter) tracer_provider.add_span_processor(span_processor) with tracer.start_as_current_span("foo") as span: # 使用公开API获取span_id print(span.get_span_context().span_id) print("Hello world!") # 等待span导出完成 tracer_provider.shutdown() return tracer
内容的提问来源于stack exchange,提问作者batazor
相关产品推荐
相关产品推荐

