Controlos de saúde em .NET.NET Aspire
As verificações de saúde fornecem informações de disponibilidade e estado sobre uma aplicação. As verificações de integridade geralmente são expostas como endpoints HTTP, mas também podem ser usadas internamente pela aplicação para gravar logs ou executar outras tarefas com base na integridade atual. As verificações de integridade geralmente são usadas em combinação com um serviço de monitorização externo ou orquestrador de contentores para verificar o estado de uma aplicação. Os dados relatados pelas verificações de integridade podem ser usados para vários cenários:
- Influencie decisões tomadas por orquestradores de contêineres, balanceadores de carga, gateways de API e outros serviços de gerenciamento. Por exemplo, se a verificação de integridade de uma aplicação em contêiner falhar, ela poderá ser ignorada pelo balanceador de carga ao rotear o tráfego.
- Verifique se as dependências subjacentes estão disponíveis, como um banco de dados ou cache, e retorne uma mensagem de status apropriada.
- Dispare alertas ou notificações quando um aplicativo não estiver respondendo conforme o esperado.
.NET .NET Aspire pontos finais de verificação de integridade
O ponto de extremidade
/health
indica se a aplicação está sendo executada normalmente e está pronta para receber solicitações. Todas as verificações de integridade devem passar para que o aplicativo seja considerado pronto para aceitar tráfego após o início.GET /health
O ponto de extremidade
/health
retorna um código de status HTTP 200 e um valortext/plain
de Healthy quando a aplicação está funcional.O
/alive
indica se um aplicativo está em execução ou falhou e deve ser reiniciado. Apenas as verificações de integridade marcadas com a tag live devem passar para que o aplicativo seja considerado vivo.GET /alive
O ponto de extremidade
/alive
retorna um código de status HTTP 200 e um valortext/plain
de Healthy quando o aplicativo está ativo.
Os métodos AddServiceDefaults
e MapDefaultEndpoints
também aplicam várias configurações ao seu aplicativo, além das verificações de integridade, tais como as configurações de descoberta de serviços OpenTelemetry e .
Ambientes que não são de desenvolvimento
Em ambientes não desenvolvimentais, os endpoints /health
e /alive
estão desativados por padrão. Se você precisar habilitá-los, é recomendado proteger esses pontos de extremidade com vários recursos de roteamento, como filtragem de host e/ou autorização. Para obter mais informações, consulte verificações de integridade no ASP.NET Core.
Além disso, pode ser vantajoso configurar tempos de espera para pedidos e cache de saída para esses endpoints para evitar abusos ou ataques de negação de serviço. Para fazer isso, considere o seguinte método AddDefaultHealthChecks
modificado:
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;
}
O código anterior:
- Adiciona um tempo limite de 5 segundos às solicitações de verificação de integridade com uma política chamada
HealthChecks
. - Adiciona um cache de 10 segundos às respostas da verificação de saúde com uma política chamada
HealthChecks
.
Agora considere o método MapDefaultEndpoints
atualizado:
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;
}
O código anterior:
- Agrupa os endpoints de verificação de integridade no caminho
/
. - Armazena em cache a saída e especifica um tempo de solicitação com a política de
HealthChecks
correspondente.
Além dos métodos AddDefaultHealthChecks
e MapDefaultEndpoints
atualizados, você também deve adicionar os serviços correspondentes para tempos limite de solicitação e cache de saída.
No ponto de entrada do aplicativo de consumo apropriado (geralmente o arquivo Program.cs), adicione o seguinte código:
// 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();
Para obter mais informações, consulte middleware Request timeouts in ASP.NET Core e Output caching middleware in ASP.NET Core.
Verificações de saúde da integração
.NET
.NET Aspire integrações também podem registrar verificações de integridade adicionais para seu aplicativo. Essas verificações de saúde contribuem para o status retornado dos pontos de extremidade /health
e /alive
. Por exemplo, a integração .NET AspirePostgreSQL adiciona automaticamente uma verificação de integridade para verificar as seguintes condições:
- Uma conexão de banco de dados pode ser estabelecida
- Uma consulta de banco de dados pode ser executada com êxito
Se qualquer uma dessas operações falhar, a verificação de integridade correspondente também falhará.
Configurar verificações de integridade
Você pode desabilitar as verificações de integridade para uma determinada integração usando uma das opções de configuração disponíveis. .NET .NET Aspire integrações suportam Microsoft.Extensions.Configurations para aplicar configurações através de ficheiros de configuração, como appsettings.json:
{
"Aspire": {
"Npgsql": {
"DisableHealthChecks": true,
}
}
}
Você também pode usar um delegado embutido para configurar verificações de integridade:
builder.AddNpgsqlDbContext<MyDbContext>(
"postgresdb",
static settings => settings.DisableHealthChecks = true);