次の方法で共有


リソースの監視

リソース監視には、CPU、メモリ、ネットワーク使用量などのリソース使用率値の継続的な測定が含まれます。 Microsoft.Extensions.Diagnostics.ResourceMonitoring NuGet パッケージには、.NET アプリケーションのリソース使用率を監視するために調整された API のコレクションが用意されています。

測定値は、次の 2 つの方法で使用できます。

重要

Microsoft.Extensions.Diagnostics.ResourceMonitoring パッケージでは、コンシューマーがログ プロバイダーを Microsoft.Extensions.Logging パッケージに登録することを前提としています。 ログを登録しない場合、AddResourceMonitoring への呼び出しによって例外がスローされます。 さらに、ガイドに従って、Microsoft.Extensions.Diagnostics.ResourceMonitoring カテゴリの Debug ログ レベルを構成することで、内部ライブラリのログ記録を有効にすることができます。

リソース監視の .NET メトリックを使用する

リソース監視ライブラリによって生成された .NET メトリックを使用するには:

  1. Microsoft.Extensions.Diagnostics.ResourceMonitoring パッケージをプロジェクトに追加します。

  2. 依存関係挿入コンテナーにリソース監視サービスを追加します。

    services.AddResourceMonitoring();
    
  3. OpenTelemetry と互換性のあるメトリック コレクターを使用してメトリック収集を構成します。 例えば次が挙げられます。

    services.AddOpenTelemetry()
        .WithMetrics(builder =>
        {
            builder.AddMeter("Microsoft.Extensions.Diagnostics.ResourceMonitoring");
            builder.AddConsoleExporter(); // Or any other metrics exporter
        });
    
  4. これで、構成済みのメトリック エクスポーターを使用して、リソースの使用状況メトリックを確認できます。

使用可能なメトリックの詳細については、「 .NET 拡張機能のメトリック: Microsoft.Extensions.Diagnostics.ResourceMonitoring」を参照してください。

メトリック収集の詳細については、「 メトリックの収集」を参照してください。

IResourceMonitor インターフェイスを使用する

注意事項

このセクションで説明する IResourceMonitor インターフェイスは非推奨となり、今後のバージョンの .NET で削除される可能性があります。 メトリックベースのアプローチに移行します

IResourceMonitor インターフェイスは、プロセスのリソース使用率に関するリアルタイム情報を取得するためのメソッドを提供します。 このインターフェイスは、CPU とメモリの使用状況に関連するデータの取得をサポートしており、現在、Windows と Linux の両方のプラットフォームと互換性があります。

リソース監視の使用例

次の例では、IResourceMonitor インターフェイスを使用して、現在のプロセスの CPU とメモリの使用状況に関する情報を取得する方法を示しています。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.ResourceMonitoring;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Spectre.Console;

var app = Host.CreateDefaultBuilder()
    .ConfigureServices(services =>
    {
        services.AddLogging(static builder => builder.AddConsole())
                .AddResourceMonitoring();
    })
    .Build();

var monitor = app.Services.GetRequiredService<IResourceMonitor>();
await app.StartAsync();

上記のコードでは次の操作が行われます。

  • 新しい ServiceCollection インスタンスのインスタンスを作成し、AddLogging および AddResourceMonitoring 拡張メソッドへの呼び出しのチェーンを行います。
  • ServiceCollection インスタンスから新しい ServiceProvider インスタンスを構築します。
  • ServiceProvider インスタンスから IResourceMonitor インターフェイスのインスタンスを取得します。

この時点で、IResourceMonitor 実装では、IResourceMonitor.GetUtilization メソッドを使用してリソース使用率を要求します。 GetUtilization メソッドは、次の情報を含む ResourceUtilization インスタンスを返します。

Spectre.Console を使用してリソース監視を拡張する

