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ı
| Kontrol | Soru | Baş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.