Мониторинг ресурсов
Мониторинг ресурсов включает непрерывное измерение использования ресурсов за указанный период. Пакет 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 экземпляр, содержащий следующие сведения:
- ResourceUtilization.CpuUsedPercentage: использование ЦП в процентах.
- ResourceUtilization.MemoryUsedPercentage: использование памяти в процентах.
- ResourceUtilization.MemoryUsedInBytes: использование памяти в байтах.
- ResourceUtilization.SystemResources: системные ресурсы.
- SystemResources.GuaranteedMemoryInBytes: гарантированная память в байтах.
- SystemResources.MaximumMemoryInBytes: максимальный объем памяти в байтах.
- SystemResources.GuaranteedCpuUnits: гарантированная загрузка ЦП в единицах.
- SystemResources.MaximumCpuUnits: максимальное количество ЦП в единицах.
Расширение мониторинга ресурсов с помощью 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.