Resursövervakning

Resursövervakning omfattar kontinuerlig mätning av resursanvändningsvärden, till exempel CPU, minne och nätverksanvändning. NuGet-paketet Microsoft.Extensions.Diagnostics.ResourceMonitoring erbjuder en samling API:er som är skräddarsydda för att övervaka resursanvändningen för dina .NET-program.

Mätningarna kan användas på två sätt:

Viktigt!

Paketet Microsoft.Extensions.Diagnostics.ResourceMonitoring förutsätter att konsumenten registrerar loggningsproviders med Microsoft.Extensions.Logging paketet. Om du inte registrerar loggning utlöser anropet till AddResourceMonitoring ett undantag. Dessutom kan du aktivera intern biblioteksloggning genom att Debug konfigurera loggnivån för Microsoft.Extensions.Diagnostics.ResourceMonitoring kategorin enligt guiden.

Använda .NET-mått för resursövervakning

Så här använder du .NET-mått som produceras av resursövervakningsbiblioteket:

  1. Lägg till Microsoft.Extensions.Diagnostics.ResourceMonitoring-paketet i projektet.

  2. Lägg till tjänster för resursövervakning i din dependency injection-container.

    services.AddResourceMonitoring();
    
  3. Konfigurera insamling av mått med alla OpenTelemetry-kompatibla måttinsamlare. Till exempel:

    services.AddOpenTelemetry()
        .WithMetrics(builder =>
        {
            builder.AddMeter("Microsoft.Extensions.Diagnostics.ResourceMonitoring");
            builder.AddConsoleExporter(); // Or any other metrics exporter
        });
    
  4. Nu kan du observera resursanvändningsstatistiken via din konfigurerade måttexportör.

Information om tillgängliga mått finns i .NET-tilläggsmått: Microsoft.Extensions.Diagnostics.ResourceMonitoring.

Information om insamling av mått finns i Måttsamling.

Använd IResourceMonitor-gränssnittet

Försiktighet

Gränssnittet IResourceMonitor som beskrivs i det här avsnittet är inaktuellt och kan tas bort i framtida versioner av .NET. Migrera till den måttbaserade metoden.

Gränssnittet IResourceMonitor tillhandahåller metoder för att hämta realtidsinformation om processresursanvändning. Det här gränssnittet stöder hämtning av data som rör processor- och minnesanvändning och är för närvarande kompatibelt med både Windows- och Linux-plattformar.

Exempel på användning av resursövervakning

I följande exempel visas hur du använder IResourceMonitor gränssnittet för att hämta information om den aktuella processens processor- och minnesanvändning.

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();

Koden ovan:

Nu med implementeringen IResourceMonitor ber du om resursanvändning med IResourceMonitor.GetUtilization metoden . Metoden GetUtilization returnerar en ResourceUtilization instans som innehåller följande information:

Utöka resursövervakning med Spectre.Console

Om du utökar det här exemplet kan du använda Spectre.Console, ett väl ansedd .NET-bibliotek som är utformat för att förenkla utvecklingen av visuellt tilltalande konsolprogram mellan plattformar. Med Spectre kan du presentera resursanvändningsdata i tabellformat. Följande kod illustrerar användningen av IResourceMonitor gränssnittet för att få åtkomst till information om processor- och minnesanvändningen för den aktuella processen och presenterar sedan dessa data i en tabell:

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);
            }
        });
}

Koden ovan:

  • Skapar en källa för annulleringstoken och en annulleringstoken.
  • Skapar en ny Table instans och konfigurerar den med en rubrik, bildtext och kolumner.
  • Utför en live-återgivning av instansen Table och skickar in ett ombud som anropas var tredje sekund.
  • Hämtar den aktuella resursanvändningsinformationen från instansen IResourceMonitor och visar den som en ny rad i instansen Table .

Följande är ett exempel på utdata från föregående kod:

Exempel på resursövervakningsappens utdata.

Källkoden för det här exemplet finns i exemplet Resursövervakning.

Migrera till måttbaserad resursövervakning

IResourceMonitor Eftersom gränssnittet är inaktuellt migrerar du till den måttbaserade metoden. Paketet Microsoft.Extensions.Diagnostics.ResourceMonitoring innehåller flera mått som du kan använda i stället, till exempel:

  • container.cpu.limit.utilization: Andel CPU-användning för den containeriserade applikationen som körs jämfört med resursbegränsningen inom intervallet [0, 1]. Tillgänglig för containerbaserade appar i Linux och Windows.
  • container.cpu.request.utilization: CPU-förbrukningsandel för det containerbaserade program som körs jämfört med resursbegäran inom intervallet [0, 1]. Tillgänglig för containerbaserade appar i Linux.
  • container.memory.limit.utilization: Minnesförbrukningsandel för det körande containerbaserade programmet i förhållande till resursgränsen inom intervallet [0, 1]. Tillgänglig för containerbaserade appar i Linux och Windows.

Mer information om tillgängliga mått finns i avsnittet Inbyggda mått: Microsoft.Extensions.Diagnostics.ResourceMonitoring .

Migreringsguide

Det här avsnittet innehåller en migreringsguide från det inaktuella IResourceMonitor gränssnittet till den måttbaserade metoden. Du behöver bara den här guiden om du manuellt lyssnar på resursanvändningsmått i ditt program. I de flesta fall behöver du inte lyssna på mått manuellt eftersom de samlas in och exporteras automatiskt till serverdelar med hjälp av måttexportörer, enligt beskrivningen i Använda .NET-mått för resursövervakning.

Om du har kod som liknar exempelanvändningenIResourceMonitor uppdaterar du den på följande sätt:

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);
            }
        });
}

Koden ovan:

  • Skapar en källa för annulleringstoken och en annulleringstoken.
  • Skapar en ny Table instans och konfigurerar den med en rubrik, bildtext och kolumner.
  • Utför en live-återgivning av instansen Table och skickar in ett ombud som anropas var tredje sekund.
  • Hämtar den aktuella resursanvändningsinformationen med hjälp av en motringningsuppsättning med SetMeasurementEventCallback metoden och visar den som en ny rad i instansen Table .

Följande är ett exempel på utdata från föregående kod:

Exempel på resursövervakning med manuella metriska data från app.

Den fullständiga källkoden för det här exemplet finns i exemplet Resursövervakning med manuella mått.

Kubernetes-avsökningar

Förutom resursövervakning rapporterar appar som finns i ett Kubernetes-kluster sin hälsa via diagnostikavsökningar. NuGet-paketet Microsoft.Extensions.Diagnostics.Probes har stöd för Kubernetes-avsökningar. Den externaliserar olika hälsokontroller som överensstämmer med olika Kubernetes-avsökningar, till exempel:

  • Livskraft
  • Beredskap
  • Start

Biblioteket kommunicerar appens aktuella hälsa till en Kubernetes-värdmiljö. Om en process rapporterar att den inte är felfri skickar Kubernetes ingen trafik, vilket ger processtiden att återställa eller avsluta.

Om du vill lägga till stöd för Kubernetes-avsökningar lägger du till en paketreferens till Microsoft.Extensions.Diagnostics.Probes. På en IServiceCollection instans anropar du AddKubernetesProbes.

Se även