Partager via


Vérifications de l’intégrité des applications .NET en C#

Dans un système distribué, les vérifications d’intégrité sont des évaluations périodiques de l’état, de la disponibilité et des performances de nœuds ou de services individuels. Ces vérifications permettent de garantir le fonctionnement correct et efficace du système. Les vérifications d’intégrité sont essentielles à la fiabilité du système. Elles sont généralement effectuées à intervalles réguliers, et les résultats sont analysés dans le cadre de la prise de décision et d’actions correctives.

Voici les résultats possibles concernant l’état des vérifications d’intégrité :

En outre, les vérifications d’intégrité signalent souvent différentes métriques de diagnostic. Pour plus d’informations, consultez Métriques de diagnostic : Microsoft.Extensions.Diagnostics.HealthChecks.

Vérifications d’intégrité de l’utilisation des ressources

Pour effectuer des vérifications d’intégrité de l’utilisation des ressources de vos applications .NET, ajoutez une référence de package à Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. Dans une instance de IServiceCollection, chaînez un appel de AddHealthChecks à AddResourceUtilizationHealthCheck. L’exemple suivant montre comment utiliser la méthode d’extension AddResourceUtilizationHealthCheck pour ajouter une vérification d’intégrité de l’utilisation des ressources à une instance de 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();

Le code précédent :

  • Crée une instance HostApplicationBuilder.
  • Ajoute une vérification d’intégrité pour l’utilisation des ressources en chaînant un appel de l’appel de AddHealthChecks à la méthode d’extension AddResourceUtilizationHealthCheck.
  • Crée l’instance de IHost en tant que variable app.
  • Obtient une instance de la classe HealthCheckService auprès du fournisseur de services.
  • Effectue une vérification d’intégrité et affiche le résultat.
  • Exécute l'application.

Vérifications d’intégrité de la durée de vie des applications

Pour effectuer des vérifications d’intégrité concernant les événements de durée de vie des applications de IHostApplicationLifetime, utilisez la méthode d’extension AddApplicationLifecycleHealthCheck disponible dans le package NuGet Microsoft.Extensions.Diagnostics.HealthChecks.Common.

Ce fournisseur indique que l’application est saine uniquement quand elle est complètement active. Tant que l’objet de durée de vie n’indique pas que l’application a démarré, le fournisseur signale l’application comme étant non saine. Quand l’application commence à s’arrêter, le fournisseur la signale comme étant non saine.

La bibliothèque expose un HealthCheckService qui permet aux consommateurs de demander une vérification d’intégrité à tout moment. Examinez l’implémentation suivante 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);
    }
}

Le code précédent :

  • Définit une nouvelle classe ExampleLifecycle qui implémente l’interface IHostedService.
  • Définit un constructeur principal qui accepte les paramètres suivants :
  • Implémente l’interface IHostedLifecycleService, chaque méthode appelant la méthode CheckHealthAsync.
  • Définit une méthode ReadyAsync qui appelle la méthode CheckHealthAsync.
  • Définit une méthode CheckHealthAsync personnalisée qui capture le nom de l’appelant et le jeton d’annulation, puis demande une vérification d’intégrité à l’instance de HealthCheckService. result est ensuite journalisé.

Le seul moment où le service de vérification d’intégrité signale l’état de HealthStatus.Healthy se situe après le démarrage de l’application et avant l’appel de l’arrêt. Prenez l’exemple du fichier Program.cs suivant :

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

Le code précédent :

  • Crée une instance de HostApplicationBuilder en tant que variable builder.
  • Inscrit ExampleService en tant que seul IHostedService de l’application.
  • Ajoute une vérification d’intégrité pour les événements de durée de vie des applications de IHostApplicationLifetime en chaînant un appel provenant de l’instance de IHealthChecksBuilder retournée par l’appel de AddHealthChecks à la méthode d’extension AddApplicationLifecycleHealthCheck.
    • L’instance de healthChecksBuilder peut être utilisée pour ajouter d’autres vérifications d’intégrité.
  • Crée l’instance de IHost en tant que variable app.
  • Obtient un IHostedService auprès du fournisseur de services, il s’agit de l’instance de ExampleService.
  • Appelle Task.WhenAll en fonction de deux références de tâche :
    • La méthode DelayAndReportAsync, qui attend 500 millisecondes, puis appelle la méthode ReadyAsync sur l’instance de ExampleService, évalue la vérification d’intégrité.
    • La méthode RunAsync(IHost, CancellationToken) démarre le app.

L’application sort les journaux dans l’ordre suivant, en signalant l’état de la vérification d’intégrité en ce qui concerne les événements de cycle de vie :

  1. StartingAsync : non sain
  2. StartAsync : non sain
  3. StartedAsync : non sain
  4. ReadyAsync : sain
  5. StoppingAsync : non sain
  6. StopAsync : non sain
  7. StoppedAsync : non sain

En d’autres termes, ce fournisseur vérifie que l’instance d’application reçoit uniquement du trafic quand elle est prête. Si vous développez des applications web avec ASP.NET Core, il existe des intergiciels de vérification d’intégrité. Pour plus d’informations, consultez Vérifications d’intégrité dans ASP.NET Core.

Voir aussi