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. Essas verificações garantem que o sistema funcione de forma correta e eficiente. As verificações de integridade são essenciais para a confiabilidade do sistema e normalmente são executadas em intervalos regulares com os resultados analisados para tomada de decisão e ações corretivas.
Os seguintes resultados de status de verificação de integridade são possíveis:
Além disso, 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 instância IServiceCollection, encadeie uma chamada de AddHealthChecks para AddResourceUtilizationHealthCheck. O exemplo a seguir demonstra como usar o método de extensão AddResourceUtilizationHealthCheck
para adicionar uma verificação de integridade de utilização de recursos a uma instância IServiceCollection
:
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 instância HostApplicationBuilder.
- Adiciona uma verificação de integridade para utilização de recursos encadeando uma chamada da chamada AddHealthChecks ao método de extensão AddResourceUtilizationHealthCheck.
- Cria a instância IHost como a variável
app
. - Obtém uma instância da classeHealthCheckService 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 IHostApplicationLifetime, use o método de extensão AddApplicationLifecycleHealthCheck disponível no pacote NuGet Microsoft.Extensions.Diagnostics.HealthChecks.Common.
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 irá relatar o aplicativo como não íntegro. Quando o aplicativo começar a desligar, o provedor irá relatar o aplicativo como não íntegro.
A biblioteca expõe um HealthCheckService que permite que os consumidores solicitem uma verificação de integridade a qualquer momento. Considere a seguinte implementação ExampleService
:
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 classe
ExampleLifecycle
que implementa a interfaceIHostedService. - Define um construtor primário que aceita os seguintes parâmetros:
- Uma instância da classe HealthCheckService.
- Uma instância da classe ILogger<TCategoryName>.
- Implementa a interface IHostedLifecycleService, com cada método invocando o método
CheckHealthAsync
. - Define um método
ReadyAsync
que invoca o métodoCheckHealthAsync
. - Define um método personalizado
CheckHealthAsync
que captura o nome do chamador e o token de cancelamento e solicita uma verificação de integridade da instânciaHealthCheckService
. Em seguida, aresult
é registrada.
A única vez que o serviço de verificação de integridade relatará um status de HealthStatus.Healthy é depois que o aplicativo for iniciado e antes da interrupção ser chamada. Considere o seguinte 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 instância HostApplicationBuilder atribuindo como a variável
builder
. - Registra o
ExampleService
como o único IHostedServicedo aplicativo. - Adiciona uma verificação de integridade para os eventos de tempo de vida do IHostApplicationLifetime encadeando uma chamada da instância IHealthChecksBuilder retornada pela chamada AddHealthChecks ao método de extensão AddApplicationLifecycleHealthCheck.
- Você pode usar a instância
healthChecksBuilder
para adicionar mais verificações de integridade.
- Você pode usar a instância
- Cria a instância IHost como a variável
app
. - Obtém um
IHostedService
do provedor de serviços, essa é a instânciaExampleService
. - Chama Task.WhenAll dadas duas referências de tarefa:
- O método
DelayAndReportAsync
, que atrasa 500 milissegundos e invoca o métodoReadyAsync
na instânciaExampleService
, avaliará a verificação de integridade. - O método RunAsync(IHost, CancellationToken) inicia o
app
.
- O método
O aplicativo gera logs na seguinte ordem, relatando o status de verificação de integridade conforme ele se relaciona com os eventos do ciclo de vida:
StartingAsync
: Não ÍntegroStartAsync
: Não ÍntegroStartedAsync
: Não ÍntegroReadyAsync
: ÍntegroStoppingAsync
: Não ÍntegroStopAsync
: Não ÍntegroStoppedAsync
: Não Íntegro
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, consulte Verificações de integridade no ASP.NET Core.