Счетчики сетевых событий в .NET

EventCounters — это API .NET, используемые для упрощенной, кроссплатформенной и почти в реальном времени коллекции метрик производительности.

Сетевые компоненты инструментируются для публикации основных диагностических сведений с помощью EventCounters. Они включают такие сведения, как показано ниже.

  • 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

Совет

Полный список см . в известных счетчиках.

Совет

В проектах, предназначенных для .NET 8+, рекомендуется использовать более новые и более функциональные сетевые метрики вместо EventCounters.

Поставщики

Сведения о сети разделены по следующим поставщикам:

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

Данные телеметрии имеют некоторые издержки на производительность при включении, поэтому обязательно подписываться только на поставщиков, которые вы действительно заинтересованы.

Мониторинг счетчиков событий за пределами процесса

dotnet-counters

dotnet-counters — это кроссплатформенное средство мониторинга производительности для мониторинга работоспособности и исследования производительности первого уровня.

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

Команда постоянно обновляет консоль с последними номерами.

[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

Все доступные команды и параметры см. в документации dotnet-counter.

Application Insights

Аналитика приложения по умолчанию не собирает счетчики событий. Сведения о настройке набора счетчиков, интересующих вас, см. в документации app Аналитика EventCounters.

Например:

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

Пример подписки на множество счетчиков событий среды выполнения и ASP.NET см. в примере RuntimeEventCounters. Просто добавьте запись для каждой EventCounterCollectionRequest записи.

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

Использование счетчиков событий в процессе

Библиотека Yarp.Telemetry.Consumption упрощает использование счетчиков событий из процесса. Хотя пакет в настоящее время поддерживается в рамках проекта YARP , его можно использовать в любом приложении .NET.

Чтобы использовать его, реализуйте 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");
    }
}

Затем зарегистрируйте реализации в контейнере DI:

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

Библиотека предоставляет следующие строго типизированные метрики:

Требуется больше данных телеметрии?

Если у вас есть предложения по другим полезным сведениям, которые могут быть предоставлены с помощью событий или метрик, создайте проблему dotnet/runtime.

Если вы используете библиотеку Yarp.Telemetry.Consumption и имеете какие-либо предложения, создайте проблему с microsoft или обратным прокси-сервером.