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.

Os seguintes resultados do estado da verificação de saúde são possíveis

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 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 IHostApplicationLifetime instância retornada pela IHealthChecksBuilder chamada para o AddHealthChecks método de AddApplicationLifecycleHealthCheck 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 ReadyAsyncExampleService 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