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

如何在Quart(ASGI)应用中为App Insights请求遥测添加自定义维度

在Quart应用中为App Insights请求遥测添加自定义维度

结合你已有的OpenTelemetry配置,我们可以利用Quart的请求上下文和OpenTelemetry的Span API实现类似Asp.Net Core的自定义维度添加逻辑,具体步骤如下:

实现思路

  1. 用Quart的请求作用域对象g存储自定义维度字典(每个请求独立,避免跨请求污染)
  2. 通过Quart的before_request钩子初始化字典,after_request钩子在请求结束前将字典内容附加到当前OpenTelemetry Span
  3. 提供全局可访问的方式,在代码任意位置向字典添加自定义维度

完整代码修改

1. 导入必要模块

在你的应用代码顶部添加:

from quart import g
from opentelemetry.trace import get_current_span

2. 添加自定义维度中间件

创建一个中间件函数,处理请求前后的自定义维度逻辑:

def setup_custom_dimensions(app):
    # 请求开始时初始化自定义维度字典
    @app.before_request
    async def init_custom_dimensions():
        g.custom_dimensions = {}

    # 请求结束时将自定义维度附加到遥测Span
    @app.after_request
    async def attach_custom_dimensions(response):
        if hasattr(g, "custom_dimensions") and g.custom_dimensions:
            current_span = get_current_span()
            # 将字典中的键值对添加为Span属性,自动映射到App Insights的customDimensions
            for key, value in g.custom_dimensions.items():
                # App Insights要求值为字符串,非字符串类型需转换
                current_span.set_attribute(key, str(value))
        return response

3. 更新应用初始化逻辑

在create_app函数中注册上述中间件:

def create_app():
    tracer_provider = TracerProvider()
    tracer_provider.add_span_processor(BatchSpanProcessor(AzureMonitorTraceExporter()))
    app = Quart(__name__)
    app.asgi_app = OpenTelemetryMiddleware(app.asgi_app, tracer_provider=tracer_provider)
    
    # 注册自定义维度中间件
    setup_custom_dimensions(app)
    
    app.register_blueprint(bp)
    return app

4. 在任意代码位置添加自定义维度

在路由处理函数、服务逻辑等任意请求作用域内的代码中,直接通过g.custom_dimensions添加维度:

@bp.route("/api/user/<user_id>")
async def get_user(user_id):
    # 添加自定义维度
    g.custom_dimensions["user_id"] = user_id
    g.custom_dimensions["request_source"] = "mobile_app"
    
    # 业务逻辑...
    return {"user_id": user_id, "status": "success"}

关键说明

  • Quart的g对象是请求作用域的,每个请求会创建独立的实例,完全符合你要求的"请求作用域字典"需求
  • OpenTelemetry的get_current_span()会获取当前请求对应的Span,设置的属性会被Azure Monitor Exporter自动映射到App Insights的customDimensions字段
  • 如果需要添加复杂类型的维度(如字典、列表),可以用json.dumps()序列化为字符串后再添加

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:46:25