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

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属性,导致报错。

解决步骤

  1. 提前执行监控配置
    把监控初始化代码移到所有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)
  1. 显式指定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
    )
  1. 升级依赖包
    考虑将azure-monitor-opentelemetry升级到最新稳定版本,新版本通常会修复这类兼容性问题:
pip install --upgrade azure-monitor-opentelemetry

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:13:18