Freigeben über


Gesundheitsprüfungen in .NET.NET Aspire

Gesundheitsprüfungen stellen Informationen zur Verfügbarkeit und zum Zustand einer App bereit. Gesundheitsprüfungen werden häufig als HTTP-Endpunkte verfügbar gemacht, können aber auch intern von der App verwendet werden, um Protokolle zu schreiben oder andere Aufgaben basierend auf der aktuellen Gesundheit auszuführen. Gesundheitsüberprüfungen werden typischerweise in Kombination mit einem externen Überwachungsdienst oder Container-Orchestrator verwendet, um den Status einer App zu überprüfen. Die von Gesundheitsprüfungen gemeldeten Daten können für verschiedene Szenarien verwendet werden:

  • Beeinflussen Sie die von Container-Orchestratoren, Lastverteilern, API-Gateways und anderen Verwaltungsdiensten getroffenen Entscheidungen. Wenn beispielsweise die Integritätsprüfung für eine containerisierte App fehlschlägt, kann sie vom Routing des Load-Balancers, der den Datenverkehr verteilt, übersprungen werden.
  • Stellen Sie sicher, dass zugrunde liegende Abhängigkeiten verfügbar sind, z. B. eine Datenbank oder einen Cache, und geben Sie eine entsprechende Statusmeldung zurück.
  • Lösen Sie Warnungen oder Benachrichtigungen aus, wenn eine App nicht erwartungsgemäß reagiert.

.NET .NET Aspire Gesundheitsprüfungsendpunkte

.NET .NET Aspire macht zwei HTTP-Endpunkte für die Standard-Gesundheitsprüfung in Development Umgebungen verfügbar, wenn die Methoden AddServiceDefaults und MapDefaultEndpoints aus der Datei Program.cs aufgerufen werden.

  • Der /health Endpunkt gibt an, ob die App normal ausgeführt wird und bereit ist, Anfragen zu empfangen. Alle Gesundheitsprüfungen müssen erfolgreich sein, damit die App nach dem Start als bereit zur Aufnahme von Datenverkehr betrachtet wird.

    GET /health
    

    Der /health-Endpunkt gibt einen HTTP-Statuscode 200 und einen text/plain Wert von Healthy zurück, wenn die App fehlerfreiist.

  • Die /alive gibt an, ob eine App läuft oder abgestürzt ist, sodass sie neu gestartet werden muss. Nur Gesundheitschecks, die mit dem Live--Tag gekennzeichnet sind, müssen bestanden werden, damit die App als aktiv betrachtet wird.

    GET /alive
    

    Der /alive-Endpunkt gibt einen HTTP-Statuscode 200 und einen text/plain-Wert von Healthy zurück, wenn die App in Betriebist.

Die Methoden AddServiceDefaults und MapDefaultEndpoints wenden neben Integritätsprüfungen auch verschiedene Konfigurationen auf Ihre App an, wie zum Beispiel OpenTelemetry- und -Konfigurationen für die Dienstermittlung.

Nicht-Entwicklungsumgebungen

In Nicht-Entwicklungsumgebungen sind die /health und /alive Endpunkte standardmäßig deaktiviert. Wenn Sie sie aktivieren müssen, wird empfohlen, diese Endpunkte mit verschiedenen Routing-Funktionen, wie Hostfilterung und/oder Autorisierung, zu schützen. Weitere Informationen finden Sie unter Gesundheitsprüfungen in ASP.NET Core.

Darüber hinaus kann es vorteilhaft sein, Anforderungstimeouts und Ausgabezwischenspeicherung für diese Endpunkte zu konfigurieren, um Missbrauch oder Denial-of-Service-Angriffe zu verhindern. Berücksichtigen Sie dazu die folgende geänderte AddDefaultHealthChecks Methode:

