Freigeben über


Netzwerkereigniszähler in .NET

EventCounters sind .NET-APIs für eine schlanke und plattformübergreifende Sammlung von Leistungsmetriken in Quasi-Echtzeit.

Netzwerkkomponenten werden instrumentiert, um grundlegende Diagnoseinformationen mithilfe von EventCounters zu veröffentlichen. Sie enthalten Informationen wie die folgenden:

  • System.Net.Http > requests-started
  • System.Net.Http > requests-failed
  • System.Net.Http > http11-connections-current-total
  • System.Net.Security > all-tls-sessions-open
  • System.Net.Sockets > outgoing-connections-established
  • System.Net.NameResolution > dns-lookups-duration

Tipp

Die vollständige Liste finden Sie unter Bekannte Indikatoren.

Tipp

Bei Projekten für .NET 8+ sollten Sie die neueren und funktionsreicheren Netzwerkmetriken anstelle von EventCounters verwenden.

Anbieter

Netzwerkinformationen werden über die folgenden Anbieter verteilt:

  • System.Net.Http (HttpClient und SocketsHttpHandler)
  • System.Net.NameResolution (Dns)
  • System.Net.Security (SslStream)
  • System.Net.Sockets
  • Microsoft.AspNetCore.Hosting
  • Microsoft-AspNetCore-Server-Kestrel

Die Telemetrie erzeugt einen gewissen Leistungsmehraufwand, wenn sie aktiviert ist. Achten Sie daher darauf, nur Anbieter zu abonnieren, die Sie tatsächlich interessieren.

Überwachen von Ereigniszählern von außerhalb des Prozesses

dotnet-counters

dotnet-counters ist ein plattformübergreifendes Leistungsüberwachungstool zur Ad-hoc-Überwachung der Integrität und zur Leistungsuntersuchung auf erster Ebene.

dotnet tool install --global dotnet-counters
dotnet-counters monitor --counters System.Net.Http,System.Net.Security --process-id 1234

Der Befehl aktualisiert die Konsole kontinuierlich mit den neuesten Zahlen.

[System.Net.Http]
    Current Http 1.1 Connections                       3
    Current Http 2.0 Connections                       1
    Current Http 3.0 Connections                       0
    Current Requests                                   4
    HTTP 1.1 Requests Queue Duration (ms)              0
    HTTP 2.0 Requests Queue Duration (ms)              0
    HTTP 3.0 Requests Queue Duration (ms)              0
    Requests Failed                                    0
    Requests Failed Rate (Count / 1 sec)               0
    Requests Started                                 470
    Requests Started Rate (Count / 1 sec)             18

Alle verfügbaren Befehle und Parameter finden Sie in der Dokumentation zu dotnet-counter.

Application Insights

Application Insights erfasst standardmäßig keine Ereignisindikatoren. Informationen zum Anpassen der Indikatoren, die Sie interessieren, finden Sie in der Dokumentation zu AppInsights EventCounters.

Beispiel:

services.ConfigureTelemetryModule<EventCounterCollectionModule>((module, options) =>
{
    module.Counters.Add(new EventCounterCollectionRequest("System.Net.Http", "current-requests"));
    module.Counters.Add(new EventCounterCollectionRequest("System.Net.Http", "requests-failed"));
    module.Counters.Add(new EventCounterCollectionRequest("System.Net.Http", "http11-connections-current-total"));
    module.Counters.Add(new EventCounterCollectionRequest("System.Net.Security", "all-tls-sessions-open"));
});

Ein Beispiel für das Abonnieren vieler Runtime- und ASP.NET Ereigniszähler finden Sie unter RuntimeEventCounters. Fügen Sie für jeden Eintrag einfach EventCounterCollectionRequest hinzu.

foreach (var (eventSource, counters) in RuntimeEventCounters.EventCounters)
{
    foreach (string counter in counters)
    {
        module.Counters.Add(new EventCounterCollectionRequest(eventSource, counter));
    }
}

Verwenden von Ereigniszählern im Prozess

Die Yarp.Telemetry.Consumption-Bibliothek erleichtert die Nutzung von Ereigniszählern innerhalb des Prozesses. Das Paket wird derzeit zwar im Rahmen des YARP-Projekts gewartet, kann aber in jeder .NET-Anwendung verwendet werden.

Implementieren Sie dazu die Schnittstelle IMetricsConsumer<TMetrics>:

public sealed class MyMetricsConsumer : IMetricsConsumer<SocketsMetrics>
{
    public void OnMetrics(SocketsMetrics previous, SocketsMetrics current)
    {
        var elapsedTime = (current.Timestamp - previous.Timestamp).TotalMilliseconds;
        Console.WriteLine($"Received {current.BytesReceived - previous.BytesReceived} bytes in the last {elapsedTime:N2} ms");
    }
}

Registrieren Sie dann die Implementierungen bei Ihrem DI-Container:

services.AddSingleton<IMetricsConsumer<SocketsMetrics>, MyMetricsConsumer>();
services.AddTelemetryListeners();

Die Bibliothek stellt die folgenden stark typisierten Metriken bereit:

Benötigen Sie weitere Telemetriedaten?

Wenn Sie Vorschläge für andere nützliche Informationen haben, die über Ereignisse oder Metriken verfügbar gemacht werden könnten, erstellen Sie einen Issue in dotnet/runtime.

Wenn Sie die Yarp.Telemetry.Consumption-Bibliothek verwenden und Vorschläge haben, erstellen Sie einen Issue in microsoft/reverse-proxy.