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 :
- Instance de la classe HealthCheckService.
- Instance de la classe ILogger<TCategoryName>.
- Implémente l’interface IHostedLifecycleService, chaque méthode appelant la méthode
CheckHealthAsync
. - Définit une méthode
ReadyAsync
qui appelle la méthodeCheckHealthAsync
. - 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 deHealthCheckService
.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é.
- L’instance de
- 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 deExampleService
. - 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éthodeReadyAsync
sur l’instance deExampleService
, évalue la vérification d’intégrité. - La méthode RunAsync(IHost, CancellationToken) démarre le
app
.
- La méthode
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 :
StartingAsync
: non sainStartAsync
: non sainStartedAsync
: non sainReadyAsync
: sainStoppingAsync
: non sainStopAsync
: non sainStoppedAsync
: 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.