Udostępnij za pośrednictwem


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:

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:

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ąpieniu Table .

Poniżej przedstawiono przykładowe dane wyjściowe z poprzedniego kodu:

Przykładowe dane wyjściowe aplikacji do monitorowania zasobów.

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.

Zobacz też