using ChatRAG.Services.Contracts; using Microsoft.Extensions.Diagnostics.HealthChecks; namespace ChatRAG.Services { public class VectorDatabaseHealthCheck : IHealthCheck { private readonly IVectorDatabaseFactory _factory; private readonly ILogger _logger; public VectorDatabaseHealthCheck( IVectorDatabaseFactory factory, ILogger logger) { _factory = factory; _logger = logger; } public async Task CheckHealthAsync( HealthCheckContext context, CancellationToken cancellationToken = default) { try { var provider = _factory.GetActiveProvider(); var vectorService = _factory.CreateVectorSearchService(); var textService = _factory.CreateTextDataService(); // Testa conectividade básica var isHealthy = await vectorService.IsHealthyAsync(); var stats = await vectorService.GetStatsAsync(); var providerStats = await textService.GetProviderStatsAsync(); var data = new Dictionary { ["provider"] = provider, ["vector_service_healthy"] = isHealthy, ["total_documents"] = stats.GetValueOrDefault("total_documents", 0), ["provider_stats"] = providerStats }; if (isHealthy) { _logger.LogDebug("Vector Database health check passou para provider {Provider}", provider); return HealthCheckResult.Healthy($"Vector Database ({provider}) está saudável", data); } else { _logger.LogWarning("Vector Database health check falhou para provider {Provider}", provider); return HealthCheckResult.Unhealthy($"Vector Database ({provider}) não está saudável", data: data); } } catch (Exception ex) { _logger.LogError(ex, "Erro no health check do Vector Database"); return HealthCheckResult.Unhealthy("Erro no Vector Database", ex, new Dictionary { ["provider"] = _factory.GetActiveProvider(), ["error"] = ex.Message }); } } } }