Verificações de integridade do aplicativo .NET em C#
Em um sistema distribuído, as verificações de integridade são avaliações periódicas do status, disponibilidade e desempenho de nós ou serviços individuais. Estas verificações garantem que o sistema funciona correta e eficientemente. As verificações de integridade são essenciais para a confiabilidade do sistema e normalmente são realizadas em intervalos regulares com os resultados analisados para a tomada de decisões e ações corretivas.
São possíveis os seguintes resultados do estado de verificação de saúde:
Além disso, as verificações de integridade geralmente relatam várias métricas de diagnóstico. Para obter mais informações, consulte Métricas de diagnóstico: Microsoft.Extensions.Diagnostics.HealthChecks
.
Verificações de integridade de utilização de recursos
Para executar verificações de integridade na utilização de recursos de seus aplicativos .NET, adicione uma referência de pacote a Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. Em uma IServiceCollection instância, encadeie uma chamada de AddHealthChecks para AddResourceUtilizationHealthCheck. O exemplo a seguir demonstra como usar o AddResourceUtilizationHealthCheck
método extension para adicionar uma verificação de integridade de utilização de recursos a uma IServiceCollection
instância:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHealthChecks()
.AddResourceUtilizationHealthCheck();
var app = builder.Build();
var healthCheckService = app.Services.GetRequiredService<HealthCheckService>();
var result = await healthCheckService.CheckHealthAsync();
Console.WriteLine($"{result.Status} {result.TotalDuration}");
app.Run();
O código anterior:
- Cria uma nova HostApplicationBuilder instância.
- Adiciona uma verificação de integridade para utilização de recursos encadeando uma chamada da AddHealthChecks chamada para o AddResourceUtilizationHealthCheck método de extensão.
- Cria a IHost instância como a
app
variável. - Obtém uma instância da HealthCheckService classe do provedor de serviços.
- Executa uma verificação de integridade e exibe o resultado.
- Executa o aplicativo.
Verificações de integridade do tempo de vida do aplicativo
Para executar verificações de integridade nos eventos de tempo de vida do aplicativo do , use o método de IHostApplicationLifetimeextensão disponível no pacote NuGet Microsoft.Extensions.Diagnostics.HealthChecks.Common.AddApplicationLifecycleHealthCheck
Esse provedor indicará que o aplicativo está íntegro somente quando estiver totalmente ativo. Até que o objeto de tempo de vida indique que o aplicativo foi iniciado, o provedor relatará o aplicativo como não íntegro. Quando o aplicativo começar a ser desligado, o provedor relatará o aplicativo como não íntegro.
A biblioteca expõe uma possibilidade de HealthCheckService os consumidores solicitarem um exame de saúde a qualquer momento. Considere a seguinte ExampleService
implementação:
using System.Runtime.CompilerServices;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
internal class ExampleLifecycle(
HealthCheckService healthCheckService,
ILogger<ExampleLifecycle> logger) : IHostedLifecycleService
{
Task IHostedService.StartAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedService.StopAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
public Task ReadyAsync() => CheckHealthAsync();
private async Task CheckHealthAsync(
[CallerMemberName] string eventName = "",
CancellationToken cancellationToken = default)
{
HealthReport result =
await healthCheckService.CheckHealthAsync(cancellationToken);
logger.LogInformation(
"{EventName}: {Status}", eventName, result.Status);
}
}
O código anterior:
- Define uma nova
ExampleLifecycle
classe que implementa a IHostedService interface. - Define um construtor primário aceitando os seguintes parâmetros:
- Uma instância da HealthCheckService classe.
- Uma instância da ILogger<TCategoryName> classe.
- Implementa a IHostedLifecycleService interface, com cada método invocando o
CheckHealthAsync
método. - Define um
ReadyAsync
método que invoca oCheckHealthAsync
método. - Define um método personalizado
CheckHealthAsync
que captura o nome do chamador e o token de cancelamento e, em seguida, solicita uma verificação de integridade daHealthCheckService
instância. Oresult
é então registado.
A única vez que o serviço de verificação de integridade relatará um status é depois que o aplicativo for iniciado e antes de HealthStatus.Healthy parar for chamado. Por favor, considere as seguintes Program.cs:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
var healthChecksBuilder = builder.Services
.AddHostedService<ExampleLifecycle>()
.AddHealthChecks()
.AddApplicationLifecycleHealthCheck();
// You could use the healthChecksBuilder instance to add more checks...
var app = builder.Build();
var services = app.Services.GetRequiredService<IEnumerable<IHostedService>>();
await Task.WhenAll(DelayAndReportAsync(services), app.RunAsync());
static async Task DelayAndReportAsync(IEnumerable<IHostedService> services)
{
// Ensure app started...
await Task.Delay(500);
var service = services.FirstOrDefault(static s => s is ExampleLifecycle);
if (service is ExampleLifecycle example)
{
await example.ReadyAsync();
}
}
O código anterior:
- Cria uma nova HostApplicationBuilder instância atribuindo como a
builder
variável. - Registra o
ExampleService
como o único IHostedServicedo aplicativo . - Adiciona uma verificação de integridade para os eventos de tempo de vida do aplicativo encadeando uma chamada da IHealthChecksBuilder instância retornada pela AddHealthChecks chamada para o AddApplicationLifecycleHealthCheck método de IHostApplicationLifetime extensão.
- A
healthChecksBuilder
instância pode ser usada para adicionar mais verificações de integridade.
- A
- Cria a IHost instância como a
app
variável. - Obtém um
IHostedService
do provedor de serviços, esta é aExampleService
instância. - Chamadas Task.WhenAll com duas referências de tarefas:
- O
DelayAndReportAsync
método, que atrasa por 500 milissegundos e, em seguida, invoca oReadyAsync
ExampleService
método na instância, avaliará a verificação de integridade. - O RunAsync(IHost, CancellationToken) método, inicia o
app
.
- O
O aplicativo gera logs na seguinte ordem, relatando o status da verificação de integridade em relação aos eventos do ciclo de vida:
StartingAsync
: InsalubridadeStartAsync
: InsalubridadeStartedAsync
: InsalubridadeReadyAsync
: SaudávelStoppingAsync
: InsalubridadeStopAsync
: InsalubridadeStoppedAsync
: Insalubridade
Em outras palavras, esse provedor garante que a instância do aplicativo só receba tráfego quando estiver pronta. Se você estiver desenvolvendo aplicativos Web com o ASP.NET Core, há middleware de verificações de integridade disponível. Para obter mais informações, Verificações de integridade no ASP.NET Core.