Freigeben über


Ressourcenüberwachung

Die Ressourcenüberwachung umfasst die kontinuierliche Messung der Ressourcenauslastung über einen bestimmten Zeitraum. Das NuGet-Paket Microsoft.Extensions.Diagnostics.ResourceMonitoring bietet eine Sammlung von APIs, die auf die Überwachung der Ressourcenauslastung von .NET-Anwendungen zugeschnitten sind.

Die IResourceMonitor-Schnittstelle enthält Methoden zum Abrufen von Echtzeitinformationen zur Prozessressourcennutzung. Diese Schnittstelle unterstützt das Abrufen von Daten im Zusammenhang mit der CPU- und Arbeitsspeicherauslastung und ist derzeit mit Windows- und Linux-Plattformen kompatibel. Alle Diagnoseinformationen zur Ressourcenüberwachung werden standardmäßig in OpenTelemetry veröffentlicht. Daher müssen sie nicht manuell veröffentlicht werden.

Darüber hinaus meldet die Ressourcenüberwachungsbibliothek verschiedene Diagnosemetriken. Weitere Informationen finden Sie unter Diagnosemetriken: Microsoft.Extensions.Diagnostics.ResourceMonitoring.

Beispiel für die Nutzung der Ressourcenüberwachung

Im folgenden Beispiel wird veranschaulicht, wie die IResourceMonitor-Schnittstelle zum Abrufen von Informationen zur CPU- und Arbeitsspeicherauslastung des aktuellen Prozesses verwendet wird.

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

Der vorangehende Code:

Wichtig

Das Microsoft.Extensions.Diagnostics.ResourceMonitoring-Paket geht davon aus, dass der Consumer die Protokollierungsanbieter beim Microsoft.Extensions.Logging-Paket registriert. Wenn die Protokollierung nicht registriert wird, löst der Aufruf von AddResourceMonitoring eine Ausnahme aus. Darüber hinaus können Sie die interne Bibliotheksprotokollierung aktivieren, indem Sie die Debug Protokollebene für die Microsoft.Extensions.Diagnostics.ResourceMonitoring Kategorie entsprechend der Anleitung konfigurieren.

An diese Stelle fragen Sie bei der IResourceMonitor-Implementierung mit der IResourceMonitor.GetUtilization-Methode nach der Ressourcenauslastung. Die GetUtilization-Methode gibt eine ResourceUtilization-Instanz zurück, die folgende Informationen enthält:

Erweitern der Ressourcenüberwachung durch Spectre.Console

Wenn Sie dieses Beispiel erweitern, können Sie Spectre.Console nutzen, eine bewährte .NET-Bibliothek, die die Entwicklung visuell ansprechender, plattformübergreifender Konsolenanwendungen vereinfacht. Mit Spectre können Sie Ressourcenauslastungsdaten in einem tabellarischen Format darstellen. Der folgende Code veranschaulicht die Verwendung der IResourceMonitor-Schnittstelle für den Zugriff auf Details zur CPU- und Arbeitsspeicherauslastung des aktuellen Prozesses und stellt diese Daten dann in einer Tabelle dar:

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

Der vorangehende Code:

  • Erstellt eine Abbruchtokenquelle und ein Abbruchtoken.
  • Erstellt eine neue Table-Instanz, die mit einem Titel, einer Beschriftung und Spalten konfiguriert wird.
  • Führt ein Liverendering der Table-Instanz durch, wobei ein Delegat übergeben wird, der alle drei Sekunden aufgerufen wird.
  • Ruft die aktuellen Informationen zur Ressourcenauslastung aus der IResourceMonitor-Instanz ab und zeigt sie als neue Zeile in der Table-Instanz an.

Es folgt ein Beispiel für die Ausgabe des voranstehenden Codes:

Beispiel für die App-Ausgabe der Ressourcenüberwachung.

Den Quellcode dieses Beispiels finden Sie im Beispiel zur Ressourcenüberwachung.

Kubernetes-Tests

Neben der Ressourcenüberwachung melden Apps, die in einem Kubernetes-Cluster vorhanden sind, ihre Integrität über Diagnosetests. Das NuGet-Paket Microsoft.Extensions.Diagnostics.Probes bietet Unterstützung für Kubernetes-Tests. Es externalisiert verschiedene Integritätsprüfungen, die an verschiedenen Kubernetes-Tests ausgerichtet sind, z. B.:

  • Livezustand
  • Bereitschaft
  • Startup

Die Bibliothek informiert eine Kubernetes-Hostingumgebung über die aktuelle Integrität der Apps. Wenn ein Prozess als fehlerhaft gemeldet wird, sendet Kubernetes keinen Datenverkehr an ihn, und stellt Prozesszeit für die Wiederherstellung oder Beendigung bereit.

Um Unterstützung für Kubernetes-Tests hinzuzufügen, fügen Sie einen Paketverweis auf Microsoft.Extensions.Diagnostics.Probes hinzu. Rufen Sie in einer IServiceCollection-Instanz AddKubernetesProbes auf.

Siehe auch