4

Wir haben gerade angefangen, SignalR in einer MVC-Anwendung zu verwenden und jetzt bekommen wir aufgrund der hohen durchschnittlichen Antwortzeit eine Reihe von Alarmen. Ich vermute, dass dies irreführend ist, da die Anwendung keine Leistungseinbußen erfährt. Es scheint, dass SignalR diese URL verwendet, um eine Verbindung herzustellen. Diese URL ist kein Controller/Aktion des Projekts und nur der eingebaute SignalR-Code in der js-Datei. jquery.signalR-2.2.1.js ist die Datei. Ich vermute, dass es die Websocket-Verbindung gerade offen lässt, während sie auf dieser Seite sind und es unsere Zahlen verdreht. Ist das genau? Wenn ja, gibt es eine Möglichkeit, sie aus den Anwendungsinformationen zu filtern?SignalR in MVC skewing Application Insights

Hier ist der Zähler. Ist das das erwartete Verhalten?

enter image description here

Hier ist der Code signalR jquery ist, wo es es ist url baut:

// 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

Dies sein kann oder nicht Wenn Sie 3 oder mehr Fenster öffnen, in denen Ihr SignalR eine Verbindung herstellt, wird es hängen bleiben, bis ein Socket verfügbar ist (IE. Sie schließen eines Ihrer mehreren Fenster tha t sind verbunden), dann wird die Seite geladen. Ich frage mich, ob dies der Grund für die lange Antwortzeit ist? – Luke

+0

@Luke danke für die Rückmeldung. Ich werde mit den Nutzern nachgehen. Ich glaube nicht, dass dies ihr Verhalten ist, sondern werde es überprüfen. –

Antwort

1

wenn die Anrufe kommen aus dem C# Teil der App ist der einfachste Weg, eine eigene schreiben Telemetrie-Prozessor: 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); 
} 

und verwenden, um explizit die Signa herauszufiltern Wenn Anrufe von JS kommen, dann führt der Telemetrie-Initialisierer eine ähnliche Funktion durch, um Telemetrie herauszufiltern, wenn Sie im Initialisierer false zurückgeben.

2

Ich reparierte diese indem Sie die Anweisungen auf https://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-filtering-sampling:

  1. Aktualisieren Sie Ihre ApplicationInsights Nuget Paket 2.0.0 oder höher.
  2. Erstellen Sie eine Klasse ITelemetryProcessor Implementierung:
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); 
     } 
    } 
  1. den Prozessor zu Ihrem Application_Start() in Global.asax.cs hinzufügen:
var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; 
    builder.Use((next) => new UnwantedTelemetryFilter(next)); 
    builder.Build(); 
Verwandte Themen