OpenTelemetry顶层span ID传递问题:FastAPI+Requests链路追踪异常
问题根因
你当前的配置只完成了传播器的全局设置,缺失了OpenTelemetry最核心的TracerProvider初始化逻辑,没有这个组件,OpenTelemetry不会为当前服务的入站请求生成新的Span,因此调用requests发起下游请求时只会原封不动透传接收到的 trace 头,不会生成新的spanid、设置父spanid。
修复方案
调整配置顺序,在所有Instrument操作之前完成TracerProvider的初始化即可,你不需要额外配置Exporter,因为你的场景中Istio已经负责链路数据导出,只要保证Span生成逻辑正常运行就可以正确传递trace头。
修改后的完整代码如下:
import requests from opentelemetry.baggage.propagation import W3CBaggagePropagator from opentelemetry.propagators.composite import CompositePropagator from fastapi import FastAPI from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor from opentelemetry.instrumentation.requests import RequestsInstrumentor from opentelemetry.propagate import set_global_textmap from opentelemetry.propagators.b3 import B3MultiFormat from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator # 新增导入 from opentelemetry.sdk.trace import TracerProvider from opentelemetry.trace import set_tracer_provider # 初始化TracerProvider 必须放在所有Instrument操作之前 trace_provider = TracerProvider() set_tracer_provider(trace_provider) # 如果你不需要本地打印Span调试,可以不用配置任何Exporter,不影响trace头传递 set_global_textmap(CompositePropagator([B3MultiFormat(), TraceContextTextMapPropagator(), W3CBaggagePropagator()])) app = FastAPI() FastAPIInstrumentor.instrument_app(app) RequestsInstrumentor().instrument() @app.get("/") async def get_things(): r = requests.get("http://localhost:8081") return { "Hello": "world", "result": r.json() }
额外优化建议
你当前在异步路由中使用同步的requests库会阻塞FastAPI的事件循环,影响服务并发性能,建议换成异步HTTP客户端httpx,同时使用OpenTelemetry的httpx Instrumentation来实现链路自动传递。
内容的提问来源于stack exchange,提问作者iLikeBreakfast
相关产品推荐
相关产品推荐

