Partilhar via


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:

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:

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

Segue-se 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, 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.

Consulte também