Dela via


Nätverkshändelseräknare i .NET

EventCounters är .NET-API:er som används för enkel, plattformsoberoende och nästan realtidsbaserad insamling av prestandamått.

Nätverkskomponenter instrumenteras för att publicera grundläggande diagnostikinformation med EventCounters. De innehåller information som följande:

  • 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

Dricks

Den fullständiga listan finns i välkända räknare.

Dricks

Överväg att använda de nyare och mer funktionsrika nätverksmåtten i stället för EventCounters i projekt som är inriktade på .NET 8+.

Providers

Nätverksinformation delas upp mellan följande leverantörer:

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

Telemetrin har vissa prestandakostnader när den är aktiverad, så se till att endast prenumerera på leverantörer som du faktiskt är intresserad av.

Övervaka händelseräknare utanför processen

dotnet-counters

dotnet-counters är ett plattformsoberoende prestandaövervakningsverktyg för ad hoc-hälsoövervakning och prestandaundersökning på första nivån.

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

Kommandot uppdaterar kontinuerligt konsolen med de senaste numren.

[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

Alla tillgängliga kommandon och parametrar finns i dotnet-counter-dokumenten.

Programinsikter

Application Insights samlar inte in händelseräknare som standard. Information om hur du anpassar den uppsättning räknare som du är intresserad av finns i dokumentationen om AppInsights EventCounters.

Till exempel:

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

Ett exempel på hur du prenumererar på många körnings- och ASP.NET händelseräknare finns i exemplet RuntimeEventCounters. Lägg bara till en EventCounterCollectionRequest för varje post.

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

Använda pågående händelseräknare

Biblioteket Yarp.Telemetry.Consumption gör det enkelt att använda händelseräknare inifrån processen. Även om paketet för närvarande underhålls som en del av YARP-projektet kan det användas i alla .NET-program.

Implementera gränssnittet för att använda det 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");
    }
}

Registrera sedan implementeringarna med din DI-container:

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

Biblioteket innehåller följande starkt skrivna måtttyper:

Behöver du mer telemetri?

Om du har förslag på annan användbar information som kan exponeras via händelser eller mått skapar du ett problem med dotnet/runtime.

Om du använder Yarp.Telemetry.Consumption biblioteket och har några förslag skapar du ett microsoft-/reverse-proxy-problem.