Azure App Service部署Python3.12应用时azure-monitor-opentelemetry抛异常
问题描述
我有一个基于Plotly Dash构建的Python Web应用,使用Python 3.12部署在Azure App Service上。由于Azure App Service暂未为Python 3.12版本启用Application Insights,因此我使用azure-monitor-opentelemetry==1.6.2包将异常日志记录到Application Insights资源中。但部署后,当用户访问Web应用时,Application Insights中记录了如下异常:
Failed to derive Resource from Tracer Provider: 'ProxyTracerProvider' object has no attribute 'resource'
回溯信息:
Traceback (most recent call last): File "/tmp/8dcd22e385c2da5/antenv/lib/python3.12/site-packages/azure/monitor/opentelemetry/exporter/export/trace/_exporter.py", line 91, in export resource = tracer_provider.resource # type: ignore
AttributeError: 'ProxyTracerProvider' object has no attribute 'resource'
我的实现代码如下:
appopentelemetry.py
from azure.monitor.opentelemetry import configure_azure_monitor from models.environmentmanager.environmentmanager import EnvironmentManager def azure_monitoring_open_telemetry(): environment_manager = EnvironmentManager() connection_string = environment_manager.get_connection_string() # 获取Application Insights连接字符串 return configure_azure_monitor( connection_string=connection_string, enable_live_metrics=True, )
app.py
...imports... environment_manager = EnvironmentManager() # 非本地环境时执行监控配置,本地环境通过.env设置,Azure部署时通过应用服务环境变量设置 if not environment_manager.get_is_local(): from functions.app.appopentelemetry import azure_monitoring_open_telemetry azure_monitoring_open_telemetry() ... app = Dash(__name__, use_pages=True, external_stylesheets=stylesheets) ... app.layout = dmc.MantineProvider(...) if __name__ == '__main__': app.run(debug=True, port=8000)
问题分析与解决方法
这个错误是因为OpenTelemetry监控配置的初始化时机滞后于Dash应用的初始化流程。Dash在创建应用实例时,会隐式触发OpenTelemetry的代理追踪器(ProxyTracerProvider)创建,而后续调用configure_azure_monitor时,无法从已存在的代理追踪器中获取resource属性,导致报错。
解决步骤
- 提前执行监控配置
把监控初始化代码移到所有Dash相关导入和应用创建之前,确保在Dash启动任何OpenTelemetry相关逻辑前完成监控配置。修改后的app.py结构如下:
# 先导入基础模块和环境管理类 ...基础imports... from models.environmentmanager.environmentmanager import EnvironmentManager environment_manager = EnvironmentManager() # 优先初始化监控配置 if not environment_manager.get_is_local(): from functions.app.appopentelemetry import azure_monitoring_open_telemetry azure_monitoring_open_telemetry() # 再导入Dash相关模块 import dash from dash import dcc, html, Input, Output import dash_mantine_components as dmc from dash import page_registry, page_container ... # 创建Dash应用实例 app = Dash(__name__, use_pages=True, external_stylesheets=stylesheets) ... app.layout = dmc.MantineProvider(...) if __name__ == '__main__': app.run(debug=True, port=8000)
- 显式指定Resource参数(可选)
如果提前初始化仍有问题,可以在configure_azure_monitor中直接传入自定义Resource,避免依赖Tracer Provider的自动推导:
from azure.monitor.opentelemetry import configure_azure_monitor from opentelemetry.sdk.resources import Resource, SERVICE_NAME from models.environmentmanager.environmentmanager import EnvironmentManager def azure_monitoring_open_telemetry(): environment_manager = EnvironmentManager() connection_string = environment_manager.get_connection_string() # 显式定义资源属性 resource = Resource(attributes={ SERVICE_NAME: "你的应用名称" }) return configure_azure_monitor( connection_string=connection_string, enable_live_metrics=True, resource=resource )
- 升级依赖包
考虑将azure-monitor-opentelemetry升级到最新稳定版本,新版本通常会修复这类兼容性问题:
pip install --upgrade azure-monitor-opentelemetry
内容的提问来源于stack exchange,提问作者Jason Susanto
相关产品推荐
相关产品推荐

