Monitorização de recursos
O monitoramento de recursos envolve a medição contínua da utilização de recursos durante um período especificado. O pacote NuGet Microsoft.Extensions.Diagnostics.ResourceMonitoring oferece uma coleção de APIs personalizadas para monitorar a utilização de recursos de seus aplicativos .NET.
A IResourceMonitor interface fornece métodos para recuperar informações em tempo real sobre a utilização de recursos do processo. Esta interface suporta a recuperação de dados relacionados com o uso de CPU e memória e é atualmente compatível com as plataformas Windows e Linux. Todas as informações de diagnóstico de monitoramento de recursos são publicadas no OpenTelemetry por padrão, portanto, não há necessidade de publicar isso manualmente.
Além disso, a biblioteca de monitoramento de recursos relata várias métricas de diagnóstico. Para obter mais informações, consulte Métricas de diagnóstico: Microsoft.Extensions.Diagnostics.ResourceMonitoring
.
Exemplo de uso de monitoramento de recursos
O exemplo a seguir demonstra como usar a IResourceMonitor
interface para recuperar informações sobre o uso de CPU e memória do processo atual.
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>();
O código anterior:
- Instancia uma nova ServiceCollection instância, encadeando chamadas para os AddLogging métodos e AddResourceMonitoring extensão.
- Cria uma nova ServiceProvider instância a partir da
ServiceCollection
instância. - Obtém uma instância da IResourceMonitor interface da
ServiceProvider
instância.
Importante
O Microsoft.Extensions.Diagnostics.ResourceMonitoring pacote pressupõe que o consumidor registrará provedores de registro com o Microsoft.Extensions.Logging
pacote. Se você não registrar o registro, a chamada para AddResourceMonitoring
lançará uma exceção. Além disso, você pode habilitar o log da biblioteca interna configurando o nível de Debug
log para a Microsoft.Extensions.Diagnostics.ResourceMonitoring
categoria de acordo com o guia.
Neste ponto, com a implementação, você solicitará a IResourceMonitor
utilização de recursos com o IResourceMonitor.GetUtilization método. O GetUtilization
método retorna uma ResourceUtilization instância que contém as seguintes informações:
- ResourceUtilization.CpuUsedPercentage: Utilização da CPU em percentagem.
- ResourceUtilization.MemoryUsedPercentage: Uso de memória como uma porcentagem.
- ResourceUtilization.MemoryUsedInBytes: Uso de memória em bytes.
- ResourceUtilization.SystemResources: Recursos do sistema.
- SystemResources.GuaranteedMemoryInBytes: Memória garantida em bytes.
- SystemResources.MaximumMemoryInBytes: Memória máxima em bytes.
- SystemResources.GuaranteedCpuUnits: CPU garantida em unidades.
- SystemResources.MaximumCpuUnits: CPU máxima em unidades.
Estenda o monitoramento de recursos com o Spectre.Console
Estendendo este exemplo, você pode aproveitar o Spectre.Console, uma biblioteca .NET bem conceituada projetada para simplificar o desenvolvimento de aplicativos de console visualmente atraentes e multiplataforma. Com o Spectre, você poderá apresentar dados de utilização de recursos em um formato tabular. O código a seguir ilustra o IResourceMonitor
uso da interface para acessar detalhes sobre o uso de CPU e memória do processo atual e, em seguida, apresenta esses dados em uma tabela:
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();
};
}
O código anterior:
- Cria uma fonte de token de cancelamento e um token de cancelamento.
- Cria uma nova
Table
instância, configurando-a com um título, legenda e colunas. - Executa uma renderização ao vivo da
Table
instância, passando um delegado que será invocado a cada três segundos. - Obtém as informações atuais de utilização de recursos da
IResourceMonitor
instância e as exibe como uma nova linha naTable
instância.
Segue-se um exemplo da saída do código anterior:
Para obter o código-fonte deste exemplo, consulte o Exemplo de monitoramento de recursos.
Sondas Kubernetes
Além do monitoramento de recursos, os aplicativos que existem em um cluster Kubernetes relatam sua integridade por meio de testes de diagnóstico. O pacote NuGet Microsoft.Extensions.Diagnostics.Probes fornece suporte para testes Kubernetes. Ele externaliza várias verificações de integridade que se alinham com várias sondas do Kubernetes, por exemplo:
- Vivacidade
- Prontidão
- Arranque
A biblioteca comunica a integridade atual dos aplicativos a um ambiente de hospedagem Kubernetes. Se um processo relatar como não íntegro, o Kubernetes não enviará nenhum tráfego, fornecendo tempo para que o processo seja recuperado ou encerrado.
Para adicionar suporte para testes Kubernetes, adicione uma referência de pacote a Microsoft.Extensions.Diagnostics.Probes. Em uma IServiceCollection instância, chame AddKubernetesProbes.