İçeriğe geç

Asp.Net Core Health Check Ölü ya da diri

  • Giriş
  • Nedir
  • Tanıyalım
  • Health Check
  • Health Check UI
  • Özelleştirmeler
  • Akılda Kalanlar
  • Öneriler

Giriş

Health check yazısı içerisinde basit ve sade hali ile kullandığımız ürün ve hizmetlerin durumunu sorgulayabileceğimiz bir yapıyı ne kadar kolay kurabileceğimizi birlikte deneyimlemek istiyorum.

j : Müşteriler bir kaç saattir sisteme erişimde sıkıntılar yaşıyormuş.
j: Ayrıca sistemde bir gariplik var MSSQL server çok yavaşlamış.
s : SQL Server’a bağlanabiliyor musunuz?
j : Evet bağlanabiliyoruz.
s : Sorgu atabiliyor musunuz? (bkz: sorgu atmak )
j : Evet bay s.
s : Bana hemen sp_WhoIsActive’i çağırın!!!11 (Büyük harfler ile)

Nedir

“Health Check” bizlere, 
bir uygulamanın veya sistemin sağlıklı çalışıp çalışmadığını kontrol imkanı sağlar. 
Ayrıca uygulamanın sağlık durumunu sorgulayabileceğimiz bir endpoint sunar.

Basit bir örnek ile kontrol edebilecekleriniz;

  • Uygulamanız için kulladığın bir veritabanı veya servisin durumunu
  • Uygulamanızın çalıştığı environment ile ilgili hafıza ve disk durumunu
  • Uygulamanın kendi durumunu

Bu sayede uygulamalarımıza otomatik olarak sistemin arızalı kısımlarına nasıl müdahale etmesi gerektiğini veya böyle bir durum oluştuğunda nasıl aksiyonlar alacağınızı belirtebilirsiniz.(isteğimiz)
“veya manuel olarak bir şeyler yapabilirsiniz.” (gerçeğimiz)

Basit bir örnek ile kontrol sonrası yapabileceklerimiz;

  • Kullanıcılara ya da kendinize hatalı alanları bildirebilirsiniz.
  • Hatalı kısımlara müdahale edebiliriz. (etmeyede bilirsiniz)

Tanıyalım

Burada bizlere uygulama geliştirirken kullandığımız birçok ürünün basit health check’lerini paketler halinde sunan arkadaşlara teşekkür ederek başlamak gerekir.

Hakkı teslim edelim;dotnet core içerisinde health check ile ilgili boşluğu doldurmaya çalışan arkadaşlar hakkında daha detaylı bir bilgi almak isterseniz şu videoyu izleyebilirsiniz.

Eski projenin linki 
http://github.com/xabaril/beatpulse [DEPRECATED]

Aktif projenin linki https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks

Proje sayfasına girdiğinizde göreceğiniz hazır health check’lerden bazıları

…Sql Server, MySql, Oracle, Sqlite, RavenDB, Postgres, EventStore, RabbitMQ, Elasticsearch, Redis, System: Disk Storage, Private Memory, Virtual Memory, Process, Windows, Service…

Health Check

Health Check Namespace : Microsoft.Extensions.Diagnostics.HealthChecks

Hemen namespace’i verdim çünkü bu namespace olmasa bundan sonra anlatılacakların hiç bir anlamı yok. İleride custom bir HealthCheck oluştururken ihtiyacımız olacak.

dotnet new webapi -n HealthCheck -o HealthCheck


# HealthCheck
dotnet add package Microsoft.AspNetCore.Diagnostics.HealthChecks

# UI için gerekli olacak paket
dotnet add package AspNetCore.HealthChecks.UI

# Örnek Health Check paketleri
dotnet add package AspNetCore.HealthChecks.RabbitMQ
dotnet add package AspNetCore.HealthChecks.System
dotnet add package AspNetCore.HealthChecks.Redis

Basit ayarlar

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHealthChecks("/hc");
}

En basit hali ile yukarıdaki gibi konfigüre ettiğinizde. “hc” path’inde sizi karşılayacak görüntü bu olmalıdır.

health check api endpoint

Şimdi farklı HealthCheck’ler eklemeye başlayalım.

Yeni bir kontrol eklemenin farklı birçok yolu var fakat burada yakalamanız gereken nokta en sonunda bu kontrollerin geriye bir durum döndürüyor olmasıdır.

