Configuração de Health Checks no .NET Core com HealthChecksUI

As verificações de saúde no .NET Core são essenciais para monitorar a integridade das aplicações. O status pode ser Healthy (saudável), Degraded (degradado) ou Unhealthy (não saudável). Para implementar, adicione os serviços e o middleware básico.

builder.Services.AddHealthChecks();
app.UseHealthChecks("/status");

Para uma interface visual, instale os pacotes NuGet: AspNetCore.HealthChecks.UI, AspNetCore.HealthChecks.UI.Client e AspNetCore.HealthChecks.UI.InMemory.Storage. Adicionalmente, para verificar a saúde do MySQL, utilize Microsoft.EntityFrameworkCore e Pomelo.EntityFrameworkCore.MySql.

Implemente uma verificação personalizada para o banco de dados. Crie uma classe que implementa IHealthCheck, alterando nomes e lógica conforme necessário:

using Microsoft.Extensions.Diagnostics.HealthChecks;
using MinhaApp.Dados;

namespace MinhaApp
{
    public class ChecagemSaudeMySql : IHealthCheck
    {
        private readonly BancoDadosContexto _bancoContexto;

        public ChecagemSaudeMySql(BancoDadosContexto bancoContexto)
        {
            _bancoContexto = bancoContexto;
        }

        public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            var podeConectar = await _bancoContexto.Database.CanConnectAsync(cancellationToken);
            if (!podeConectar)
            {
                return new HealthCheckResult(HealthStatus.Unhealthy, description: "Falha na conexão com o banco de dados MySQL.");
            }
            return new HealthCheckResult(HealthStatus.Healthy, description: "Banco de dados MySQL operacional.");
        }
    }
}

Registre os serviços e configure a aplicação. No arquivo Program.cs, modifique a configuração para incluir verificações de saúde, HealthChecksUI e o contexto do banco:

using HealthChecks.UI.Client;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.EntityFrameworkCore;
using MinhaApp;
using MinhaApp.Dados;

var construtor = WebApplication.CreateBuilder(args);

construtor.Services.AddControllers();
construtor.Services.AddEndpointsApiExplorer();
construtor.Services.AddSwaggerGen();

// Configura verificações de saúde
construtor.Services.AddHealthChecks()
    .AddCheck("aplicacao", () => new HealthCheckResult(HealthStatus.Healthy, description: "Aplicação funcionando"))
    .AddCheck<ChecagemSaudeMySql>("mysql");

// Configura HealthChecksUI com armazenamento em memória
construtor.Services.AddHealthChecksUI()
    .AddInMemoryStorage();

// Configura o contexto do banco de dados
string conexao = construtor.Configuration.GetConnectionString("ConexaoBanco");
construtor.Services.AddDbContext<BancoDadosContexto>(opcoes =>
    opcoes.UseMySql(conexao, new MySqlServerVersion(new Version(8, 0, 25))));

var app = construtor.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

// Middleware para Health Checks
app.UseHealthChecks("/status", new HealthCheckOptions
{
    Predicate = _ => true,
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

// Middleware para Health Checks UI
app.UseHealthChecksUI(config =>
{
    config.UIPath = "/painel-saude";
});

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

No arquivo appsettings.json, cofnigure o HealthChecksUI apontando para o endpoint de saúde:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "ConexaoBanco": "Seu servidor, banco, usuário e senha aqui"
  },
  "HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "Verificação Local",
        "Uri": "/status"
      }
    ],
    "EvaluationTimeinSeconds": 15,
    "MinimumSecondsBetweenFailureNotifications": 60
  }
}

Para testar, inicie a aplicação e acesse https://localhost:7185/painel-saude. O painel exibirá o status das verificações, incluindo a tentativa de conexão com o MySQL, que pode falhar se a string de conexão estiver incorreta ou o banco indisponível.

Tags: dotnet-core health-checks healthchecksui MySQL entity-framework-core

Publicado em 6-12 17:00 por Thomas