隔离进程Azure Functions自定义TelemetryProcessor无法捕获AppInsights异常
问题根因
异常遥测不进自定义处理器、不附加自定义维度的问题,是Azure Functions隔离(out-of-process)模式的特性+配置问题叠加导致的:
- 旧版本隔离模式函数运行时,未被业务代码捕获的异常默认由Azure Functions主机进程直接收集上报App Insights,完全不经过worker进程内的自定义遥测管道,所以自定义的Initializer和Processor无法处理这部分异常
- 当前使用的NuGet包版本过旧,缺少隔离模式下App Insights集成的必要组件和已知问题修复
- 服务注册顺序错误,同时缺少隔离模式专属的App Insights配置
可行解决步骤
1. 升级并补充必要NuGet包
首先安装隔离模式专属的App Insights集成包,同时升级核心包到兼容稳定版本:
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" /> <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.2" OutputItemType="Analyzer" />
其余功能扩展包可同步升级到对应兼容版本。
2. 修正Program.cs的服务注册顺序和配置
调整服务注册顺序,同时添加隔离模式的App Insights启用配置:
public class Program { public static Task Main(string[] args) { var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() // 启用隔离模式App Insights完整集成 .ConfigureAppInsights() .ConfigureServices(services => { var config = new ConfigurationBuilder() .AddJsonFile("local.settings.json", true, true) .AddEnvironmentVariables() .Build() .Get<FunctionsConfig>(); // 先注册配置,再注册依赖配置的TelemetryInitializer services.AddSingleton<Config>(config); services.AddSingleton<ITelemetryInitializer, FunctionTelemetryInitializer>(); services.AddApplicationInsightsTelemetryWorkerService(); services.AddApplicationInsightsTelemetryProcessor<FunctionsTelemetryProcessor>(); }) .Build(); return host.RunAsync(); } }
3. 修正host.json配置
移除采样配置中不必要的Exception排除,同时添加配置禁用主机层面的自动异常上报,让worker进程接管所有遥测的收集:
{ "version": "2.0", "functionTimeout": "00:10:00", "logging": { "fileLoggingMode": "never", "logLevel": { "default": "Information", "Host.Results": "Warning", "Function": "Warning", "Host.Aggregator": "Warning" }, "applicationInsights": { "samplingSettings": { "isEnabled": true, "maxTelemetryItemsPerSecond" : 20, "excludedTypes": "Request;Dependency" }, // 开启worker进程遥测收集能力,包含异常类型 "enableWorkerTelemetry": true } }, // 禁用主机层面的自动异常上报 "functions": { "disableAutomaticHostExceptionLogging": true }, "extensions": { "queues": { "maxPollingInterval": "00:00:02", "visibilityTimeout" : "00:05:00", "batchSize": 1, "maxDequeueCount": 3, "newBatchThreshold": 0 } } }
4. 可选兜底方案
如果以上配置完成后仍有特殊场景的异常漏处理,可以给所有函数添加统一的异常捕获中间件/过滤器,或者在函数代码外层套try-catch,捕获到异常后用ILogger.LogError手动上报,手动上报的异常100%会走worker进程的遥测管道,被自定义Initializer和Processor正常处理。
内容的提问来源于stack exchange,提问作者ded.diman
相关产品推荐
相关产品推荐

