Gezondheidscontroles in .NET.NET Aspire
Gezondheidscontroles bieden informatie over beschikbaarheid en status van een app. Statuscontroles worden vaak weergegeven als HTTP-eindpunten, maar kunnen ook intern door de app worden gebruikt om logboeken te schrijven of andere taken uit te voeren op basis van de huidige status. Gezondheidschecks worden meestal gebruikt in combinatie met een externe bewakingsservice of containerorchestrator om de status van een app na te gaan. De gegevens die door statuscontroles worden gerapporteerd, kunnen worden gebruikt voor verschillende scenario's:
- Invloed hebben op beslissingen die zijn genomen door containerorchestrators, load balancers, API-gateways en andere beheerservices. Als de gezondheidscontrole voor een gecontaineriseerde app bijvoorbeeld mislukt, kan deze worden overgeslagen door een load balancer bij het routeren van verkeer.
- Controleer of onderliggende afhankelijkheden beschikbaar zijn, zoals een database of cache, en retourneer een geschikt statusbericht.
- Waarschuwingen of meldingen activeren wanneer een app niet reageert zoals verwacht.
.NET .NET Aspire eindpunten voor gezondheidscontrole
.NET
.NET Aspire maakt twee HTTP-eindpunten voor de standaardstatuscontrole beschikbaar in Development-omgevingen wanneer de methoden AddServiceDefaults
en MapDefaultEndpoints
worden aangeroepen vanuit het Program.cs-bestand:
Het
/health
-eindpunt geeft aan of de app normaal wordt uitgevoerd waar deze gereed is voor het ontvangen van aanvragen. Alle gezondheidscontroles moeten slagen voor de app als gereed wordt beschouwd om verkeer te accepteren na te zijn gestart.GET /health
Het
/health
-eindpunt geeft een HTTP-statuscode 200 en eentext/plain
-waarde van Healthy terug wanneer de app in orde is.De
/alive
geeft aan of een app wordt uitgevoerd of is vastgelopen en opnieuw moet worden gestart. Alleen statuscontroles met de tag live- moeten slagen om de app als levend te beschouwen.GET /alive
Het
/alive
-eindpunt retourneert een HTTP-statuscode 200 en eentext/plain
waarde van Healthy wanneer de app actief is.
De AddServiceDefaults
- en MapDefaultEndpoints
-methoden passen ook verschillende configuraties toe op uw app, behalve alleen statuscontroles, zoals OpenTelemetry en servicedetectie configuraties.
Niet-ontwikkelingomgevingen
In niet-ontwikkelomgevingen zijn de eindpunten /health
en /alive
standaard uitgeschakeld. Als u deze wilt inschakelen, wordt het aanbevolen om deze eindpunten te beveiligen met verschillende routeringsfuncties, zoals hostfilters en/of autorisatie. Voor meer informatie, zie Gezondheidscontroles in ASP.NET Core.
Daarnaast kan het handig zijn om time-outs van aanvragen en uitvoercaching voor deze eindpunten te configureren om misbruik of denial-of-service-aanvallen te voorkomen. Houd hiervoor rekening met de volgende gewijzigde 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;
}
De voorgaande code:
- Hiermee wordt een time-out van 5 seconden toegevoegd aan de statuscontroleaanvragen met een beleid met de naam
HealthChecks
. - Voegt een cache van 10 seconden toe aan de statuscontroleantwoorden met een beleid met de naam
HealthChecks
.
Overweeg nu de bijgewerkte 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;
}
De voorgaande code:
- Groepeert de gezondheidscontrole-eindpunten onder het pad
/
. - Slaat de uitvoer op en specificeert een aanvraagtijd met het bijbehorende
HealthChecks
-beleid.
Naast de bijgewerkte AddDefaultHealthChecks
- en MapDefaultEndpoints
-methoden, moet u ook de bijbehorende services toevoegen voor zowel aanvraag-time-outs als uitvoercaching.
Voeg in het juiste verbruikspunt van de app (meestal het Program.cs bestand) de volgende code toe:
// 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();
Zie time-outs-middleware aanvragen in ASP.NET Core en middleware voor uitvoercache in ASP.NET Corevoor meer informatie.
Gezondheidscontroles voor integratie
.NET
.NET Aspire integraties kunnen ook aanvullende statuscontroles voor uw app registreren. Deze gezondheidscontroles dragen bij aan de geretourneerde status van de /health
en /alive
endpoints. De integratie van .NET AspirePostgreSQL voegt bijvoorbeeld automatisch een statuscontrole toe om de volgende voorwaarden te controleren:
- Er kan een databaseverbinding tot stand worden gebracht
- Een databasequery kon succesvol worden uitgevoerd.
Als een van deze bewerkingen mislukt, mislukt de bijbehorende statuscontrole ook.
Gezondheidscontroles configureren
U kunt statuscontroles voor een bepaalde integratie uitschakelen met behulp van een van de beschikbare configuratieopties. .NET .NET Aspire integraties ondersteunen Microsoft.Extensions.Configurations om instellingen toe te passen met configuratiebestanden zoals appsettings.json:
{
"Aspire": {
"Npgsql": {
"DisableHealthChecks": true,
}
}
}
U kunt ook een inline gedelegeerde gebruiken om statuscontroles te configureren:
builder.AddNpgsqlDbContext<MyDbContext>(
"postgresdb",
static settings => settings.DisableHealthChecks = true);