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:
- Crea un'istanza di una nuova istanza ServiceCollection, concatenando le chiamate ai metodi di estensione AddLogging e AddResourceMonitoring.
- Compila una nuova istanza ServiceProvider dall'istanza
ServiceCollection
. - Ottiene un'istanza dell'interfaccia IResourceMonitor dall'istanza
ServiceProvider
.
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:
- ResourceUtilization.CpuUsedPercentage: utilizzo CPU in percentuale.
- ResourceUtilization.MemoryUsedPercentage: utilizzo memoria in percentuale.
- ResourceUtilization.MemoryUsedInBytes: utilizzo memoria in byte.
- ResourceUtilization.SystemResources: risorse di sistema.
- SystemResources.GuaranteedMemoryInBytes: memoria garantita in byte.
- SystemResources.MaximumMemoryInBytes: memoria massima in byte.
- SystemResources.GuaranteedCpuUnits: CPU garantita in unità.
- SystemResources.MaximumCpuUnits: CPU massima in unità.
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'istanzaTable
.
Segue un esempio di output dal codice precedente:
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.