Поделиться через


Мониторинг ресурсов

Мониторинг ресурсов включает непрерывное измерение использования ресурсов за указанный период. Пакет NuGet Microsoft.Extensions.Diagnostics.ResourceMonitoring предлагает коллекцию API, адаптированных для мониторинга использования ресурсов приложений .NET.

Интерфейс IResourceMonitor предоставляет методы для получения сведений в режиме реального времени об использовании ресурсов процесса. Этот интерфейс поддерживает получение данных, связанных с использованием ЦП и памяти, и в настоящее время совместимо с платформами Windows и Linux. Все диагностические сведения мониторинга ресурсов публикуются в OpenTelemetry по умолчанию, поэтому не нужно вручную публиковать эту информацию самостоятельно.

Кроме того, библиотека мониторинга ресурсов сообщает различные диагностические метрики. Дополнительные сведения см. в разделе Метрики диагностики: Microsoft.Extensions.Diagnostics.ResourceMonitoring

Пример использования мониторинга ресурсов

В следующем примере показано, как использовать IResourceMonitor интерфейс для получения сведений об использовании ЦП и памяти текущего процесса.

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

Предыдущий код:

  • Создает экземпляр нового ServiceCollection экземпляра, цепляя вызовы AddLogging методов расширения и AddResourceMonitoring методов расширения.
  • Создает новый ServiceProvider экземпляр из экземпляра ServiceCollection .
  • Возвращает экземпляр IResourceMonitor интерфейса из экземпляра ServiceProvider .

Внимание

В пакете Microsoft.Extensions.Diagnostics.ResourceMonitoring предполагается, что потребитель будет регистрировать поставщиков ведения журнала в пакете Microsoft.Extensions.Logging . Если вы не регистрируете ведение журнала, вызов AddResourceMonitoring вызовет исключение. Кроме того, вы можете включить ведение журнала внутренней библиотеки, настроив Debug уровень журнала для категории, как показано в руководстве.Microsoft.Extensions.Diagnostics.ResourceMonitoring

На этом этапе с реализацией IResourceMonitor вы будете запрашивать использование ресурсов с IResourceMonitor.GetUtilization помощью метода. Метод GetUtilization возвращает ResourceUtilization экземпляр, содержащий следующие сведения:

Расширение мониторинга ресурсов с помощью Spectre.Console

Расширяя этот пример, вы можете использовать Spectre.Console, хорошо известную библиотеку .NET, предназначенную для упрощения разработки визуальных приложений кроссплатформенных консольных приложений. С помощью Spectre вы сможете представить данные об использовании ресурсов в табличном формате. Следующий код иллюстрирует использование IResourceMonitor интерфейса для получения сведений об использовании ЦП и памяти текущего процесса, а затем представление этих данных в таблице:

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

Предыдущий код:

  • Создает источник маркера отмены и маркер отмены.
  • Создает новый Table экземпляр, настраивая его с заголовком, подписью и столбцами.
  • Выполняет динамическую отрисовку Table экземпляра, передавая делегат, который будет вызываться каждые три секунды.
  • Возвращает текущие сведения об использовании ресурсов из экземпляра IResourceMonitor и отображает его в виде новой строки в экземпляре Table .

Ниже приведен пример выходных данных из предыдущего кода:

Пример выходных данных приложения мониторинга ресурсов.

Исходный код этого примера см. в примере мониторинга ресурсов.

Пробы Kubernetes

Помимо мониторинга ресурсов приложения, существующие в кластере Kubernetes, сообщают о работоспособности с помощью диагностических проб. Пакет NuGet Microsoft.Extensions.Diagnostics.Probes обеспечивает поддержку проб Kubernetes. Она выполняет различные проверки работоспособности, которые соответствуют различным пробам Kubernetes, например:

  • Живость
  • Готовность
  • Запуск

Библиотека сообщает приложениям о текущей работоспособности в среде размещения Kubernetes. Если процесс сообщает о неработоспособном состоянии, Kubernetes не отправляет его трафик, предоставляя время процесса для восстановления или завершения.

Чтобы добавить поддержку проб Kubernetes, добавьте ссылку на пакет в Microsoft.Extensions.Diagnostics.Probes. В экземпляре IServiceCollection вызовите AddKubernetesProbes.

См. также