この例を拡張して、よく知られた .NET ライブラリ、Spectre.Console を利用することができます。これは、視覚的に目を引くクロスプラットフォーム コンソール アプリケーションの開発を簡略化するために設計されたものです。 Spectre を使用すると、リソース使用率データを表形式で表示できます。 次のコードは、現在のプロセスの CPU とメモリの使用状況に関する詳細にアクセスし、このデータをテーブルに表示する IResourceMonitor インターフェイスの使用方法を示しています。

await StartMonitoringAsync(monitor, token);

async Task StartMonitoringAsync(IResourceMonitor monitor, CancellationToken cancellationToken)
{
    var table = new Table()
        .Centered()
        .Title("Resource Monitoring", new Style(foreground: Color.Purple, decoration: Decoration.Bold))
        .Caption("Updates every three seconds. *GTD: Guaranteed ", new Style(decoration: Decoration.Dim))
        .RoundedBorder()
        .BorderColor(Color.Cyan1)
        .AddColumns(
        [
            new TableColumn("Time").Centered(),
            new TableColumn("CPU %").Centered(),
            new TableColumn("Memory %").Centered(),
            new TableColumn("Memory (bytes)").Centered(),
            new TableColumn("GTD / Max Memory (bytes)").Centered(),
            new TableColumn("GTD / Max CPU (units)").Centered(),
        ]);

    await AnsiConsole.Live(table)
        .StartAsync(async ctx =>
        {
            var window = TimeSpan.FromSeconds(3);
            while (cancellationToken.IsCancellationRequested is false)
            {
                var utilization = monitor.GetUtilization(window);
                var resources = utilization.SystemResources;

                table.AddRow(
                    [
                        $"{DateTime.Now:T}",
                        $"{utilization.CpuUsedPercentage:p}",
                        $"{utilization.MemoryUsedPercentage:p}",
                        $"{utilization.MemoryUsedInBytes:#,#}",
                        $"{resources.GuaranteedMemoryInBytes:#,#} / {resources.MaximumMemoryInBytes:#,#}",
                        $"{resources.GuaranteedCpuUnits} / {resources.MaximumCpuUnits}",
                    ]);

                ctx.Refresh();
                await Task.Delay(window);
            }
        });
}

上記のコードでは次の操作が行われます。

  • キャンセル トークンのソースとキャンセル トークンを作成します。
  • 新しい Table インスタンスを作成し、タイトル、キャプション、列で構成します。
  • Table インスタンスのライブ レンダリングを実行し、3 秒ごとに呼び出されるデリゲートを渡します。
  • IResourceMonitor インスタンスから現在のリソース使用率に関する情報を取得し、Table インスタンスの新しい行として表示します。

以下は、上記のコードの出力例です。

リソース監視アプリの出力例。

この例のソース コードについては、「Resource monitoring sample (リソース監視サンプル)」を参照してください。

メトリックベースのリソース監視に移行する

IResourceMonitor インターフェイスは非推奨であるため、メトリックベースのアプローチに移行します。 Microsoft.Extensions.Diagnostics.ResourceMonitoring パッケージには、代わりに使用できるいくつかのメトリックが用意されています。次に例を示します。

  • container.cpu.limit.utilization: 実行中のコンテナ化されたアプリケーションの CPU 使用率 ([0, 1] の範囲でのリソース制限に対する割合)。 Linux および Windows 上のコンテナー化されたアプリで使用できます。
  • container.cpu.request.utilization: 実行中のコンテナ化されたアプリケーションの CPU 使用率 ([0, 1] の範囲でのリソース要求に対する割合)。 Linux 上のコンテナー化されたアプリで使用できます。
  • container.memory.limit.utilization: 実行中のコンテナー化されたアプリケーションのメモリ消費量が、リソースの制限範囲内で占める割合。 Linux および Windows 上のコンテナー化されたアプリで使用できます。

使用可能なメトリックの詳細については、「 組み込みのメトリック: Microsoft.Extensions.Diagnostics.ResourceMonitoring」セクションを参照 してください。

移行ガイド

