Compartilhar via


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:

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:

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ância Table.

Veja a seguir um exemplo da saída do código anterior:

Exemplo de saída do aplicativo Monitoramento de recursos.

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.

Confira também