Controlli di integrità delle app .NET in C#
In un sistema distribuito, i controlli di integrità sono valutazioni periodiche dello stato, della disponibilità e delle prestazioni dei singoli nodi o servizi. Questi controlli assicurano che il sistema funzioni correttamente e in modo efficiente. I controlli di integrità sono essenziali per l'affidabilità del sistema e vengono in genere eseguiti a intervalli regolari con i risultati analizzati per le azioni decisionali e correttive.
Sono possibili i seguenti risultati dello stato di controllo dell’integrità:
Inoltre, i controlli di integrità spesso segnalano varie metriche di diagnostica. Per altre informazioni, vedere Metriche di diagnostica: Microsoft.Extensions.Diagnostics.HealthChecks
.
Controlli di integrità sull'utilizzo delle risorse
Per eseguire controlli di integrità sull'utilizzo delle risorse delle app .NET, aggiungere un riferimento al pacchetto a Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. In un'istanza IServiceCollection, concatenare una chiamata da AddHealthChecks a AddResourceUtilizationHealthCheck. Nell'esempio seguente viene illustrato come usare il metodo di estensione AddResourceUtilizationHealthCheck
per aggiungere un controllo di integrità dell'utilizzo delle risorse a un'istanza di IServiceCollection
:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHealthChecks()
.AddResourceUtilizationHealthCheck();
var app = builder.Build();
var healthCheckService = app.Services.GetRequiredService<HealthCheckService>();
var result = await healthCheckService.CheckHealthAsync();
Console.WriteLine($"{result.Status} {result.TotalDuration}");
app.Run();
Il codice precedente:
- Crea una nuova istanza di HostApplicationBuilder.
- Aggiunge un controllo di integrità per l'utilizzo delle risorse concatenando una chiamata dalla chiamata AddHealthChecks al metodo di estensione AddResourceUtilizationHealthCheck.
- Compila l'istanza di IHost come variabile
app
. - Ottiene un'istanza della classe HealthCheckService dal provider di servizi.
- Esegue un controllo dell’integrità e visualizza il risultato.
- Esegue l'applicazione.
Controlli dell’integrità della durata dell'applicazione
Per eseguire controlli di integrità sugli eventi di durata dell'applicazione di IHostApplicationLifetime, usare il metodo di estensione AddApplicationLifecycleHealthCheck disponibile nel pacchetto NuGet Microsoft.Extensions.Diagnostics.HealthChecks.Common.
Questo provider indicherà che l'applicazione è integra solo quando è completamente attiva. Fino a quando l'oggetto lifetime non indica che l'applicazione è stata avviata, il provider segnalerà l'applicazione come non integra. Quando l’applicazione inizia ad arrestarsi, il provider indicherà l'applicazione come non integra.
La libreria espone un HealthCheckService consentendo ai consumer di richiedere un controllo integrità in qualsiasi momento. Si consideri l'implementazione seguente ExampleService
:
using System.Runtime.CompilerServices;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
internal class ExampleLifecycle(
HealthCheckService healthCheckService,
ILogger<ExampleLifecycle> logger) : IHostedLifecycleService
{
Task IHostedService.StartAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedService.StopAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
public Task ReadyAsync() => CheckHealthAsync();
private async Task CheckHealthAsync(
[CallerMemberName] string eventName = "",
CancellationToken cancellationToken = default)
{
HealthReport result =
await healthCheckService.CheckHealthAsync(cancellationToken);
logger.LogInformation(
"{EventName}: {Status}", eventName, result.Status);
}
}
Il codice precedente:
- Definisce una nuova classe
ExampleLifecycle
che implementa l'interfaccia IHostedService. - Definisce un costruttore primario che accetta i parametri seguenti:
- Istanza della classe HealthCheckService.
- Istanza della classe ILogger<TCategoryName>.
- Implementa l'interfaccia IHostedLifecycleService, con ogni metodo che richiama il metodo
CheckHealthAsync
. - Definisce un metodo
ReadyAsync
che richiama il metodoCheckHealthAsync
. - Definisce un metodo personalizzato
CheckHealthAsync
che acquisisce il nome del chiamante e il token di annullamento, quindi richiede un controllo di integrità dall'istanzaHealthCheckService
.result
viene quindi registrato.
L'unica volta che il servizio di controllo integrità segnala uno stato di HealthStatus.Healthy è dopo l'avvio dell'app e prima che venga chiamato l'arresto. Considerare i Program.cs seguenti:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
var healthChecksBuilder = builder.Services
.AddHostedService<ExampleLifecycle>()
.AddHealthChecks()
.AddApplicationLifecycleHealthCheck();
// You could use the healthChecksBuilder instance to add more checks...
var app = builder.Build();
var services = app.Services.GetRequiredService<IEnumerable<IHostedService>>();
await Task.WhenAll(DelayAndReportAsync(services), app.RunAsync());
static async Task DelayAndReportAsync(IEnumerable<IHostedService> services)
{
// Ensure app started...
await Task.Delay(500);
var service = services.FirstOrDefault(static s => s is ExampleLifecycle);
if (service is ExampleLifecycle example)
{
await example.ReadyAsync();
}
}
Il codice precedente:
- Crea una nuova istanza di HostApplicationBuilder assegnata come variabile
builder
. - Registra
ExampleService
come IHostedService solo dell'app. - Aggiunge un controllo di integrità per gli eventi di durata dell'applicazione di IHostApplicationLifetime concatenando una chiamata dall'istanza di IHealthChecksBuilder restituita dalla chiamata AddHealthChecks al metodo di estensione AddApplicationLifecycleHealthCheck.
- L'istanza
healthChecksBuilder
può essere usata per aggiungere altri controlli di integrità.
- L'istanza
- Compila l'istanza di IHost come variabile
app
. - Ottiene
IHostedService
dal provider di servizi, ovvero l'istanza diExampleService
. - Chiama Task.WhenAll dati due riferimenti all'attività:
- Il metodo
DelayAndReportAsync
, che ritarda per 500 millisecondi e quindi richiama il metodoReadyAsync
nell'istanza diExampleService
, valuterà il controllo integrità. - Il metodo RunAsync(IHost, CancellationToken) avvia
app
.
- Il metodo
L'app restituisce i log nell'ordine seguente, segnalando lo stato del controllo integrità in relazione agli eventi del ciclo di vita:
StartingAsync
: non integroStartAsync
: non integroStartedAsync
: non integroReadyAsync
: integroStoppingAsync
: non integroStopAsync
: non integroStoppedAsync
: non integro
In altre parole, questo provider garantisce che l'istanza dell'applicazione riceva traffico solo quando è pronta. Se si sviluppano app Web con ASP.NET Core, è disponibile il middleware per i controlli di integrità. Per altre informazioni, vedere Controlli di integrità in ASP.NET Core.