Comparteix a través de


Supervisión de recursos

La supervisión de recursos implica la medición continua del uso de recursos durante un período especificado. El paquete NuGet Microsoft.Extensions.Diagnostics.ResourceMonitoring ofrece una colección de API adaptadas para supervisar el uso de recursos de las aplicaciones de .NET.

La interfaz IResourceMonitor proporciona métodos para recuperar información en tiempo real sobre el uso de recursos del proceso. Esta interfaz admite la recuperación de datos relacionados con el uso de CPU y memoria, y actualmente es compatible con las plataformas Windows y Linux. Toda la información de diagnóstico de la supervisión de recursos se publica en OpenTelemetry de forma predeterminada, por lo que no es necesario publicarla manualmente.

Además, la biblioteca de supervisión de recursos notifica varias métricas de diagnóstico. Para más información, consulte Métricas de diagnóstico: Microsoft.Extensions.Diagnostics.ResourceMonitoring.

Ejemplo de supervisión de recursos

En el ejemplo siguiente se muestra cómo usar la interfaz IResourceMonitor para recuperar información sobre el uso de memoria y CPU en el proceso actual.

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>();

El código anterior:

Importante

El paquete Microsoft.Extensions.Diagnostics.ResourceMonitoring supone que el consumidor registrará proveedores de registro en el paquete Microsoft.Extensions.Logging. Si no registra el registro, la llamada a AddResourceMonitoring produce una excepción.

En este momento, con la implementación de IResourceMonitor, solicitará el uso de recursos con el método IResourceMonitor.GetUtilization. El método GetUtilization devuelve una instancia de ResourceUtilization que contiene la siguiente información:

Ampliación de la supervisión de recursos con Spectre.Console

Al ampliar este ejemplo, puede aprovechar Spectre.Console, una biblioteca de .NET muy valorada que está diseñada para simplificar el desarrollo de aplicaciones de consola multiplataforma visualmente atractivas. Con Spectre, puede presentar datos de uso de los recursos en formato tabular. El código siguiente muestra el uso de la interfaz IResourceMonitor para acceder a los detalles relacionados con el uso de CPU y memoria del proceso actual y, a continuación, se presentan estos datos en una tabla:

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();
    };
}

El código anterior:

  • Crea un origen de token de cancelación y un token de cancelación.
  • Crea una nueva instancia de Table y la configura con un título, un subtítulo y columnas.
  • Hace una representación dinámica de la instancia de Table, pasando un delegado que se invoca cada tres segundos.
  • Obtiene la información de uso de los recursos actual de la instancia de IResourceMonitor y la muestra como una nueva fila en la instancia de Table.

El siguiente es un ejemplo de la salida del código anterior:

Example Resource Monitoring app output.

Para ver el código fuente de este ejemplo, consulte el ejemplo de supervisión de recursos.

Sondeos de Kubernetes

Además de la supervisión de recursos, las aplicaciones que existen dentro de un clúster de Kubernetes notifican su estado a través de sondeos de diagnóstico. El paquete NuGet Microsoft.Extensions.Diagnostics.Probes proporciona compatibilidad con los sondeos de Kubernetes. Externaliza varias comprobaciones de estado que se alinean con varios sondeos de Kubernetes, por ejemplo:

  • Ejecución
  • Preparación
  • Startup

La biblioteca comunica el estado actual de las aplicaciones a un entorno de hospedaje de Kubernetes. Si un proceso indica un estado incorrecto, Kubernetes no le envía ningún tráfico, con el fin de darle tiempo para recuperarse o finalizar.

Para agregar compatibilidad con los sondeos de Kubernetes, agregue una referencia de paquete a Microsoft.Extensions.Diagnostics.Probes. En una instancia de IServiceCollection, llame a AddKubernetesProbes.

Consulte también