ChatRAG/Services/VectorDatabaseHealthCheck.cs
2025-06-15 21:34:47 -03:00

65 lines
2.5 KiB
C#

using ChatRAG.Services.Contracts;
using Microsoft.Extensions.Diagnostics.HealthChecks;
namespace ChatRAG.Services
{
public class VectorDatabaseHealthCheck : IHealthCheck
{
private readonly IVectorDatabaseFactory _factory;
private readonly ILogger<VectorDatabaseHealthCheck> _logger;
public VectorDatabaseHealthCheck(
IVectorDatabaseFactory factory,
ILogger<VectorDatabaseHealthCheck> logger)
{
_factory = factory;
_logger = logger;
}
public async Task<HealthCheckResult> 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<string, object>
{
["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<string, object>
{
["provider"] = _factory.GetActiveProvider(),
["error"] = ex.Message
});
}
}
}
}