.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-カウンター

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 の問題を作成します。