Condividi tramite


Contatori eventi di networking in .NET

Le EventCounters sono API .NET usate per la raccolta di metriche di prestazioni lightweight, multipiattaforma e near real-time.

I componenti di rete vengono instrumentati per pubblicare informazioni di diagnostica di base tramite EventCounters come le seguenti:

  • 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

Suggerimento

Per l'elenco completo, vedere i contatori noti.

Suggerimento

Nei progetti destinati a .NET 8+, è consigliabile usare le metriche di networking più recenti e più ricche di funzionalità anziché le EventCounters.

Provider

Le informazioni di networking sono suddivise tra i provider seguenti:

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

La telemetria presenta un sovraccarico in termini di prestazioni quando è abilitata, quindi è bene assicurarsi di sottoscrivere solo i provider a cui si è effettivamente interessati.

Monitorare i contatori eventi dall'esterno del processo

dotnet-counters

dotnet-counters è uno strumento di monitoraggio delle prestazioni multipiattaforma per il monitoraggio ad hoc dello stato e l'analisi delle prestazioni di primo livello.

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

Il comando aggiorna continuamente la console con i numeri più recenti.

[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

Per tutti i comandi e i parametri disponibili, vedere la documentazione di dotnet-counter.

Application Insights

Application Insights non raccoglie contatori eventi per impostazione predefinita. Per informazioni sulla personalizzazione del set di contatori a cui si è interessati, vedere la documentazione di AppInsights EventCounters.

Ad esempio:

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

Per un esempio di come sottoscrivere più contatori eventi di runtime e ASP.NET, vedere l'esempio di RuntimeEventCounters. È possibile aggiungere semplicemente un oggetto EventCounterCollectionRequest per ogni voce.

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

Utilizzare contatori eventi in-process

La libreria Yarp.Telemetry.Consumption semplifica l'utilizzo dei contatori eventi dall'interno del processo. Sebbene il pacchetto sia attualmente gestito come parte del progetto YARP, può essere usato in qualsiasi applicazione .NET.

Per usarlo, implementare l'interfaccia 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");
    }
}

Registrare quindi le implementazioni con il contenitore DI:

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

La libreria fornisce i seguenti tipi di metriche fortemente tipizzate:

Sono necessari altri dati di telemetria?

Se si hanno suggerimenti per altre informazioni utili che potrebbero essere esposte tramite eventi o metriche, creare un problema dotnet/runtime.

Se si sta usando la libreria Yarp.Telemetry.Consumption e nascono dei suggerimenti, creare un problema microsoft/proxy inverso.