Partilhar 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. 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:

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

O aplicativo gera logs na seguinte ordem, relatando o status da verificação de integridade em relação aos eventos do ciclo de vida:

  1. StartingAsync: Insalubridade
  2. StartAsync: Insalubridade
  3. StartedAsync: Insalubridade
  4. ReadyAsync: Saudável
  5. StoppingAsync: Insalubridade
  6. StopAsync: Insalubridade
  7. StoppedAsync: 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.

Consulte também