Eğer ihtiyacınız olur ise kendi modelinizi oluşturarak status haricinde kendi modellerinizi de servis üzerinden durum kontrollerine ekleme imkanınız bulunuyor.

Basit kontrollerinizi aşağıdaki gibi ekleyebilirsiniz.

IHealthCheck interface’ini implement ederek daha karmaşık HealthCheck’ler ekleyebilirsiniz.

Health Check UI

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHealthChecks("/hc");
}
health check ui
health check ui

Özelleştirmeler

Uygulama içerisinde endpoint’leri belirlemek istediğinizde
UseHealthChecks() için path’i ayarlamanız yeterli olacaktır.
Microsoft.AspNetCore.Diagnostics.HealthChecks altındaki 
HealthCheckOptions sayesinde health report response’larını özelleştirme imkanı bulunmaktadır. Kendiniz için bir ResponseWriter oluşturabilirsiniz.

Aslında HealthChecksUI da özünde bunu gerçekleştirmektedir.

UseHealthChecksUI() için özelleştirilen endpoint’lerde kafa karıştırabilen bir nokta ApiPath ile belirttiğimiz path’in UI tarafından kullanılıyor olmasıdır.

Aslında sadece basit örneklerde belirlediğimiz “/hc” endpoint’lerinin ResponseWriter’ları ile ApiPath’in ResponseWriter’ları farklıdır.

health check konfigurasyon
health check konfigurasyon

Konfigure ederken appsettings veya direkt kod içerisinden tanımlamalar yapma şansınız bulunmaktadır.

Kod içerisinde health check konfigurasyonu
Kod içerisinde health check konfigurasyonu

appsettings içerisinde health check konfigurasyonu
appsettings içerisinde health check konfigurasyonu

Akılda Kalanlar

(+) “WebHook ile entegrasyon yapma şansı var” diyerek cümleyi devam ettirmek istedim fakat bu konuda yapılabileceklerinizi hayal gücünüze bırakıyorum.

(+) Çok hızlı bir şekilde bir UI’a sahip oluyorsunuz.

(+) Çok hızlı bir şekilde bilinen ürünler için Health Check’ler oluşturabiliyorsunuz.

(+) UI Style and branding customization (Custom bir CSS ile görüntüyü kendiniz için değiştirebiliyorsunuz.

(+) UI Kubernetes automatic services discovery özelliğine sahip

() Direkt olarak kendi UI’ı sadece internal kullanımlara uygun olduğunu düşünüyorum

İşimize nerede yaradı diye soracak olursanız. Şirket içerisinde kullandığımız ve harici servislere ihtiyaç duyan bazı ufak uygulamaların (Botlar, Devletlü Servisler, Banka Servisleri vb) sıhhat kontrollerini gerçekleştirdik.

Öneriler

Docker HEALTHCHECK ve Asp.Net HealthChecks durumlarının birlikte kullanımı

~ ~ Tarkanın Viking Kanı filmindeki dev ahtapot dostumuz işe yarar çok güzel bir kullanım örneği paylaştı bunu da eklemek istedik. (Cümlenin başındaki karakterler kendisinin mention’lı halidir 🙂 belirtmek isterim)

Bir docker container’ınız olduğunu düşünün ve bu docker container içerisinde çalışan uygulamanız için sadece bir tane kritik HealthCheck kontrolü var, diğerleri öldürmesede ciddi yaralıyor şeklinde ayarlanmış.
Bu ayarlamalar ile docker container’ına ben ölmüşsem beni yeniden yarat yaralıysam yaralarımı saracak bir şeyler yap şeklinde aksiyonlar aldırabiliyorsunuz.

failureStatus (Unhealthy, Degraded..)
failureStatus (Unhealthy, Degraded..)
docker configuration
docker configuration

İlgilenenler için docker dokümantasyonun ilgili kısmını aşağıda paylaşıyorum.
https://docs.docker.com/engine/reference/builder/#healthcheck

Slack WebHook Görüntüsünü Merak Edenler

Örnek bir api oluşturup kasıtlı hatalar yaratarak webhook mesajlarının yukarıdaki bahsettiğimiz ayarlar (gecikme süresi, sağlık durumu vb.) ile ortaya çıkan görüntüsü aşağıdaki gibidir.

Tarih:ASP.NET

İlk Yorumu Siz Yapın

Bir Cevap Yazın