次の方法で共有


リソースの監視

リソースを監視するには、指定された期間にわたってリソース使用率を継続的に測定する必要があります。 Microsoft.Extensions.Diagnostics.ResourceMonitoring NuGet パッケージには、.NET アプリケーションのリソース使用率を監視するために調整された API のコレクションが用意されています。

IResourceMonitor インターフェイスは、プロセスのリソース使用率に関するリアルタイム情報を取得するためのメソッドを提供します。 このインターフェイスは、CPU とメモリの使用状況に関連するデータの取得をサポートしており、現在、Windows と Linux の両方のプラットフォームと互換性があります。 すべてのリソース監視診断情報が既定で OpenTelemetry に公開されるため、自身で手動で公開する必要はありません。

さらに、リソース監視ライブラリでは、さまざまな診断メトリックが報告されます。 詳細については、診断メトリック: Microsoft.Extensions.Diagnostics.ResourceMonitoring に関するページを参照してください。

リソース監視の使用例

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

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

var services = new ServiceCollection()
    .AddLogging(static builder => builder.AddConsole())
    .AddResourceMonitoring();

var provider = services.BuildServiceProvider();

var monitor = provider.GetRequiredService<IResourceMonitor>();

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

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

重要

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

この時点で、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);
            }
        });

    Console.CancelKeyPress += (_, e) =>
    {
        e.Cancel = true;
        cancellationTokenSource.Cancel();
    };
}

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

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

前述のコードからの出力例を次に示します。

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

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

Kubernetes プローブ

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

  • 稼動
  • 対応性
  • Startup

アプリの現在の正常性は、ライブラリによって Kubernetes ホスティング環境に伝達されます。 プロセスが異常と報告すると、Kubernetes はトラフィックを送信せず、復旧または終了のプロセス時間を提供します。

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

関連項目