다음을 통해 공유


.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 는 임시 상태 모니터링 및 첫 번째 수준 성능 조사를 위한 플랫폼 간 성능 모니터링 도구입니다.

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/런타임 문제를 만듭니다.

Yarp.Telemetry.Consumption 라이브러리를 사용하고 제안 사항이 있는 경우 microsoft/역방향 프록시 이슈를 등록하세요.