App Service容器部署配置Application Insights无数据上报问题
容器化FastAPI on App Service 接入Application Insights无数据的解决步骤
你遇到的是自定义容器+Python FastAPI场景接入Application Insights(以下简称AI)的典型问题,按以下顺序排查即可:
- 先修正连接字符串配置
不要在代码里硬编码InstrumentationKey,App Service关联AI资源后会自动注入APPLICATIONINSIGHTS_CONNECTION_STRING环境变量,直接从环境变量读取即可:
先去App Service的「配置-应用程序设置」页确认该环境变量确实存在,值为AI资源概览页展示的完整连接字符串(不是单独的InstrumentationKey,新的AI资源连接字符串包含ingestion端点地址,只填ikey会因为上报地址错误导致数据发不出去)。如果环境变量缺失,手动粘贴完整连接字符串添加即可。import os conn_string = os.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING")注意:Python logging默认级别为WARNING,低于该级别的日志不会被处理器捕获上报,需要手动设置日志级别:
logger.setLevel(logging.INFO) - 补全缺失的请求追踪组件
你当前的代码只配置了日志处理器和基础指标导出器,没有接入FastAPI的请求中间件,也没有配置链路追踪导出器,所以接口请求数、响应时间、失败率这些核心数据根本不会被采集上报。
首先安装缺失的依赖:
然后在FastAPI初始化后添加中间件:pip install opencensus-ext-fastapi opencensus-ext-azurefrom opencensus.ext.fastapi import FastAPIMiddleware from opencensus.ext.azure.trace_exporter import AzureExporter from opencensus.trace.samplers import ProbabilitySampler # app = FastAPI() 这行之后加 app.add_middleware( FastAPIMiddleware, exporter=AzureExporter(connection_string=conn_string), sampler=ProbabilitySampler(rate=1.0) # 测试环境用1.0全量采样,生产可按需调低 ) - 排查容器侧的配置问题
- 检查Dockerfile里的依赖是否装全,不要漏装opencensus的fastapi扩展,同时尽量用2022年之后发布的新版本,老版本opencensus存在连接新AI资源的兼容问题。
- 如果开了VNET集成,确认VNET网络安全组没有拦截到AI上报端点(默认是
dc.services.visualstudio.com的443端口出站),不然容器发不出遥测请求。 - 如果启动uvicorn时开了多worker模式,确认遥测初始化逻辑是在应用启动时加载,而不是只在主进程执行,不然worker进程不会上报数据。
- 关闭App Service AI配置页里的「自动检测/自动注入」开关——这个功能只对App Service内置的.NET、Java、Node.js运行时生效,对自定义Python容器无效,开了反而可能注入错误的环境变量干扰SDK上报。
- 验证链路是否打通
遥测数据默认有2-5分钟的传输延迟,不要刚配置完就刷AI页面。可以先在健康检查接口加一条测试日志:
部署后多调用几次接口,等10分钟左右去AI的「事务搜索」页面搜这条测试日志,如果能搜到说明日志链路通了,再等几分钟就能看到请求和指标数据。如果搜不到,直接去App Service的「日志流」看容器的stderr输出,opencensus上报失败会直接打连接错误、权限错误的日志,根据日志排错比盲试效率高很多。@app.get('/') async def health_check(): logger.warning("health check triggered") return {'status': 'ok'} - 更简单的替代方案
目前微软已经用OpenTelemetry替代了旧的OpenCensus SDK,对FastAPI的适配更简单,不需要自己拼接各个组件,两行代码就能完成全量遥测接入(自动采集请求、依赖、日志、指标),对自定义容器场景的适配更好:
先装包:pip install azure-monitor-opentelemetry fastapi uvicorn
代码里只需要在初始化app前加一行配置即可,不需要手动加handler、中间件、导出器:from azure.monitor.opentelemetry import configure_azure_monitor from fastapi import FastAPI import logging # 自动读取环境变量里的AI连接字符串,完成所有遥测组件初始化 configure_azure_monitor() logger = logging.getLogger(__name__) app = FastAPI() # 后续的接口逻辑完全不用改
内容的提问来源于stack exchange,提问作者Sujay Rokade
相关产品推荐
相关产品推荐

