diff --git a/src/HealthChecks/LDAPHealthChecks.cs b/src/HealthChecks/LDAPHealthChecks.cs new file mode 100644 index 0000000..c87ba73 --- /dev/null +++ b/src/HealthChecks/LDAPHealthChecks.cs @@ -0,0 +1,31 @@ +using Berufsschule_HAM.Services; +using Microsoft.Extensions.Diagnostics.HealthChecks; +namespace Berufsschule_HAM.HealthChecks; + +public class DatabaseHealthCheck : IHealthCheck +{ + private readonly ILogger _logger; + private readonly LdapService _ldapService; + + public DatabaseHealthCheck(ILogger logger, LdapService ldapService) + { + _logger = logger; + _ldapService = ldapService; + } + + public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) + { + _logger.LogTrace("CheckHealthAsync - Checking health"); + try + { + await _ldapService.ListUsersAsync(); + } + catch (Exception ex) + { + _logger.LogError(ex, "CheckHealthAsync - Unable to list users due to exception {ex.Message} - {ex.StackTrace}", [ex.Message, ex.StackTrace]); + return HealthCheckResult.Unhealthy(); + } + _logger.LogTrace("CheckHealthAsync - Health check successful"); + return HealthCheckResult.Healthy(); + } +} \ No newline at end of file diff --git a/src/Program.cs b/src/Program.cs index 9712d7c..90c5ba2 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -4,6 +4,7 @@ using Serilog; using Microsoft.AspNetCore.Authentication.Cookies; using Berufsschule_HAM.Services; using Berufsschule_HAM.Models; +using Berufsschule_HAM.HealthChecks; var builder = WebApplication.CreateBuilder(args); // Bind options @@ -26,6 +27,9 @@ builder.Services.AddElmah(Options => builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddHealthChecks() + .AddCheck("DatabaseHealthCheck"); + builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { @@ -53,6 +57,8 @@ app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); +app.MapHealthChecks("/healthz"); + // Run migrations using var scope = app.Services.CreateScope(); var migrationService = scope.ServiceProvider.GetRequiredService();