다음을 통해 공유


.NET의 네트워킹 이벤트 카운터

EventCounters는 경량, 플랫폼 간 및 근 실시간 성능 메트릭 컬렉션에 사용되는 .NET API입니다.

네트워킹 구성 요소는 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(HttpClientSocketsHttpHandler)
  • System.Net.NameResolution (Dns)
  • System.Net.Security (SslStream)
  • System.Net.Sockets
  • Microsoft.AspNetCore.Hosting
  • Microsoft-AspNetCore-Server-Kestrel

원격 분석에 사용하도록 설정할 때는 일부 성능 오버헤드가 있으므로 실제로 관심이 있는 공급자만 구독해야 합니다.

프로세스 외부에서 이벤트 카운터 모니터링

dotnet-counters

dotnet-counters는 임시 상태 모니터링 및 1단계 수준 성능 조사를 위한 플랫폼 간 성능 모니터링 도구입니다.

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

Application Insights는 기본적으로 이벤트 카운터를 수집하지 않습니다. 관심 있는 카운터 집합을 사용자 지정하는 방법에 대한 내용은 AppInsights 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/reverse-proxy 문제를 만듭니다.