.Net Core API HealtCheck Kullanımı

Posted by

Merhaba arkadaşlar, bu yazımda sizlere .Net Core API HealtCheck Kullanımı konusundan bahsedeceğim.

Bir API hizmeti sağladığınızda, uygulamanızın sağlıklı bir şekilde çalışmasını sağlamak önemlidir. Kullanıcılarınızın kesintisiz bir deneyim yaşamasını sağlamak ve sorunların hızlı bir şekilde tespit edilmesini sağlamak için uygulamanızı sürekli olarak gözetim altında tutmanız gerekmektedir. Bu noktada, .NET Core’un sağladığı Health Check (Sağlık Kontrolü) mekanizması devreye girer.

.NET Core API HealthCheck, uygulamanızın durumunu izlemek, önemli bileşenlerin çalışabilirliğini kontrol etmek ve hata durumlarında uygun bir yanıt vermek için kullanılan bir özelliktir. Bu mekanizma, API hizmetinizin sağlık durumunu düzenli olarak kontrol ederek, sunucu yanıtlarını, veritabanı bağlantılarını, dış servislerin erişilebilirliğini ve diğer özel sağlık kontrollerini değerlendirir.

Öncelikle, sağlık kontrolü gerçekleştirecek asenkron metotlarımızı yazalım. Bunun için CustomHealthCheck isminde bir class oluşturup IHealthCheck interface’inden miras alma işlemini gerçekleştiriyoruz ve içerisine kontrol edeceğimiz metotlarımızı yazıyoruz.

Örnek Kod:

public class CustomHealthCheck : IHealthCheck
	{
		private readonly List<Func<Task<HealthCheckResult>>> healthChecks;

		public CustomHealthCheck()
		{
			healthChecks = new List<Func<Task<HealthCheckResult>>>
			{
				CheckDatabaseConnectionAsync,
				CheckExternalServiceAsync
			};
		}

		public string Name => "custom_health_check";

		public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, System.Threading.CancellationToken cancellationToken = default)
		{
			var healthCheckResults = new List<HealthCheckResult>();

			foreach (var healthCheck in healthChecks)
			{
				var result = await healthCheck.Invoke();
				healthCheckResults.Add(result);
			}

			var hasUnhealthyChecks = healthCheckResults.Any(r => r.Status != HealthStatus.Healthy);

			if (hasUnhealthyChecks)
			{
				return HealthCheckResult.Unhealthy("One or more health checks are unhealthy.", null, CreateAdditionalData(healthCheckResults));
			}

			return HealthCheckResult.Healthy("All health checks are healthy.", CreateAdditionalData(healthCheckResults));
		}

		private Task<HealthCheckResult> CheckDatabaseConnectionAsync()
		{
			bool isDatabaseConnectionHealthy = false;

			if (isDatabaseConnectionHealthy)
			{
				return Task.FromResult(HealthCheckResult.Healthy("Database connection is healthy."));
			}
			else
			{
				return Task.FromResult(HealthCheckResult.Unhealthy("Database connection is unhealthy."));
			}
		}

		private Task<HealthCheckResult> CheckExternalServiceAsync()
		{
			bool isExternalServiceHealthy = true;

			if (isExternalServiceHealthy)
			{
				return Task.FromResult(HealthCheckResult.Healthy("External service is healthy."));
			}
			else
			{
				return Task.FromResult(HealthCheckResult.Unhealthy("External service is unhealthy."));
			}
		}

		private Dictionary<string, object> CreateAdditionalData(List<HealthCheckResult> healthCheckResults)
		{
			var additionalData = new Dictionary<string, object>
			{
				{ "Timestamp", DateTime.UtcNow },
				{ "Environment", "Production" },
				{ "HealthCheckResults", healthCheckResults }
			};

			return additionalData;
		}
	}

Yukarıdaki sınıf içerisinde Database bağlantısını ve Dış servise bağlanma durumlarını kontrol ediyoruz.

Bu sınıfımızı oluşturduktan sonra ise Program.cs içerisinde bunu kullanıyoruz.

Program.cs içerisinde de aşağıdaki gibi kodumuzu ekliyoruz.

builder.Services.AddHealthChecks().AddCheck<CustomHealthCheck>("custom_health_check");

Bu eklemeyi de yaptıktan sonra projemizi çalıştırdıktan sonra /health endpointine gittiğimizde bize bir sonuç dönecektir. Başarılı ve başarısız olan işlemler için bir sonuç dönecektir.

Umarım faydalı olur.

Bir sonraki yazıda görüşmek üzere…

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir