You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为python-dependency-injector编写OpenTelemetry Provider遇导出失败问题

解决OpenTelemetry Jaeger导出报错 Failed to export batch. Status code: StatusCode.UNAVAILABLE

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:02:55