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

SignalR每秒触发ApplicationInsights异常,求二者整合解决方案

解决SignalR + Application Insights搭配使用时的SQL背板异常问题

看起来你遇到的核心问题是使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:05