using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Logging; using StellaOps.Notify.Queue.Nats; using StellaOps.Notify.Queue.Redis; namespace StellaOps.Notify.Queue; public sealed class NotifyDeliveryQueueHealthCheck : IHealthCheck { private readonly INotifyDeliveryQueue _queue; private readonly ILogger _logger; public NotifyDeliveryQueueHealthCheck( INotifyDeliveryQueue queue, ILogger logger) { _queue = queue ?? throw new ArgumentNullException(nameof(queue)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task CheckHealthAsync( HealthCheckContext context, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); try { switch (_queue) { case RedisNotifyDeliveryQueue redisQueue: await redisQueue.PingAsync(cancellationToken).ConfigureAwait(false); return HealthCheckResult.Healthy("Redis Notify delivery queue reachable."); case NatsNotifyDeliveryQueue natsQueue: await natsQueue.PingAsync(cancellationToken).ConfigureAwait(false); return HealthCheckResult.Healthy("NATS Notify delivery queue reachable."); default: return HealthCheckResult.Healthy("Notify delivery queue transport without dedicated ping returned healthy."); } } catch (Exception ex) { _logger.LogError(ex, "Notify delivery queue health check failed."); return new HealthCheckResult( context.Registration.FailureStatus, "Notify delivery queue transport unreachable.", ex); } } }