.NET-App-Integritätsprüfungen in C#
In einem verteilten System sind Integritätsprüfungen regelmäßige Bewertungen des Status, der Verfügbarkeit und der Leistung einzelner Knoten oder Dienste. Mit diesen Prüfungen wird sichergestellt, dass das System ordnungsgemäß und effizient funktioniert. Integritätsprüfungen sind für die Systemzuverlässigkeit unerlässlich und werden in der Regel in regelmäßigen Abständen durchgeführt, wobei die Ergebnisse für die Entscheidungsfindung und Korrekturmaßnahmen analysiert werden.
Mögliche Statusergebnisse einer Integritätsüberprüfung sind:
Zudem werden im Rahmen von Integritätsprüfungen häufig verschiedene Diagnosemetriken gemeldet. Weitere Informationen finden Sie unter Diagnosemetriken: Microsoft.Extensions.Diagnostics.HealthChecks
.
Integritätsprüfungen der Ressourcenauslastung
Fügen Sie einen Paketverweis auf Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization hinzu, um Integritätsprüfungen der Ressourcenauslastung Ihrer .NET-Apps durchzuführen. Verketten Sie in einer IServiceCollection-Instanz einen Aufruf von AddHealthChecks mit AddResourceUtilizationHealthCheck. Im folgenden Beispiel wird veranschaulicht, wie Sie mithilfe der Erweiterungsmethode AddResourceUtilizationHealthCheck
eine Integritätsprüfung der Ressourcenauslastung einer IServiceCollection
-Instanz hinzufügen:
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();
Der vorangehende Code:
- Erstellt eine neue HostApplicationBuilder-Instanz.
- Fügt eine Integritätsprüfung für die Ressourcenauslastung hinzu, indem ein Aufruf vom AddHealthChecks-Aufruf mit der Erweiterungsmethode AddResourceUtilizationHealthCheck verkettet wird.
- Erstellt die IHost-Instanz als
app
-Variable. - Ruft eine Instanz der HealthCheckService-Klasse vom Dienstanbieter ab.
- Führt eine Integritätsprüfung durch und zeigt das Ergebnis an.
- Führt die Anwendung aus.
Integritätsprüfungen über die Anwendungslebensdauer
Um Integritätsprüfungen für die Anwendungslebensdauerereignisse von IHostApplicationLifetime durchzuführen, verwenden Sie die ErweiterungsmethodeAddApplicationLifecycleHealthCheck, die im NuGet-Paket Microsoft.Extensions.Diagnostics.HealthChecks.Common verfügbar ist.
Dieser Anbieter gibt an, dass die Anwendung nur dann fehlerfrei ist, wenn sie vollständig aktiv ist. Der Anbieter meldet die Anwendung erst dann als fehlerfrei, nachdem das Lebensdauerobjekt angegeben hat, dass die Anwendung gestartet wurde. Wenn die Anwendung heruntergefahren wird, meldet der Anbieter die Anwendung als fehlerhaft.
Die Bibliothek macht HealthCheckService verfügbar, sodass Consumer jederzeit eine Integritätsprüfung anfordern können. Betrachten Sie die folgende Implementierung von 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);
}
}
Der vorangehende Code:
- Definiert eine neue
ExampleLifecycle
-Klasse, die die IHostedService-Schnittstelle implementiert. - Definiert einen primären Konstruktor, der die folgenden Parameter akzeptiert:
- Eine Instanz der HealthCheckService-Klasse.
- Eine Instanz der ILogger<TCategoryName>-Klasse.
- Implementiert die IHostedLifecycleService-Schnittstelle, wobei jede Methode die
CheckHealthAsync
-Methode aufruft. - Definiert eine
ReadyAsync
-Methode, die dieCheckHealthAsync
-Methode aufruft. - Definiert eine benutzerdefinierte
CheckHealthAsync
-Methode, die den Namen und das Abbruchtoken des Aufrufers erfasst, und fordert dann eine Integritätsprüfung von derHealthCheckService
-Instanz an.result
wird dann protokolliert.
Der Integritätsprüfungsdienst meldet den Status HealthStatus.Healthy nur in dem Zeitraum nach dem Starten der Anwendung und vor dem Beenden der Anwendung. Betrachten Sie die folgende Datei Program.cs:
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();
}
}
Der vorangehende Code:
- Erstellt eine neue HostApplicationBuilder-Instanz, die als
builder
-Variable zugewiesen wird. - Registriert
ExampleService
als einzige IHostedService der App. - Fügt eine Integritätsprüfung für die Anwendungslebensdauerereignisse von IHostApplicationLifetime hinzu, indem ein Aufruf von der IHealthChecksBuilder-Instanz, die vom AddHealthChecks-Aufruf zurückgegeben wird, mit der AddApplicationLifecycleHealthCheck-Erweiterungsmethode verkettet wird.
- Die
healthChecksBuilder
-Instanz kann zum Hinzuzufügen weiterer Integritätsprüfungen verwendet werden.
- Die
- Erstellt die IHost-Instanz als
app
-Variable. - Ruft einen
IHostedService
vom Dienstanbieter ab, dies ist dieExampleService
-Instanz. - Ruft Task.WhenAll mit zwei Aufgabenverweisen auf:
- Die
DelayAndReportAsync
-Methode, die eine Verzögerung von 500 Millisekunden bewirkt und dann dieReadyAsync
-Methode für dieExampleService
-Instanz aufruft, wertet die Integritätsprüfung aus. - Die RunAsync(IHost, CancellationToken)-Methode startet
app
.
- Die
Die App gibt Protokolle in der folgenden Reihenfolge aus, und meldet den Status der Integritätsprüfung in Bezug auf die Lebenszyklusereignisse:
StartingAsync
: FehlerhaftStartAsync
: FehlerhaftStartedAsync
: FehlerhaftReadyAsync
: FehlerfreiStoppingAsync
: FehlerhaftStopAsync
: FehlerhaftStoppedAsync
: Fehlerhaft
Mit anderen Worten: Dieser Anbieter stellt sicher, dass die Anwendungsinstanz nur Datenverkehr empfängt, wenn sie bereit ist. Wenn Sie Web-Apps mit ASP.NET Core entwickeln, steht Middleware für Integritätsprüfungen zur Verfügung. Weitere Informationen finden Sie unter Integritätsprüfungen in ASP.NET Core.