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.