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
eSocketsHttpHandler
)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.