Dela via


Hälsokontroller i .NET.NET Aspire

Hälsokontroller ger tillgänglighet och tillståndsinformation om en app. Hälsokontroller exponeras ofta som HTTP-slutpunkter, men kan också användas internt av appen för att skriva loggar eller utföra andra uppgifter baserat på den aktuella hälsan. Hälsokontroller används vanligtvis i kombination med en extern övervakningstjänst eller en containerorkestreringsverktyg för att kontrollera en applikations status. Data som rapporteras av hälsokontroller kan användas för olika scenarier:

  • Påverka beslut som fattas av containerorkestrerare, lastbalanserare, API-gatewayer och andra hanteringstjänster. Om till exempel hälsokontrollen för en containerbaserad app misslyckas kan den hoppas över av en lastbalanserares routning av trafik.
  • Kontrollera att underliggande beroenden är tillgängliga, till exempel en databas eller cache, och returnera ett lämpligt statusmeddelande.
  • Utlös aviseringar eller meddelanden när en app inte svarar som förväntat.

.NET .NET Aspire slutpunkter för hälsokontroll

.NET .NET Aspire exponerar två HTTP-standardslutpunkter för hälsokontroll i Development-miljöer när metoderna AddServiceDefaults och MapDefaultEndpoints anropas från filen Program.cs:

  • Den /health slutpunkten anger om appen körs normalt där den är redo att ta emot begäranden. Alla hälsokontroller måste godkännas för att appen ska anses vara redo att acceptera trafik när den har startats.

    GET /health
    

    /health-målpunkten returnerar HTTP-statuskoden 200 och ett text/plain-värde på Healthy när appen är frisk.

  • /alive anger om en app körs eller har kraschat och måste startas om. Endast hälsokontroller som har taggats med taggen live måste skickas för att appen ska betraktas som levande.

    GET /alive
    

    /alive-slutpunkten returnerar http-statuskoden 200 och ett text/plain värde för Healthy när appen levande.

Metoderna AddServiceDefaults och MapDefaultEndpoints använder också olika konfigurationer för din app utöver hälsokontroller, till exempel OpenTelemetry och tjänstidentifiering konfigurationer.

Miljöer som inte är utvecklingsmiljöer

I icke-utvecklingsmiljöer inaktiveras slutpunkterna /health och /alive som standard. Om du behöver aktivera dem rekommenderar vi att du skyddar dessa slutpunkter med olika routningsfunktioner, till exempel värdfiltrering och/eller auktorisering. Mer information finns i Hälsokontroller i ASP.NET Core.

Dessutom kan det vara fördelaktigt att konfigurera tidsgränser för begäran och cachelagring av utdata för dessa slutpunkter för att förhindra missbruk eller överbelastningsattacker. Om du vill göra det bör du överväga följande ändrade AddDefaultHealthChecks metod:

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

Föregående kod:

  • Lägger till en timeout på 5 sekunder till hälsokontrollbegäranden med en princip med namnet HealthChecks.
  • Lägger till en 10-sekunders cache i hälsokontrollsvaren med en princip med namnet HealthChecks.

Överväg nu den uppdaterade metoden 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;
}

Föregående kod:

  • Grupperar slutpunkterna för hälsokontroll under sökvägen /.
  • Cachelagrar utdata och anger en begärandetid med motsvarande HealthChecks princip.

Förutom de uppdaterade metoderna AddDefaultHealthChecks och MapDefaultEndpoints måste du även lägga till motsvarande tjänster för både tidsgränser för begäran och cachelagring av utdata.

Lägg till följande kod i den lämpliga användningsappens startpunkt (vanligtvis den Program.cs filen):

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

Mer information finns i Request timeouts middleware in ASP.NET Core and Output caching middleware in ASP.NET Core.

Hälsokontroller för integrering

.NET .NET Aspire integreringar kan också registrera ytterligare hälsokontroller för din app. Dessa hälsokontroller bidrar till den returnerade statusen för ändpunkterna /health och /alive. Till exempel lägger .NET AspirePostgreSQL-integreringen automatiskt till en hälsokontroll för att verifiera följande villkor:

  • En databasanslutning kan upprättas
  • En databasfråga kunde köras framgångsrikt

Om någon av dessa åtgärder misslyckas misslyckas även motsvarande hälsokontroll.

Konfigurera hälsokontroller

Du kan inaktivera hälsokontroller för en viss integrering med något av de tillgängliga konfigurationsalternativen. .NET .NET Aspire-integrationer stöder Microsoft.Extensions.Configurations för att tillämpa inställningar via konfigurationsfiler såsom appsettings.json:

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

Du kan också använda en inline-delegering för att konfigurera hälsoövervakning.

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

Se även