4

我們剛開始在MVC應用程序中使用SignalR,現在由於高平均響應時間,我們得到了一堆警報。我懷疑這是誤導,因爲應用程序沒有遇到性能下降。看來SignalR使用這個URL來建立連接。這個url不是項目的控制器/動作,只是js文件中內置的SignalR代碼。 jquery.signalR-2.2.1.js是該文件。我懷疑它只是將WebSocket連接打開,而它們位於這個頁面上,它正在歪曲我們的數字。這是否準確?如果是這樣,有沒有辦法將它從應用程序洞察中濾除?MVR偏差中的SignalR應用見解

這是櫃檯。 這是預期的行爲?

enter image description here

這裏是signalR jQuery代碼的地方建立它的URL:

// 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; 
    }, 
+0

這可以是或者可以不是與你確切的問題有關,但是如果你在SignalR連接的地方打開3個或更多的窗口,它將掛起,直到有一個插座可用(IE。你關閉你的多個窗口中的一個t連接),然後頁面將加載。我想知道這是否是「響應時間」很長的原因? – Luke

+0

@Luke感謝您的反饋。我會跟進用戶。我不認爲這是他們的行爲,但會檢查。 –

回答

1

如果調用從應用程序的C#部分來了,最簡單的方法是編寫自定義遙測處理器: https://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-filtering-sampling

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); 
} 

並用它來顯式地濾除Signa的來自發送的lr呼叫

或者如果調用來自JS,那麼如果您在初始化程序中返回false,那麼遙測初始化程序也會執行類似的操作來過濾掉遙測。

2

我解決了這個問題通過以下對https://docs.microsoft.com/en-us/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); 
     } 
    } 
  • 處理器添加到你的Application_Start()Global.asax.cs
  • var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; 
        builder.Use((next) => new UnwantedTelemetryFilter(next)); 
        builder.Build();