能实现,但关键在上下文传递完整:fastapi需调用fastapiinstrumentor.instrument_app()并预设带servicename的tracerprovider,http跨服务调用必须用instrumented客户端(如httpx.asyncclient+httpxclientinstrumentor),否则traceparent头无法自动注入。

能实现,但关键不在“装包”而在上下文传递是否完整——尤其是跨服务 HTTP 调用时,traceparent 头必须由 instrumentation 自动注入,不能靠手动拼接或漏掉异步客户端。
FastAPI 服务端必须启用 FastAPIInstrumentor 并配置全局 TracerProvider
只装 opentelemetry-instrumentation-fastapi 不够,不调用 instrument_app() 就不会自动创建 Span;更常见的是忘了初始化 TracerProvider,导致 get_tracer() 返回空 tracer,所有 Span 静默丢弃。
- 必须在
app = FastAPI(...)创建后、uvicorn.run()前执行FastAPIInstrumentor.instrument_app(app) -
TracerProvider要提前设置,且推荐带Resource标识服务名:TracerProvider(resource=Resource.create({SERVICE_NAME: "user-service"})) - 导出器(如
JaegerExporter)需通过SpanProcessor绑定到 provider,用BatchSpanProcessor而非SimpleSpanProcessor(后者阻塞主线程,压测时易超时)
跨服务调用必须用支持 OpenTelemetry 的 HTTP 客户端
直接用 requests.get() 或 httpx.get()(未 instrument)会断链:TraceID 不会自动写入 traceparent 请求头,下游服务收不到上下文。
- 同步场景:安装
opentelemetry-instrumentation-requests,启动时调用RequestsInstrumentor().instrument() - 异步场景(更常见):必须用
httpx.AsyncClient+opentelemetry-instrumentation-httpx,并调用HTTPXClientInstrumentor().instrument() - 禁用
httpx.Client(同步)和aiohttp(除非显式 instrument),它们默认不传播 context
traceparent 头的生成与透传是自动的,但依赖 W3C 标准兼容性
OpenTelemetry 默认按 W3C Trace Context 规范生成 traceparent: 00-<trace_id>-<span_id>-01</span_id></trace_id>。如果下游是旧版 Jaeger SDK(如 Java
- 验证方法:在 FastAPI 路由里打印
request.headers.get("traceparent"),上游请求应有值,下游服务入口也应能读到 - 若下游是 Flask,需确保装了
opentelemetry-instrumentation-flask并调用FlaskInstrumentor().instrument_app(app) - 避免在 Nginx / API 网关层过滤或重写
traceparent、tracestate头
Jaeger 后端部署必须匹配 exporter 配置
本地开发常用 jaegertracing/all-in-one 镜像,但它的接收端口和协议要和代码里的 JaegerExporter 严格对应。
- Docker 启动命令中暴露的
-p 6831:6831/udp是 Thrift over UDP 默认端口,代码里JaegerExporter(agent_host_name="localhost", agent_port=6831)才能通 - 如果改用 gRPC 模式(如
JeagerExporter(endpoint="http://localhost:14250")),Docker 必须开启-p 14250:14250并确认镜像版本支持(1.32+) - 访问
http://localhost:16686查看 traces 前,先 curl 一次接口,等几秒再刷——Jaeger UI 默认只查最近 1 小时数据,且 batch 上报有延迟
最容易被忽略的是异步上下文隔离:同一个 async def 函数里启动多个 httpx.AsyncClient 请求,若没用 Depends 或 contextvars 显式绑定 client 实例,可能复用错误的 trace context。别假设“只要用了 instrument 就万事大吉”。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











