Ölü ya da diri AspNetCore.HealthChecks
Tags: aspnetcore, healthcheck
Published: 2019-12-07 21:39:48

---
title: Ölü ya da diri AspNetCore.HealthChecks
published: true
date: 2019-12-04 14:50:17 UTC
tags: aspnetcore,health-check
canonical_url: https://medium.com/@brehpoint/%C3%B6l%C3%BC-ya-da-diri-aspnetcore-healthchecks-92d230c6c62c
---

![](https://cdn-images-1.medium.com/max/1024/0*IIYm3cKYc20D614d)

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

### Giriş

Bu yazı 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)

![](https://cdn-images-1.medium.com/max/700/1*_HzAMcQ5fvoibucTq9zetA.gif)

### 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](https://www.youtube.com/watch?v=kzRKGCmGbqo) izleyebilirsiniz.

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

Aktif projenin linki [https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks](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 HC 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();
}

_p_ublic 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.

![](https://cdn-images-1.medium.com/max/894/1*-hawKqQw4mMIFY_K_WYGdw.png)<figcaption>/hc</figcaption>

Ş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.

![](https://cdn-images-1.medium.com/max/609/1*BNYABHh3aAAa_5-FeqtGdw.png)

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

![](https://cdn-images-1.medium.com/max/521/1*-iFF-oOi6H1qSz9rBQt1kw.png)

### Health Check UI

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

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

![](https://cdn-images-1.medium.com/max/1024/1*nzKZeMEblTZZF_oe_FEpHQ.png)

### Ö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.

![](https://cdn-images-1.medium.com/max/781/1*5qksj1PVUEsGI7qqo79DiQ.png)

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

![](https://cdn-images-1.medium.com/max/643/1*oLbmmc8a2_uGEPFtdvrnMQ.png)<figcaption>code</figcaption>

![](https://cdn-images-1.medium.com/max/642/1*w2bXjZXH8UhNmxfYb8v11Q.png)<figcaption>appsettings</figcaption>

### 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ı

[~ ~](https://medium.com/u/a445c0d6bc51) 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.

![](https://cdn-images-1.medium.com/max/1024/1*XNpHZuBq4q-YjE8jD5BJKQ.png)<figcaption>failureStatus (Unhealthy, Degraded..)</figcaption>

![](https://cdn-images-1.medium.com/max/1024/1*mneBFsybN_67wO4Cy7a92g.png)<figcaption>docker configuration</figcaption>

İlgilenenler için docker dokümantasyonun ilgili kısmını aşağıda paylaşıyorum.

[| Docker Documentation](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.

![](https://cdn-images-1.medium.com/max/1024/1*oUY0swTuwmaf6gOaQZSTrg.png)