Compartilhar via


Contadores de eventos de rede no .NET

EventCounters são APIs do .NET usadas para a coleta de métricas de desempenho leves, multiplataforma e quase em tempo real.

Os componentes de rede são instrumentados para publicar informações básicas de diagnóstico usando EventCounters. Eles incluem informações como as seguintes:

  • 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

Dica

Para obter a lista completa, consulte contadores conhecidos.

Dica

Em projetos direcionados ao .NET 8+, considere usar as métricas de rede mais recentes e mais ricas em recursos em vez de EventCounters.

Provedores

As informações de rede são divididas entre os seguintes provedores:

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

A telemetria tem alguma sobrecarga de desempenho quando habilitada, portanto, certifique-se de assinar apenas os provedores nos quais você está realmente interessado.

Monitorar contadores de eventos de fora do processo

dotnet-counters

O dotnet-counters é uma ferramenta de monitoramento multiplataforma de desempenho para monitoramento de integridade de primeiro nível e investigação de desempenho.

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

O comando atualiza continuamente o console com os números mais recentes.

[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 conhecer todos os comandos e parâmetros disponíveis, consulte a documentação do dotnet-counter.

Application Insights

O Application Insights não coleta contadores de eventos por padrão. Para obter informações sobre como personalizar o conjunto de contadores nos quais você está interessado, consulte a documentação de EventCounters do AppInsights.

Por exemplo:

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 obter um exemplo de como assinar muitos contadores de eventos de runtime e ASP.NET, consulte o exemplo RuntimeEventCounters. Basta adicionar um EventCounterCollectionRequest para cada entrada.

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

Consumir contadores de eventos em processo

A biblioteca Yarp.Telemetry.Consumption facilita o consumo de contadores de eventos de dentro do processo. Embora o pacote seja mantido atualmente como parte do projeto YARP, ele pode ser usado em qualquer aplicativo .NET.

Para usá-lo, implemente a interface 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");
    }
}

Em seguida, registre as implementações com seu contêiner de DI:

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

A biblioteca fornece os seguintes tipos de métrica fortemente tipados:

Precisa de mais telemetria?

Se você tiver sugestões para outras informações úteis que possam ser expostas por meio de eventos ou métricas, crie um problema de dotnet/runtime.

Se você estiver usando a biblioteca Yarp.Telemetry.Consumption e tiver sugestões, crie um problema da microsoft/proxy reverso.