Added healthchecks to server

This commit is contained in:
2025-07-06 09:55:18 +02:00
parent 1fe70264fd
commit 84a4a9d51e
4 changed files with 84 additions and 1 deletions

View File

@@ -0,0 +1,31 @@
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Server.Migrations;
namespace Server.HealthChecks;
public class AIProviderHealthCheck : IHealthCheck
{
private readonly SearchdomainManager _searchdomainManager;
private readonly ILogger<DatabaseHealthCheck> _logger;
public AIProviderHealthCheck(SearchdomainManager searchdomainManager, ILogger<DatabaseHealthCheck> logger)
{
_searchdomainManager = searchdomainManager;
_logger = logger;
}
public Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context, CancellationToken cancellationToken = default)
{
try
{
var _ = _searchdomainManager.client.ListLocalModelsAsync(cancellationToken).Result;
}
catch (Exception ex)
{
_logger.LogCritical("AIProviderHealthCheck - Exception occurred when listing local models: {ex}", ex.Message);
return Task.FromResult(
HealthCheckResult.Unhealthy());
}
return Task.FromResult(
HealthCheckResult.Healthy());
}
}

View File

@@ -0,0 +1,44 @@
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Server.Migrations;
namespace Server.HealthChecks;
public class DatabaseHealthCheck : IHealthCheck
{
private readonly SearchdomainManager _searchdomainManager;
private readonly ILogger<DatabaseHealthCheck> _logger;
public DatabaseHealthCheck(SearchdomainManager searchdomainManager, ILogger<DatabaseHealthCheck> logger)
{
_searchdomainManager = searchdomainManager;
_logger = logger;
}
public Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context, CancellationToken cancellationToken = default)
{
try
{
DatabaseMigrations.DatabaseGetVersion(_searchdomainManager.helper);
}
catch (Exception ex)
{
_logger.LogCritical("DatabaseHealthCheck - Exception occurred when retrieving and parsing database version: {ex}", ex.Message);
return Task.FromResult(
HealthCheckResult.Unhealthy());
}
try
{
_searchdomainManager.helper.ExecuteSQLNonQuery("INSERT INTO settings (name, value) VALUES ('test', 'x');", []);
_searchdomainManager.helper.ExecuteSQLNonQuery("DELETE FROM settings WHERE name = 'test';", []);
}
catch (Exception ex)
{
_logger.LogCritical("DatabaseHealthCheck - Exception occurred when executing INSERT/DELETE query: {ex}", ex.Message);
return Task.FromResult(
HealthCheckResult.Unhealthy());
}
return Task.FromResult(
HealthCheckResult.Healthy());
}
}

View File

@@ -2,6 +2,7 @@ using ElmahCore;
using ElmahCore.Mvc;
using Serilog;
using Server;
using Server.HealthChecks;
var builder = WebApplication.CreateBuilder(args);
@@ -16,6 +17,9 @@ Log.Logger = new LoggerConfiguration()
.CreateLogger();
builder.Logging.AddSerilog();
builder.Services.AddSingleton<SearchdomainManager>();
builder.Services.AddHealthChecks()
.AddCheck<DatabaseHealthCheck>("DatabaseHealthCheck")
.AddCheck<AIProviderHealthCheck>("AIProviderHealthChecck");
builder.Services.AddElmah<XmlFileErrorLog>(Options =>
{
@@ -48,6 +52,8 @@ app.Use(async (context, next) =>
app.UseElmah();
app.MapHealthChecks("/healthz");
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{