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:
- Instanziiert eine neue ServiceCollection-Instanz, wobei Aufrufe der AddLogging-Methoden und der AddResourceMonitoring-Erweiterungsmethoden verkettet werden.
- Erstellt eine neue ServiceProvider-Instanz aus der
ServiceCollection
-Instanz. - Ruft eine Instanz der IResourceMonitor-Schnittstelle aus der
ServiceProvider
-Instanz ab.
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.
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:
- ResourceUtilization.CpuUsedPercentage: CPU-Auslastung als Prozentsatz.
- ResourceUtilization.MemoryUsedPercentage: Arbeitsspeicherauslastung als Prozentsatz.
- ResourceUtilization.MemoryUsedInBytes: Arbeitsspeicherauslastung in Byte.
- ResourceUtilization.SystemResources: Systemressourcen.
- SystemResources.GuaranteedMemoryInBytes: Garantierter Arbeitsspeicher in Byte.
- SystemResources.MaximumMemoryInBytes: Maximaler Arbeitsspeicher in Byte.
- SystemResources.GuaranteedCpuUnits: Garantierte CPU-Einheiten.
- SystemResources.MaximumCpuUnits: Maximale CPU-Einheiten.
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 derTable
-Instanz an.
Es folgt ein Beispiel für die Ausgabe des voranstehenden Codes:
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.