Compartilhar via


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:

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:
  • Implementa a interface IHostedLifecycleService, com cada método invocando o método CheckHealthAsync.
  • Define um método ReadyAsync que invoca o método CheckHealthAsync.
  • 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ância HealthCheckService. Em seguida, a result é 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.
  • Cria a instância IHost como a variável app.
  • Obtém um IHostedService do provedor de serviços, essa é a instância ExampleService.
  • Chama Task.WhenAll dadas duas referências de tarefa:
    • O método DelayAndReportAsync, que atrasa 500 milissegundos e invoca o método ReadyAsync na instânciaExampleService, avaliará a verificação de integridade.
    • O método RunAsync(IHost, CancellationToken) inicia o app.

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:

  1. StartingAsync: Não Íntegro
  2. StartAsync: Não Íntegro
  3. StartedAsync: Não Íntegro
  4. ReadyAsync: Íntegro
  5. StoppingAsync: Não Íntegro
  6. StopAsync: Não Íntegro
  7. StoppedAsync: 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.

Confira também