Üretim ortaminda çalışan bir uygulamanin sağlık durumu, orchestrator'larin (Kubernetes, Docker Swarm, Azure App Service) trafik yonlendirme kararlarini belirler. ASP.NET Core, Microsoft.Extensions.Diagnostics.HealthChecks paketi ile standart bir health check altyapisi sunar. Bu altyapi, veritabanı baglantisi, dis API erisilebilirligi, disk alani ve özel is kurallari gibi kontrolleri birlestirip HTTP endpoint uzerinden raporlar.
Health check turleri
Operasyonel dilde uc kavram sik kullanılır:
- Liveness: Uygulama process'i yasiyor mu? Kilitlenmisse restart tetiklenir.
- Readiness: Trafik almaya hazir mi? Bağımlılıklar hazir degilse load balancer instance'i cikarir.
- Startup: Ilk baslatma tamamlandi mi? Yavas baslayan uygulamalarda kullanılır.
ASP.NET Core tek bir health check API'si sunar; farklı endpoint'lerde farklı check filtreleri ile liveness/readiness ayrilir.
Temel kurulum
builder.Services.AddHealthChecks()
.AddSqlServer(connectionString, name: "sql")
.AddRedis(redisConnection, name: "redis")
.AddCheck<CustomBusinessCheck>("business-rules");
app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
Predicate = check => check.Tags.Contains("ready"),
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
app.MapHealthChecks("/health/live", new HealthCheckOptions
{
Predicate = _ => false // Sadece host ayakta mi
});
Predicate ile hangi check'lerin hangi endpoint'te calisacagi secilir. Kubernetes probe tanimlarinda /health/live ve /health/ready ayri ayarlanir.
Custom health check yazimi
public class OutboxLagCheck : IHealthCheck
{
private readonly AppDbContext _db;
public OutboxLagCheck(AppDbContext db) => _db = db;
public async Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
var pending = await _db.OutboxMessages
.CountAsync(m => !m.Processed, cancellationToken);
if (pending > 10_000)
return HealthCheckResult.Unhealthy(
$"Outbox lag: {pending} bekleyen mesaj");
if (pending > 1_000)
return HealthCheckResult.Degraded(
$"Outbox lag yuksek: {pending}");
return HealthCheckResult.Healthy($"Outbox normal: {pending}");
}
}
Degraded durumu, sistem calisiyor ama SLA riski var sinyali verir; alerting kurallarinda Unhealthy'den farklı esik kullanılabilir.
HealthCheckResult ve exception
Check icinde yakalanmamis exception otomatik Unhealthy sayilir. Bilerek exception firlatmak yerine anlamli mesaj donmek operasyon ekibine zaman kazandirir. data sozlugu ile ek metrikler JSON yanitina eklenir:
return HealthCheckResult.Healthy("OK", new Dictionary<string, object>
{
["queue_depth"] = depth,
["last_processed"] = lastProcessedUtc
});
Güvenlik
Health endpoint'leri disariya aciksa bilgi sizintisi riski vardir. Detayli JSON yerine sinirli bilgi donun veya internal ag ile sinirlayin. Production'da:
- Detayli hata mesajlarini sadece internal endpoint'te gosterin.
- Public load balancer icin sadece 200/503 yeterli olabilir.
- Authentication veya IP allowlist dusunun.
Observability ile birlesim
Health check tek basina observability degildir; metrik, log ve trace ile tamamlanir. OpenTelemetry exporter'lari ASP.NET Core'a plug edilir:
builder.Services.AddOpenTelemetry()
.WithMetrics(m => m
.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation()
.AddPrometheusExporter())
.WithTracing(t => t.AddAspNetCoreInstrumentation());
Prometheus /metrics endpoint'i health'ten ayri tutulur. Alertmanager kurallari hem health probe basarisizligina hem metrik esiklerine baglanabilir.
Structured logging ve correlation
Health check başarısız oldugunda structured log kritik oneme sahiptir:
_logger.LogWarning(
"Health check {CheckName} failed: {Description}",
registration.Name,
result.Description);
Correlation ID middleware ile birlestirildiginde, readiness dususleri ile kullanıcı hata raporlari arasında bağlantı kurulabilir.
Deployment senaryolari
Rolling update sirasinda yeni pod readiness gecene kadar trafik almaz. Eski pod graceful shutdown ile drain edilir. Health check timeout'lari probe periodSeconds ve failureThreshold ile uyumlu olmali; agir SQL check her saniye calistirilirsa veritabanı gereksiz yuklenir.
Cache warm-up gerektiren uygulamalarda startup probe ile baslatma suresi tolere edilir; liveness probe daha toleransli ayarlanir.
Health Checks UI
AspNetCore.HealthChecks.UI paketi birden fazla servisin durumunu dashboard'da gösterir. Mikro servis mimarisinde merkezi sağlık panosu icin kullanılır. Uretimde erişim kisitlanmali ve authentication zorunlu olmalidir.
Test
Entegrasyon testinde health endpoint cagrilarak bağımlılık mock'larinin doğru yapilandirildigi dogrulanir:
var response = await client.GetAsync("/health/ready");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadFromJsonAsync<HealthReportDto>();
Assert.Equal("Healthy", json.Status);
Özet
Health check'ler modern deployment'un vazgecilmez parcasidir. Liveness ve readiness ayrimi, custom check'ler ile is kurallari izleme ve güvenli endpoint tasarımı bir arada dusunulmelidir. Observability stack'i ile entegre edildiginde sorunlar kullanıcıya ulasmadan tespit edilir; operasyonel olgunlugun temel taslarindan biri saglam health ve metrik altyapisidir.
Örnek Kubernetes probe yapilandirmasi
Readiness probe başarısız oldugunda Service endpoint'ten pod cikarilir; liveness başarısız oldugunda kubelet container'i yeniden baslatir. Startup probe yavas baslayan .NET uygulamalarinda JIT ve EF migration suresini tolere eder. Probe timeout degerleri health check icindeki en yavas bagimliligin suresinden kisa olmamali.
Distributed tracing
ActivitySource ile custom span'ler health check surelerini trace'e ekler. Jaeger veya Zipkin UI'da yavas SQL check hangi dependency'den kaynaklandi gorulur. Sampling orani uretimde düşük tutulabilir; hata durumlarinda always sample policy uygulanir.
Synthetic monitoring
Disaridan periyodik health ping (Pingdom, Azure Availability Test) kullanıcı perspektifinden erisilebilirligi olcer. Internal health endpoint'ten farklı olarak DNS, TLS sertifikasi ve CDN katmanini da kapsar.
SLI/SLO baglantisi
Health degraded durumu SLI ihlaline isaret edebilir. Error budget tuketimi alerting ile eslestirildiginde onceliklendirme objektiflesir. Golden signals (latency, traffic, errors, saturation) health endpoint'ten bagimsiz Prometheus metrikleri ile olculur.
Health check tag stratejisi
Her check'e tags: new[] { "ready", "db" } gibi etiketler verilir. Predicate ile endpoint bazli filtreleme yapilir. Db check sadece readiness'te, disk check hem liveness hem readiness'te calisabilir. Tag isimleri ekip icinde standardize edilmelidir.
Timeout ve CancellationToken
Health check implementasyonu CancellationToken honor etmelidir. Kubernetes probe timeout'u gectiginde check iptal edilir; uzun suran sorgular probe storm'a yol acar. HealthCheckRegistration uzerinde timeout ayarlanabilir.
Metrik ve alert esikleri
aspnetcore_health_check_total gibi metrikler Prometheus ile scrape edilir. Unhealthy orani %1'i astiginda PagerDuty tetiklenebilir. Degraded durumu warning, Unhealthy critical severity alir. Health endpoint HTTP 503 dondugunde load balancer otomatik devre disi birakir.
Graceful shutdown ve health
IHostApplicationLifetime ile shutdown basladiginda readiness false yapilir; yeni trafik kesilir, devam eden istekler tamamlanir. Kubernetes terminationGracePeriodSeconds bu sure ile uyumlu olmalidir.
ASP.NET Core ve modern C# ekosisteminde katmanli tasarım, test edilebilirlik ve operasyonel gozlemlenebilirlik birlikte dusunuldugunde uzun omurlu yazılım urunleri ortaya cikar.