Sdílet prostřednictvím


Kontroly stavu v .NET.NET Aspire

Kontroly stavu poskytují informace o dostupnosti a stavu aplikace. Kontroly stavu se často zveřejňují jako koncové body HTTP, ale aplikace je může interně používat k zápisu protokolů nebo provádění jiných úloh na základě aktuálního stavu. Kontroly stavu se obvykle používají v kombinaci s externí službou monitorování nebo orchestrátorem kontejnerů ke kontrole stavu aplikace. Data hlášená kontrolami stavu se dají použít v různých scénářích:

  • Vliv na rozhodnutí provedená orchestrátory kontejnerů, nástroje pro vyrovnávání zatížení, brány rozhraní API a další služby pro správu. Pokud například kontrola stavu kontejnerizované aplikace selže, může být tato aplikace přeskočena nástrojem pro vyrovnávání zatížení při směrování provozu.
  • Ověřte, že jsou dostupné podkladové závislosti, jako je databáze nebo mezipaměť, a vraťte odpovídající stavovou zprávu.
  • Aktivujte upozornění nebo oznámení, když aplikace nereaguje podle očekávání.

koncové body kontroly stavu .NET.NET Aspire

.NET .NET Aspire zviditelňuje v prostředích Development dva výchozí koncové body kontroly stavu, když jsou z Program.cs souboru volány metody AddServiceDefaults a MapDefaultEndpoints:

  • Koncový bod /health označuje, jestli aplikace běží normálně, kde je připravená přijímat žádosti. Všechny kontroly stavu musí projít, aby aplikace byla po spuštění považována za připravenou přijmout provoz.

    GET /health
    

    Koncový bod /health vrátí stavový kód HTTP 200 a text/plain hodnotu Healthy, když je aplikace v pořádku.

  • /alive indikuje, jestli je aplikace spuštěná nebo se chybově ukončila a je potřeba ji restartovat. Pouze kontroly stavu označené značkou live musí projít, aby aplikace byla považována za aktivní.

    GET /alive
    

    Koncový bod /alive vrátí stavový kód HTTP 200 a hodnotu text/plainHealthy, když aplikace funguje.

Metody AddServiceDefaults a MapDefaultEndpoints také na vaši aplikaci používají různé konfigurace nad rámec jen kontrol stavu, jako jsou konfigurace OpenTelemetry a zjišťování služby .

Nevojová prostředí

V prostředích, která nejsou vývojová, jsou ve výchozím nastavení koncové body /health a /alive zakázané. Pokud je potřebujete povolit, doporučuje se tyto koncové body chránit různými funkcemi směrování, jako je filtrování hostitelů nebo autorizace. Další informace naleznete v tématu Kontroly stavu v ASP.NET Core.

Kromě toho může být výhodné nakonfigurovat vypršení časového limitu požadavků a ukládání výstupu do mezipaměti pro tyto koncové body, aby se zabránilo zneužití nebo útokům na dostupnost služby. Pokud to chcete udělat, zvažte následující upravenou metodu AddDefaultHealthChecks:

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

Předchozí kód:

  • Přidá časový limit 5 sekund do žádostí o kontrolu stavu pomocí zásady s názvem HealthChecks.
  • Přidá 10sekundovou mezipaměť do odpovědí kontroly stavu pomocí zásady s názvem HealthChecks.

Teď zvažte aktualizovanou metodu MapDefaultEndpoints:

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

Předchozí kód:

  • Seskupí koncové body kontroly stavu do cesty /.
  • Ukládá výstup do mezipaměti a nastavuje čas požadavku s příslušnou zásadou HealthChecks.

Kromě aktualizovaných AddDefaultHealthChecks a MapDefaultEndpoints metod musíte také přidat odpovídající služby pro vypršení časového limitu požadavků i ukládání výstupu do mezipaměti.

Do vstupního bodu příslušné spotřební aplikace (obvykle soubor Program.cs) přidejte následující kód:

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

Další informace najdete v tématu Middleware časových limitů pro požadavky v ASP.NET Core a Middleware pro ukládání výstupu do mezipaměti v ASP.NET Core.

Kontroly stavu integrace

.NET .NET Aspire integrace mohou také zaregistrovat další kontroly stavu pro vaši aplikaci. Tyto kontroly stavu přispívají k vrácenému stavu koncových bodů /health a /alive. Integrace .NET AspirePostgreSQL například automaticky přidá kontrolu stavu, která ověří následující podmínky:

  • Bylo možné navázat připojení k databázi.
  • Databázový dotaz je možné úspěšně spustit.

Pokud některý z těchto operací selže, odpovídající kontrola stavu také selže.

Konfigurace zdravotních kontrol

Kontroly stavu pro danou integraci můžete zakázat pomocí jedné z dostupných možností konfigurace. Integrace .NET.NET Aspire umožňují použití nastavení prostřednictvím konfiguračních souborů, jako je appsettings.json: Microsoft.Extensions.Configurations.

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

Ke konfiguraci kontrol stavu můžete použít také vložený delegát:

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

Viz také