Condividi tramite


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:

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:
  • Implementa l'interfaccia IHostedLifecycleService, con ogni metodo che richiama il metodo CheckHealthAsync.
  • Definisce un metodo ReadyAsync che richiama il metodo CheckHealthAsync.
  • Definisce un metodo personalizzato CheckHealthAsync che acquisisce il nome del chiamante e il token di annullamento, quindi richiede un controllo di integrità dall'istanza HealthCheckService. 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à.
  • Compila l'istanza di IHost come variabile app.
  • Ottiene IHostedService dal provider di servizi, ovvero l'istanza di ExampleService.
  • Chiama Task.WhenAll dati due riferimenti all'attività:
    • Il metodo DelayAndReportAsync, che ritarda per 500 millisecondi e quindi richiama il metodo ReadyAsync nell'istanza di ExampleService, valuterà il controllo integrità.
    • Il metodo RunAsync(IHost, CancellationToken) avvia app.

L'app restituisce i log nell'ordine seguente, segnalando lo stato del controllo integrità in relazione agli eventi del ciclo di vita:

  1. StartingAsync: non integro
  2. StartAsync: non integro
  3. StartedAsync: non integro
  4. ReadyAsync: integro
  5. StoppingAsync: non integro
  6. StopAsync: non integro
  7. StoppedAsync: 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.

Vedi anche