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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:06:05