Compartir vía


Contadores de eventos de red en .NET

Los EventCounters son API de .NET que se usan para la recopilación ligera, multiplataforma y casi en tiempo real de métricas de rendimiento.

Los componentes de red se instrumentan para publicar información de diagnóstico básica mediante EventCounters. Incluyen información como la siguiente:

  • 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

Sugerencia

Para obtener la lista completa, consulte contadores conocidos.

Sugerencia

En los proyectos destinados a .NET 8+, considere la posibilidad de usar las métricas de red más recientes y enriquecidas de características en lugar de EventCounters.

Proveedores

La información de red se divide entre los proveedores siguientes:

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

La telemetría tiene cierta sobrecarga de rendimiento cuando está habilitada, por lo que asegúrese de suscribirse solo a los proveedores en los que realmente está interesado.

Supervisión de contadores de eventos desde fuera del proceso

dotnet-counters

dotnet-counters es una herramienta de supervisión del rendimiento multiplataforma para la monitorización puntual del estado y la investigación inicial del rendimiento.

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

El comando actualiza continuamente la consola con los números más recientes.

[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

Para ver todos los comandos y parámetros disponibles, consulte los documentos de dotnet-counter.

Application Insights

Application Insights no recopila contadores de eventos de forma predeterminada. Para obtener información sobre cómo personalizar el conjunto de contadores en los que está interesado, consulte los documentos de EventCounters de AppInsights.

Por ejemplo:

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

Para obtener un ejemplo de cómo suscribirse a muchos contadores de eventos en tiempo de ejecución y ASP.NET, consulte el ejemplo RuntimeEventCounters. Basta con agregar un EventCounterCollectionRequest para cada entrada.

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

Consumo de contadores de eventos en proceso

La biblioteca Yarp.Telemetry.Consumption facilita el consumo de contadores de eventos desde dentro del proceso. Aunque el paquete se mantiene actualmente como parte del proyecto YARP , se puede usar en cualquier aplicación .NET.

Para usarlo, implemente la IMetricsConsumer<TMetrics> interfaz :

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

Luego, registre las implementaciones con el contenedor de inserción de dependencias:

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

La biblioteca proporciona los siguientes tipos de métricas estrictamente tipificados:

¿Necesita más telemetría?

Si tiene alguna sugerencia relativa a otra información de utilidad que podría exponerse a través de eventos o métricas, cree una incidencia de dotnet/runtime.

Si usa la biblioteca Yarp.Telemetry.Consumption y tiene alguna sugerencia, cree una incidencia de microsoft/reverse-proxy.