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

OpenCensus+Flask+requests场景下GCP Cloud Trace链路跨服务传播问题

解决方案与可运行示例

核心问题原因

你只完成了 Flask 服务侧接收追踪上下文的配置,但 requests 库默认不会自动将当前服务的 trace 信息注入到出站请求头中,导致上下游服务的 trace 无法串联,每个服务都会生成独立的 trace id。你需要额外集成 OpenCensus 的 requests 追踪组件,完成链路传播的闭环。

前置依赖安装

pip install flask requests opencensus opencensus-ext-flask opencensus-ext-requests opencensus-ext-stackdriver

完整示例代码

我们用两个简单的 Flask 服务模拟跨服务调用场景:

1. 下游服务(service_b.py,监听端口 5001)

from flask import Flask
from opencensus.ext.flask.flask_middleware import FlaskMiddleware
from opencensus.ext.stackdriver.trace_exporter import StackdriverExporter
from opencensus.trace.propagation import google_cloud_format
from opencensus.trace.samplers import AlwaysOnSampler

app = Flask(__name__)

# 配置OpenCensus追踪
exporter = StackdriverExporter()
propagator = google_cloud_format.GoogleCloudFormatPropagator()

# 注册Flask中间件
middleware = FlaskMiddleware(
    app,
    exporter=exporter,
    sampler=AlwaysOnSampler(),
    excludelist_paths=['healthz', 'metrics'],
    propagator=propagator
)

@app.route('/downstream')
def downstream_api():
    return "Response from downstream service"

if __name__ == '__main__':
    app.run(port=5001, debug=True)

2. 上游服务(service_a.py,监听端口 5000,调用下游服务)

import requests
from flask import Flask
from opencensus.ext.flask.flask_middleware import FlaskMiddleware
from opencensus.ext.stackdriver.trace_exporter import StackdriverExporter
from opencensus.ext.requests import trace as requests_trace
from opencensus.trace.propagation import google_cloud_format
from opencensus.trace.samplers import AlwaysOnSampler

app = Flask(__name__)

# 关键:注册requests追踪集成,自动将trace信息注入出站请求头
requests_trace.trace_integrations(['requests'])

# 配置OpenCensus追踪,和下游服务保持传播器一致
exporter = StackdriverExporter()
propagator = google_cloud_format.GoogleCloudFormatPropagator()

middleware = FlaskMiddleware(
    app,
    exporter=exporter,
    sampler=AlwaysOnSampler(),
    excludelist_paths=['healthz', 'metrics'],
    propagator=propagator
)

@app.route('/upstream')
def upstream_api():
    # 调用下游服务,requests会自动带上trace相关头信息
    resp = requests.get('http://localhost:5001/downstream')
    return f"Upstream got response: {resp.text}"

if __name__ == '__main__':
    app.run(port=5000, debug=True)

配置与验证说明

  • 权限配置:本地运行时需要设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向有权限写入Cloud Trace的GCP服务账号密钥文件,部署到GCE、GKE、Cloud Run等GCP服务时会自动获取默认服务账号权限,无需额外配置。
  • 传播器选择:如果你的链路仅在GCP生态内,统一使用 GoogleCloudFormatPropagator 即可;如果有非GCP的异构服务需要串联,再统一切换为B3或者W3C TraceContext传播器,上下游传播器必须保持一致才能正常解析上下文。
  • 验证:启动两个服务后访问 http://localhost:5000/upstream,稍等片刻到GCP Cloud Trace控制台查看,即可看到同一个Trace ID下包含上游服务接收请求、上游调用下游、下游服务接收请求三个Span,形成完整链路。

内容的提问来源于stack exchange,提问作者Alex Mattson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:01