Furkan KapukayaYazılım geliştirme
C# ve .NET3 dk okuma

ASP.NET Core Health Checks: Uygulamanın Sağlığını Ölçmek

ASP.NET Core sağlık kontrollerinin kurulumu; liveness ve readiness ayrımı, veritabanı ve dış servis kontrolleri, özel kontrol yazma, güvenlik ve izleme araçlarıyla kullanım.

Bir uygulamanın "çalışıyor" görünmesi, gerçekten iş görebildiği anlamına gelmez. Web sunucusu cevap verirken veritabanı bağlantısı kopmuş veya ödeme servisine ulaşılamıyor olabilir. ASP.NET Core'un sağlık kontrolü (health checks) altyapısı, uygulamanın ve bağımlılıklarının durumunu standart bir uç noktadan raporlar.

Temel kurulum

builder.Services.AddHealthChecks()
    .AddCheck<VeritabaniKontrolu>("veritabani", tags: ["hazir"]);

var app = builder.Build();

app.MapHealthChecks("/health/live", new() { Predicate = _ => false });
app.MapHealthChecks("/health/ready", new() { Predicate = c => c.Tags.Contains("hazir") });

Sonuç üç durumdan biridir: Healthy, Degraded (çalışıyor ama sorunlu) veya Unhealthy.

Liveness ve readiness ayrımı

KontrolSoruBaşarısız olursa
Liveness (canlılık)Uygulama süreci çalışıyor mu, kilitlendi mi?Uygulama yeniden başlatılır
Readiness (hazırlık)İstek karşılamaya hazır mı, bağımlılıklar erişilebilir mi?Trafik bu kopyaya gönderilmez

Bu ayrım önemlidir: veritabanı geçici olarak erişilemezse uygulamayı yeniden başlatmak sorunu çözmez, ama trafiği almamak doğru davranıştır. Canlılık kontrolü bu yüzden bağımlılıkları kontrol etmemelidir. Kesintisiz dağıtım ve yük dengeleyiciler bu kontrollere dayanır. Bkz. sıfır kesintili dağıtım.

Özel kontrol yazmak

public class VeritabaniKontrolu(AppDbContext db) : IHealthCheck
{
    public async Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken ct = default)
    {
        try
        {
            return await db.Database.CanConnectAsync(ct)
                ? HealthCheckResult.Healthy()
                : HealthCheckResult.Unhealthy("Veritabanına bağlanılamıyor.");
        }
        catch (Exception ex)
        {
            return HealthCheckResult.Unhealthy("Veritabanı kontrolü hata verdi.", ex);
        }
    }
}

Topluluk paketleri SQL Server, PostgreSQL, Redis, mesaj kuyrukları ve pek çok servis için hazır kontroller sunar.

Neler kontrol edilmeli?

  • Veritabanı bağlantısı
  • Önbellek ve mesaj kuyruğu (Redis, mesaj kuyruğu)
  • Kritik dış servisler (dikkatle: dış servis yavaşsa sağlık kontrolü de yavaşlar; zaman aşımı koyun)
  • Disk alanı ve bellek eşikleri
  • Arka plan işlerinin son başarılı çalışma zamanı

Güvenlik

Ayrıntılı sağlık yanıtları (bağımlılık isimleri, hata mesajları) sistem hakkında bilgi sızdırır. Dışarıya yalnızca genel durumu gösterin; ayrıntılı raporu kimlik doğrulama veya iç ağ ile sınırlandırın:

app.MapHealthChecks("/health/detay").RequireAuthorization("Yonetici");

İzleme ile birleştirmek

Sağlık uç noktaları; uptime izleme servisleri, yük dengeleyiciler, konteyner orkestrasyon araçları ve Docker Compose sağlık kontrolleri tarafından kullanılabilir. Dış izleme için bkz. uptime izleme. Daha derin içgörü için gözlemlenebilirlik.

Sık sorulan sorular

Sağlık kontrolleri ne sıklıkla çağrılmalı?

Genellikle 10-60 saniye arası yeterlidir. Pahalı kontroller için sonucu kısa süre önbellekte tutmak faydalıdır.

Degraded durumu ne zaman kullanılır?

Uygulama çalışıyor ama bir işlev yavaş veya kısıtlı ise; örneğin önbellek erişilemiyor ama veritabanından okunabiliyorsa.

Sonuç

Sağlık kontrolleri, uygulamanın "çalışıyorum" demesini değil "iş görebiliyorum" demesini sağlar. Canlılık ve hazırlık ayrımıyla kurulan kontroller; dağıtımları güvenli, kesintileri kısa ve izlemeyi anlamlı kılar.