Monitoramento 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 interface IResourceMonitor fornece métodos para recuperar informações em tempo real sobre a utilização de recursos de processo. Essa interface dá suporte à recuperação de dados relacionados ao 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 é necessário publicar isso manualmente por conta própria.
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 interface IResourceMonitor
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:
- Cria uma instância ServiceCollection nova, encadeando chamadas para os métodos de extensão AddLogging e AddResourceMonitoring.
- Cria uma nova instância ServiceProvider da
ServiceCollection
instância. - Obtém uma instância da interface IResourceMonitor da instância
ServiceProvider
.
Importante
O pacote Microsoft.Extensions.Diagnostics.ResourceMonitoring pressupõe que o consumidor registrará provedores de log com o pacote Microsoft.Extensions.Logging
. Se você não registrar em log, a chamada a AddResourceMonitoring
irá gerar uma exceção. Além disso, você pode habilitar o registro interno da biblioteca configurando o nível de Debug
registro para a Microsoft.Extensions.Diagnostics.ResourceMonitoring
categoria de acordo com o guia.
Nesse ponto, com a implementação do IResourceMonitor
, você irá solicitar a utilização de recursos com o método IResourceMonitor.GetUtilization. O método GetUtilization
retorna uma instância ResourceUtilization que contém as seguintes informações:
- ResourceUtilization.CpuUsedPercentage: uso da CPU como porcentagem.
- ResourceUtilization.MemoryUsedPercentage: uso de memória como 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.
Como estender o monitoramento de recursos com Spectre.Console
Ao estender esse exemplo, você pode aproveitar o Spectre.Console, uma biblioteca .NET bem conceituada projetada para simplificar o desenvolvimento de aplicativos de console multiplataforma visualmente atraentes. Com o Spectre, você poderá apresentar dados de utilização de recursos em um formato tabular. O código a seguir ilustra o uso da interface IResourceMonitor
para acessar detalhes sobre a CPU e o uso de memória do processo atual e, em seguida, apresentar 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 instância
Table
, configurando-a com um título, legenda e colunas. - Executa uma renderização dinâmica da instância
Table
, passando um delegado que será invocado a cada três segundos. - Obtém as informações atuais de utilização de recursos da instância
IResourceMonitor
e as exibe como uma nova linha na instânciaTable
.
Veja a seguir um exemplo da saída do código anterior:
Para obter o código-fonte deste exemplo, confira o Exemplo de monitoramento de recursos.
Investigações do Kubernetes
Além do monitoramento de recursos, os aplicativos que existem em um cluster do Kubernetes relatam sua integridade por meio de investigações de diagnóstico. O pacote NuGet Microsoft.Extensions.Diagnostics.Probes fornece suporte a investigações do Kubernetes. Ele externaliza várias verificações de integridade que se alinham com diversas investigações do Kubernetes, por exemplo:
- Atividade
- Preparação
- Inicialização
A biblioteca comunica a integridade atual dos aplicativos a um ambiente de hospedagem do Kubernetes. Se um processo for relatado como não íntegro, o Kubernetes não enviará nenhum tráfego, fornecendo o tempo de processo para recuperar ou terminar.
Para adicionar suporte a investigações do Kubernetes, adicione uma referência de pacote a Microsoft.Extensions.Diagnostics.Probes. Em uma instância IServiceCollection, chame AddKubernetesProbes.