public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder)
{
    builder.Services.AddRequestTimeouts(
        configure: static timeouts =>
            timeouts.AddPolicy("HealthChecks", TimeSpan.FromSeconds(5)));

    builder.Services.AddOutputCache(
        configureOptions: static caching =>
            caching.AddPolicy("HealthChecks",
            build: static policy => policy.Expire(TimeSpan.FromSeconds(10))));

    builder.Services.AddHealthChecks()
        // Add a default liveness check to ensure app is responsive
        .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);

    return builder;
}

Der vorhergehende Code:

  • Fügt eine Timeout von 5 Sekunden zu den Integritätsprüfungsanforderungen mit einer Richtlinie mit dem Namen HealthCheckshinzu.
  • Fügt den Antworten der Integritätsprüfung einen 10-Sekunden-Cache mit einer Richtlinie namens HealthCheckshinzu.

Betrachten Sie nun die aktualisierte MapDefaultEndpoints-Methode:

public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
    var healthChecks = app.MapGroup("");

    healthChecks
        .CacheOutput("HealthChecks")
        .WithRequestTimeout("HealthChecks");

    // All health checks must pass for app to be
    // considered ready to accept traffic after starting
    healthChecks.MapHealthChecks("/health");

    // Only health checks tagged with the "live" tag
    // must pass for app to be considered alive
    healthChecks.MapHealthChecks("/alive", new()
    {
        Predicate = static r => r.Tags.Contains("live")
    });

    return app;
}

Der vorherige Code:

  • Gruppiert die Gesundheitsprüfungsendpunkte unter dem Pfad /.
  • Speichert die Ausgabe im Cache und gibt eine Anforderungszeit gemäß der entsprechenden HealthChecks-Richtlinie an.

Zusätzlich zu den aktualisierten Methoden AddDefaultHealthChecks und MapDefaultEndpoints müssen Sie auch die entsprechenden Dienste für Anfrage-Timeouts und das Zwischenspeichern von Ausgaben hinzufügen.

Fügen Sie im Einstiegspunkt der entsprechenden nutzenden App (in der Regel die Datei Program.cs) den folgenden Code hinzu:

// Wherever your services are being registered.
// Before the call to Build().
builder.Services.AddRequestTimeouts();
builder.Services.AddOutputCache();

var app = builder.Build();

// Wherever your app has been built, before the call to Run().
app.UseRequestTimeouts();
app.UseOutputCache();

app.Run();

Weitere Informationen finden Sie unter Zeitüberschreitungsanforderungen-Middleware in ASP.NET Core und Ausgabe-Cache-Middleware in ASP.NET Core.

Integrationsgesundheitschecks

.NET .NET Aspire Integrationen können auch zusätzliche Integritätsprüfungen für Ihre App registrieren. Diese Gesundheitsprüfungen tragen zum zurückgegebenen Status der /health- und /alive-Endpunkte bei. Beispielsweise fügt die .NET AspirePostgreSQL-Integration automatisch eine Gesundheitsprüfung hinzu, um die folgenden Bedingungen zu überprüfen:

  • Es kann eine Datenbankverbindung hergestellt werden.
  • Eine Datenbankabfrage konnte erfolgreich ausgeführt werden.

Wenn eine dieser Vorgänge fehlschlägt, schlägt auch die entsprechende Integritätsprüfung fehl.

Konfigurieren Sie Integritätsprüfungen

Sie können Gesundheitsprüfungen für eine bestimmte Integration mithilfe einer der verfügbaren Konfigurationsoptionen deaktivieren. .NET .NET Aspire Integrationen unterstützen Microsoft.Extensions.Configurations, um Einstellungen über Konfigurationsdateien wie appsettings.jsonanzuwenden:

{
  "Aspire": {
    "Npgsql": {
      "DisableHealthChecks": true,
    }
  }
}

Sie können auch einen Inline-Delegaten verwenden, um Integritätsprüfungen zu konfigurieren.

builder.AddNpgsqlDbContext<MyDbContext>(
    "postgresdb",
    static settings => settings.DisableHealthChecks  = true);

Siehe auch