Monitorowanie zasobów
Monitorowanie zasobów obejmuje ciągły pomiar wykorzystania zasobów w określonym przedziale czasu. Pakiet NuGet Microsoft.Extensions.Diagnostics.ResourceMonitoring oferuje kolekcję interfejsów API dostosowanych do monitorowania wykorzystania zasobów aplikacji platformy .NET.
Interfejs IResourceMonitor dostarcza metody pobierania informacji w czasie rzeczywistym dotyczących wykorzystania zasobów procesu. Ten interfejs obsługuje pobieranie danych związanych z użyciem procesora CPU i pamięci i jest obecnie zgodne z platformami Windows i Linux. Wszystkie informacje diagnostyczne dotyczące monitorowania zasobów są domyślnie publikowane w usłudze OpenTelemetry, dlatego nie trzeba ręcznie publikować tych informacji samodzielnie.
Ponadto biblioteka monitorowania zasobów raportuje różne metryki diagnostyczne. Aby uzyskać więcej informacji, zobacz Metryki diagnostyczne: Microsoft.Extensions.Diagnostics.ResourceMonitoring
.
Przykładowe użycie monitorowania zasobów
W poniższym przykładzie pokazano, jak używać interfejsu IResourceMonitor
do pobierania informacji o użyciu procesora CPU i pamięci bieżącego procesu.
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>();
Powyższy kod ma następujące działanie:
- Tworzy wystąpienie nowego ServiceCollection wystąpienia, tworząc łańcuch wywołań metod AddLogging i AddResourceMonitoring rozszerzeń.
- Tworzy nowe ServiceProvider wystąpienie z
ServiceCollection
wystąpienia. - Pobiera wystąpienie interfejsu IResourceMonitor
ServiceProvider
z wystąpienia.
Ważne
Pakiet Microsoft.Extensions.Diagnostics.ResourceMonitoring zakłada, że konsument zarejestruje dostawców rejestrowania w pakiecie Microsoft.Extensions.Logging
. Jeśli nie zarejestrujesz rejestrowania, wywołanie metody w celu AddResourceMonitoring
zgłoszenia wyjątku. Ponadto można włączyć rejestrowanie biblioteki wewnętrznej, konfigurując Debug
poziom dziennika dla Microsoft.Extensions.Diagnostics.ResourceMonitoring
kategorii zgodnie z przewodnikiem.
W tym momencie z implementacją IResourceMonitor
poprosisz o wykorzystanie zasobów za pomocą IResourceMonitor.GetUtilization metody . Metoda GetUtilization
zwraca ResourceUtilization wystąpienie zawierające następujące informacje:
- ResourceUtilization.CpuUsedPercentage: użycie procesora CPU jako wartość procentowa.
- ResourceUtilization.MemoryUsedPercentage: użycie pamięci jako wartość procentowa.
- ResourceUtilization.MemoryUsedInBytes: użycie pamięci w bajtach.
- ResourceUtilization.SystemResources: Zasoby systemowe.
- SystemResources.GuaranteedMemoryInBytes: gwarantowana pamięć w bajtach.
- SystemResources.MaximumMemoryInBytes: Maksymalna ilość pamięci w bajtach.
- SystemResources.GuaranteedCpuUnits: Gwarantowane użycie procesora CPU w jednostkach.
- SystemResources.MaximumCpuUnits: maksymalny procesor CPU w jednostkach.
Rozszerzanie monitorowania zasobów za pomocą pliku Spectre.Console
Rozszerzając ten przykład, możesz skorzystać z konsoli Spectre.Console, dobrze uznanej biblioteki .NET zaprojektowanej w celu uproszczenia opracowywania atrakcyjnych wizualnie aplikacji konsolowych dla wielu platform. Dzięki usłudze Spectre będzie można prezentować dane wykorzystania zasobów w formacie tabelarycznym. Poniższy kod ilustruje użycie interfejsu IResourceMonitor
w celu uzyskania dostępu do szczegółów dotyczących użycia procesora CPU i pamięci bieżącego procesu, a następnie przedstawianie tych danych w tabeli:
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();
};
}
Powyższy kod ma następujące działanie:
- Tworzy źródło tokenu anulowania i token anulowania.
- Tworzy nowe
Table
wystąpienie, konfiguruje je z tytułem, podpisem i kolumnami. - Wykonuje renderowanie na żywo
Table
wystąpienia, przekazując delegata, który będzie wywoływany co trzy sekundy. - Pobiera informacje o bieżącym wykorzystaniu zasobów z
IResourceMonitor
wystąpienia i wyświetla je jako nowy wiersz w wystąpieniuTable
.
Poniżej przedstawiono przykładowe dane wyjściowe z poprzedniego kodu:
Aby zapoznać się z kodem źródłowym tego przykładu, zobacz przykład Monitorowanie zasobów.
Sondy kubernetes
Oprócz monitorowania zasobów aplikacje istniejące w klastrze Kubernetes raportują kondycję za pośrednictwem sond diagnostycznych. Pakiet NuGet Microsoft.Extensions.Diagnostics.Probes zapewnia obsługę sond Kubernetes. Zewnętrznie sprawdza różne kontrole kondycji, które są zgodne z różnymi sondami Kubernetes, na przykład:
- Liveness (Żywość)
- Gotowość
- Uruchamianie
Biblioteka komunikuje bieżącą kondycję aplikacji ze środowiskiem hostingu Kubernetes. Jeśli proces zgłasza złą kondycję, platforma Kubernetes nie wysyła żadnego ruchu, zapewniając czas odzyskiwania lub zakończenia procesu.
Aby dodać obsługę sond Kubernetes, dodaj odwołanie do pakietu Microsoft.Extensions.Diagnostics.Probes. W wystąpieniu wywołaj metodę IServiceCollection AddKubernetesProbes.