MVC中的SignalR扭曲了应用程序的见解

Pap*_*ndy 5 asp.net-mvc websocket signalr azure-application-insights

我们刚刚开始在MVC应用程序中使用SignalR,由于平均响应时间长,现在我们收到大量警报。我怀疑这会引起误导,因为应用程序没有出现性能下降的情况。似乎SignalR使用此URL建立连接。这个网址不是项目的控制器/动作,而是js文件中的内置SignalR代码。jquery.signalR-2.2.1.js是文件。我怀疑当他们在此页面上时,只是使websocket连接保持打开状态,并且歪曲了我们的数字。这个准确吗?如果是这样,是否有办法从应用程序见解中过滤掉它?

这是柜台。 这是预期的行为吗?

在此处输入图片说明

这是构建URL的signalR jQuery代码:

// BUG #2953: The url needs to be same otherwise it will cause a memory leak
    getUrl: function (connection, transport, reconnecting, poll, ajaxPost) {
        /// <summary>Gets the url for making a GET based connect request</summary>
        var baseUrl = transport === "webSockets" ? "" : connection.baseUrl,
            url = baseUrl + connection.appRelativeUrl,
            qs = "transport=" + transport;

        if (!ajaxPost && connection.groupsToken) {
            qs += "&groupsToken=" + window.encodeURIComponent(connection.groupsToken);
        }

        if (!reconnecting) {
            url += "/connect";
        } else {
            if (poll) {
                // longPolling transport specific
                url += "/poll";
            } else {
                url += "/reconnect";
            }

            if (!ajaxPost && connection.messageId) {
                qs += "&messageId=" + window.encodeURIComponent(connection.messageId);
            }
        }
        url += "?" + qs;
        url = transportLogic.prepareQueryString(connection, url);

        if (!ajaxPost) {
            url += "&tid=" + Math.floor(Math.random() * 11);
        }

        return url;
    },
Run Code Online (Sandbox Code Playgroud)

Pho*_*exo 5

我按照https://docs.microsoft.com/zh-cn/azure/application-insights/app-insights-api-filtering-sampling上的说明进行了修复:

  1. 将您的ApplicationInsights Nuget软件包更新为2.0.0或更高版本。
  2. 创建一个实现ITelemetryProcessor以下内容的类:
    public class UnwantedTelemetryFilter : ITelemetryProcessor
    {
        private ITelemetryProcessor Next { get; set; }

        public UnwantedTelemetryFilter(ITelemetryProcessor next)
        {
            this.Next = next;
        }

        public void Process(ITelemetry item)
        {
            var request = item as RequestTelemetry;

            if (request != null && request.Name != null)
                if (request.Name.Contains("signalr"))
                    return;

            // Send everything else:
            this.Next.Process(item);
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 将处理器添加到Application_Start()Global.asax.cs
    var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder;
    builder.Use((next) => new UnwantedTelemetryFilter(next));
    builder.Build();
Run Code Online (Sandbox Code Playgroud)


Joh*_*ner 2

如果调用来自应用程序的 C# 部分,最简单的方法是编写自定义遥测处理器: https://learn.microsoft.com/en-us/azure/application-insights/app-insights-api-过滤采样

public void Process(ITelemetry item)
{
    var request = item as RequestTelemetry;

    if (request != null && request.[some field here].Equals("[some signalr specific check here]", StringComparison.OrdinalIgnoreCase))
    {
        // To filter out an item, just terminate the chain:
        return;
    }
    // Send everything else:
    this.Next.Process(item);
}
Run Code Online (Sandbox Code Playgroud)

并使用它来显式过滤掉发送的信号器调用

或者如果调用来自 JS,那么如果您在初始化程序中返回 false,则遥测初始化程序会执行类似的操作来过滤掉遥测数据。