using Microsoft.Extensions.Diagnostics.HealthChecks; using MongoDB.Driver; using MongoDB.Bson; using System.Diagnostics; namespace BCards.Web.HealthChecks; public class MongoDbHealthCheck : IHealthCheck { private readonly IMongoDatabase _database; private readonly ILogger _logger; public MongoDbHealthCheck(IMongoDatabase database, ILogger logger) { _database = database; _logger = logger; } public async Task CheckHealthAsync( HealthCheckContext context, CancellationToken cancellationToken = default) { var stopwatch = Stopwatch.StartNew(); try { // Executa ping no MongoDB var command = new BsonDocument("ping", 1); await _database.RunCommandAsync(command, cancellationToken: cancellationToken); stopwatch.Stop(); var duration = stopwatch.ElapsedMilliseconds; _logger.LogInformation("MongoDB health check completed successfully in {Duration}ms", duration); var data = new Dictionary { { "status", "healthy" }, { "duration", $"{duration}ms" }, { "database", _database.DatabaseNamespace.DatabaseName }, { "connection_state", "connected" }, { "latency", duration } }; // Status baseado na latĂȘncia if (duration > 5000) // > 5s return HealthCheckResult.Unhealthy($"MongoDB response time too high: {duration}ms", data: data); if (duration > 2000) // > 2s return HealthCheckResult.Degraded($"MongoDB response time elevated: {duration}ms", data: data); return HealthCheckResult.Healthy($"MongoDB is responsive ({duration}ms)", data: data); } catch (Exception ex) { stopwatch.Stop(); var duration = stopwatch.ElapsedMilliseconds; _logger.LogError(ex, "MongoDB health check failed after {Duration}ms", duration); var data = new Dictionary { { "status", "unhealthy" }, { "duration", $"{duration}ms" }, { "database", _database.DatabaseNamespace.DatabaseName }, { "connection_state", "disconnected" }, { "error", ex.Message } }; return HealthCheckResult.Unhealthy($"MongoDB connection failed: {ex.Message}", ex, data); } } }