Dela via


Resursövervakning

Resursövervakning omfattar kontinuerlig mätning av resursanvändning under en angiven period. 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.

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. All diagnostikinformation för resursövervakning publiceras som standard till OpenTelemetry, så du behöver inte publicera den manuellt själv.

Dessutom rapporterar resursövervakningsbiblioteket olika diagnostikmått. Mer information finns i Diagnostikmått: Microsoft.Extensions.Diagnostics.ResourceMonitoring.

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.Logging;
using Spectre.Console;

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

var provider = services.BuildServiceProvider();

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

Koden ovan:

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.

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

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

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.

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 apparnas 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