Freigeben über


.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:

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:
  • Implementiert die IHostedLifecycleService-Schnittstelle, wobei jede Methode die CheckHealthAsync-Methode aufruft.
  • Definiert eine ReadyAsync-Methode, die die CheckHealthAsync-Methode aufruft.
  • Definiert eine benutzerdefinierte CheckHealthAsync-Methode, die den Namen und das Abbruchtoken des Aufrufers erfasst, und fordert dann eine Integritätsprüfung von der HealthCheckService-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.
  • Erstellt die IHost-Instanz als app-Variable.
  • Ruft einen IHostedService vom Dienstanbieter ab, dies ist die ExampleService-Instanz.
  • Ruft Task.WhenAll mit zwei Aufgabenverweisen auf:
    • Die DelayAndReportAsync-Methode, die eine Verzögerung von 500 Millisekunden bewirkt und dann die ReadyAsync-Methode für die ExampleService-Instanz aufruft, wertet die Integritätsprüfung aus.
    • Die RunAsync(IHost, CancellationToken)-Methode startet app.

Die App gibt Protokolle in der folgenden Reihenfolge aus, und meldet den Status der Integritätsprüfung in Bezug auf die Lebenszyklusereignisse:

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

Siehe auch