このセクションでは、非推奨の IResourceMonitor インターフェイスからメトリックベースのアプローチへの移行ガイドを提供します。 このガイドは、アプリケーションでリソース使用率メトリックを手動でリッスンする場合にのみ必要です。 ほとんどの場合、「 リソース監視の .NET メトリックの使用」で説明されているように、メトリックはメトリック エクスポーターを使用して自動的に収集され、バックエンドにエクスポートされるため、手動でリッスンする必要はありません。

IResourceMonitorexample 使用法のようなコードがある場合は、次のように更新します。

await StartMonitoringAsync(logger, token);

async Task StartMonitoringAsync(ILogger logger, CancellationToken cancellationToken)
{
    var table = new Table()
        .Centered()
        .Title("Resource Monitoring", new Style(foreground: Color.Purple, decoration: Decoration.Bold))
        .RoundedBorder()
        .BorderColor(Color.Cyan1)
        .AddColumns(
        [
            new TableColumn("Time").Centered(),
            new TableColumn("CPU limit %").Centered(),
            new TableColumn("CPU request %").Centered(),
            new TableColumn("Memory limit %").Centered(),
        ]);

    const string rmMeterName = "Microsoft.Extensions.Diagnostics.ResourceMonitoring";
    using var meter = new Meter(rmMeterName);
    using var meterListener = new MeterListener
    {
        InstrumentPublished = (instrument, listener) =>
        {
            if (instrument.Meter.Name == rmMeterName &&
                instrument.Name.StartsWith("container."))
            {
                listener.EnableMeasurementEvents(instrument, null);
            }
        }
    };
    
    var samples = new Dictionary<string, double>();
    meterListener.SetMeasurementEventCallback<double>((instrument, value, _, _) =>
    {
        if (instrument.Meter.Name == rmMeterName)
        {
            samples[instrument.Name] = value;
        }
    });
    meterListener.Start();

    await AnsiConsole.Live(table)
        .StartAsync(async ctx =>
        {
            var window = TimeSpan.FromSeconds(5);
            while (cancellationToken.IsCancellationRequested is false)
            {
                meterListener.RecordObservableInstruments();

                table.AddRow(
                    [
                        $"{DateTime.Now:T}",
                        $"{samples["container.cpu.limit.utilization"]:p}",
                        $"{samples["container.cpu.request.utilization"]:p}",
                        $"{samples["container.memory.limit.utilization"]:p}",
                    ]);

                ctx.Refresh();

                await Task.Delay(window);
            }
        });
}

上記のコードでは次の操作が行われます。

  • キャンセル トークンのソースとキャンセル トークンを作成します。
  • 新しい Table インスタンスを作成し、タイトル、キャプション、列で構成します。
  • Table インスタンスのライブ レンダリングを実行し、3 秒ごとに呼び出されるデリゲートを渡します。
  • SetMeasurementEventCallback メソッドでコールバック セットを使用して現在のリソース使用率情報を取得し、Table インスタンスの新しい行として表示します。

以下は、上記のコードの出力例です。

手動メトリック アプリの出力を使用したリソース監視の例。

この例の完全なソース コードについては、 手動メトリックによるリソース監視のサンプルを参照してください。

Kubernetes プローブ

Kubernetes クラスター内に存在するアプリは、リソース監視に加えて、診断プローブを使用して正常性を報告します。 Microsoft.Extensions.Diagnostics.Probes NuGet パッケージは、Kubernetes プローブをサポートしています。 これは、さまざまな Kubernetes プローブと連携するさまざまな正常性チェックを外部化します。

  • 稼動
  • 準備
  • スタートアップ

ライブラリは、アプリの現在の正常性を Kubernetes ホスティング環境に伝えます。 プロセスで異常が報告されると、Kubernetes はトラフィックの送信を一切行わず、プロセスが回復または終了する時間を確保します。

Kubernetes プローブのサポートを追加するには、Microsoft.Extensions.Diagnostics.Probes へのパッケージ参照を追加します。 IServiceCollection インスタンスで、AddKubernetesProbes を呼び出します。

関連項目