如何在Quart(ASGI)应用中为App Insights请求遥测添加自定义维度
在Quart应用中为App Insights请求遥测添加自定义维度
结合你已有的OpenTelemetry配置,我们可以利用Quart的请求上下文和OpenTelemetry的Span API实现类似Asp.Net Core的自定义维度添加逻辑,具体步骤如下:
实现思路
- 用Quart的请求作用域对象
g存储自定义维度字典(每个请求独立,避免跨请求污染) - 通过Quart的
before_request钩子初始化字典,after_request钩子在请求结束前将字典内容附加到当前OpenTelemetry Span - 提供全局可访问的方式,在代码任意位置向字典添加自定义维度
完整代码修改
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
相关产品推荐
相关产品推荐

