Compartir a través de


Contadores de eventos de redes 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 los 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 con características en lugar de EventCounters.

Proveedores

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

  • 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 conlleva cierta sobrecarga de rendimiento cuando está habilitada, así que procure suscribirse únicamente a los proveedores que realmente le interesen.

Supervisión de contadores de eventos desde fuera del proceso

dotnet-counters

dotnet-counters es una herramienta de supervisión de rendimiento multiplataforma diseñada para la investigación del rendimiento y la supervisión del estado de primer nivel ad hoc.

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

El comando actualiza constantemente la consola con las cifras 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, vea la documentación 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 de su interés, vea la documentación 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 sobre cómo suscribirse a muchos contadores de eventos de ASP.NET y runtime, consulte el ejemplo RuntimeEventCounters. Basta con agregar EventCounterCollectionRequest en 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 actualmente el paquete se mantiene como parte del proyecto YARP, se puede usar en cualquier aplicación .NET.

Para usarlo, implemente la interfaz 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");
    }
}

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 fuertemente tipados:

¿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.