SignalR每秒触发ApplicationInsights异常,求二者整合解决方案
看起来你遇到的核心问题是使用SignalR SQL背板时,Application Insights每秒触发System.InvalidOperationException,错误提示为Cannot execute ExtractMetrics because this metrics extractor has not been initialized (no metrics manager),同时你已经尝试用自定义遥测过滤器UnwantedTelemetryFilter过滤SignalR相关遥测,但问题依然存在。
先拆解问题根源:你的初始化代码先设置了DisableTelemetry = true,之后再开启遥测并添加过滤器,这个顺序会导致Application Insights内部组件(比如DependencyMetricsExtractor)无法正确初始化,当SignalR的SQL背板产生依赖遥测时,就会触发未初始化的异常。
下面是具体的修复方案:
1. 调整Application Insights初始化顺序
你的SetApplicationInsights方法初始化顺序有误——应该先确认Instrumentation Key有效性,再启用遥测,最后添加过滤器。修改后的代码如下:
public static void SetApplicationInsights() { string instrumentationKey = Settings.KeyVault.Global.GetKey("AppInsightsInstrumentationKey"); var config = TelemetryConfiguration.Active; #if(DEBUG) config.TelemetryChannel.DeveloperMode = true; #endif // 先判断是否有有效的Instrumentation Key if (!string.IsNullOrEmpty(instrumentationKey)) { config.InstrumentationKey = instrumentationKey; config.DisableTelemetry = false; // 启用遥测后再添加过滤器,保证组件初始化完成 UnwantedTelemetryFilter.Set(); } else { config.DisableTelemetry = true; } }
2. 完善自定义遥测过滤器
你的过滤器目前只过滤了名称含signalr的请求和空数据的SQL依赖,针对SignalR SQL背板的特定遥测,可以更精准地过滤,同时不影响正常SQL遥测:
public class UnwantedTelemetryFilter : ITelemetryProcessor { private readonly ITelemetryProcessor _next; public UnwantedTelemetryFilter(ITelemetryProcessor next) { _next = next; } public void Process(ITelemetry item) { // 过滤SignalR相关请求遥测 if (item is RequestTelemetry request && request.Name?.Contains("signalr", StringComparison.OrdinalIgnoreCase) == true) { return; } // 过滤SignalR SQL背板产生的依赖遥测 if (item is DependencyTelemetry dependency) { // SignalR SQL背板的依赖通常包含特定表操作,比如[SignalR]开头的表 if (dependency.Type == "SQL" && !string.IsNullOrEmpty(dependency.Data) && dependency.Data.Contains("[SignalR]", StringComparison.OrdinalIgnoreCase)) { return; } // 保留空数据SQL过滤逻辑 if (dependency.Type == "SQL" && string.IsNullOrEmpty(dependency.Data)) { return; } } // 处理其他正常遥测 _next.Process(item); } public static void Set() { var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; builder.Use(next => new UnwantedTelemetryFilter(next)); builder.Build(); } }
3. 验证NuGet包版本兼容性
确保使用的包版本相互兼容:
Microsoft.AspNet.SignalR.SqlServer建议使用2.4.x及以上版本Microsoft.ApplicationInsights.Web建议使用2.21.x及以上版本- 避免混合不同大版本的包,比如SignalR 2.x和Application Insights 3.x可能存在兼容性问题
为什么原代码会触发异常?
当你先设置DisableTelemetry = true时,Application Insights的内部初始化逻辑会被跳过,包括DependencyMetricsExtractor的初始化。之后再将DisableTelemetry设为false,已经错过了组件初始化的时机,当SignalR的SQL背板产生依赖遥测时,DependencyMetricsExtractor尝试提取指标就会因未初始化抛出异常。调整顺序后,先启用遥测再添加过滤器,就能保证所有组件正确初始化。
内容的提问来源于stack exchange,提问作者Josh

