56 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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<NotifyDeliveryQueueHealthCheck> _logger;
 | |
| 
 | |
|     public NotifyDeliveryQueueHealthCheck(
 | |
|         INotifyDeliveryQueue queue,
 | |
|         ILogger<NotifyDeliveryQueueHealthCheck> logger)
 | |
|     {
 | |
|         _queue = queue ?? throw new ArgumentNullException(nameof(queue));
 | |
|         _logger = logger ?? throw new ArgumentNullException(nameof(logger));
 | |
|     }
 | |
| 
 | |
|     public async Task<HealthCheckResult> 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);
 | |
|         }
 | |
|     }
 | |
| }
 |