Condividi tramite


Monitoraggio delle risorse

Il monitoraggio delle risorse implica la misurazione continua dell'utilizzo delle risorse in un periodo specificato. Il pacchetto NuGet Microsoft.Extensions.Diagnostics.ResourceMonitoring offre una raccolta di API personalizzate per il monitoraggio dell'utilizzo delle risorse delle applicazioni .NET.

L'interfaccia IResourceMonitor fornisce metodi per il recupero di informazioni in tempo reale relative all'utilizzo delle risorse del processo. Questa interfaccia supporta il recupero dei dati correlati all'utilizzo della CPU e della memoria ed è attualmente compatibile con le piattaforme Windows e Linux. Tutte le informazioni di diagnostica del monitoraggio delle risorse vengono pubblicate in OpenTelemetry per impostazione predefinita, quindi non è necessario pubblicarle manualmente.

Inoltre, la libreria di monitoraggio delle risorse riporta varie metriche di diagnostica. Per altre informazioni, vedere Metriche di diagnostica: Microsoft.Extensions.Diagnostics.ResourceMonitoring.

Esempio di utilizzo del monitoraggio delle risorse

L'esempio seguente illustra come usare l'interfaccia IResourceMonitor per recuperare informazioni sull'utilizzo della CPU e della memoria del processo corrente.

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

Il codice precedente:

Importante

Il pacchetto Microsoft.Extensions.Diagnostics.ResourceMonitoring presuppone che il consumer registrerà i provider di registrazione con il pacchetto Microsoft.Extensions.Logging. Se non si registra la registrazione, la chiamata a AddResourceMonitoring genererà un'eccezione. Inoltre, è possibile abilitare la registrazione della libreria interna configurando il Debug livello di log per la Microsoft.Extensions.Diagnostics.ResourceMonitoring categoria in base alla guida.

A questo punto, con l'implementazione di IResourceMonitor si chiederà l'utilizzo delle risorse con il metodo IResourceMonitor.GetUtilization. Il metodo GetUtilization restituisce un'istanza ResourceUtilization che contiene le informazioni seguenti:

Estendere il monitoraggio delle risorse con Spectre.Console

Estendendo questo esempio, è possibile sfruttare Spectre.Console, una libreria .NET affidabile e progettata per semplificare lo sviluppo di applicazioni console multipiattaforma dall'aspetto accattivante. Con Spectre, sarà possibile presentare i dati di utilizzo delle risorse in un formato tabulare. Il codice seguente illustra l'utilizzo dell'interfaccia IResourceMonitor per accedere ai dettagli relativi all'utilizzo della CPU e della memoria del processo corrente, quindi presentando questi dati in una tabella:

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

Il codice precedente:

  • Crea un'origine del token di annullamento e un token di annullamento.
  • Crea una nuova istanza Table, configurandola con un titolo, un didascalia e colonne.
  • Esegue un rendering in tempo reale dell'istanza Table, passando un delegato che verrà richiamato ogni tre secondi.
  • Ottiene le informazioni sull'utilizzo delle risorse correnti dall'istanza IResourceMonitor e le visualizza come nuova riga nell'istanza Table.

Segue un esempio di output dal codice precedente:

Esempio di output dell'app di monitoraggio delle risorse.

Per il codice sorgente di questo esempio, vedereCampione di monitoraggio delle risorse.

Probe Kubernetes

Oltre al monitoraggio delle risorse, le app esistenti all'interno di un cluster Kubernetes segnalano l'integrità tramite probe di diagnostica. Il pacchetto NuGet Microsoft.Extensions.Diagnostics.Probes fornisce supporto per i probe Kubernetes. Esterna i vari controlli di integrità allineati a vari probe Kubernetes, ad esempio:

  • Attività
  • Preparazione
  • Startup

La libreria comunica l'integrità corrente delle app a un ambiente di hosting Kubernetes. Se un processo risulta essere non integro, Kubernetes non invia traffico a esso, fornendo il tempo di elaborazione per il ripristino o l'interruzione.

Per aggiungere il supporto per i probe Kubernetes, aggiungere un riferimento al pacchetto a Microsoft.Extensions.Diagnostics.Probes. In un'istanza IServiceCollection, chiamare AddKubernetesProbes.

Vedi anche