﻿
{"id":24410,"date":"2022-02-13T19:57:10","date_gmt":"2022-02-13T19:57:10","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24410"},"modified":"2022-02-13T19:57:10","modified_gmt":"2022-02-13T19:57:10","slug":"asp-net-core-uygulamalarinda-health-check-ile-derinlemesine-monitoring-uygulamasi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-health-check-ile-derinlemesine-monitoring-uygulamasi\/","title":{"rendered":"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bir\u00e7o\u011fumuz uygulamalar\u0131m\u0131z\u0131n geli\u015fim s\u00fcre\u00e7lerinde olduk\u00e7a titiz davranmaya \u00e7al\u0131\u015fmakta ve yeni ihtiya\u00e7lara istinaden m\u00fcmk\u00fcn mertebe ilgili uygulaman\u0131n geli\u015fime a\u00e7\u0131k bir \u015fekilde in\u015fa edilmesine \u00f6zen g\u00f6stermekteyiz, \u00f6yle de\u011fil mi? Peki ya yay\u0131n s\u00fcre\u00e7lerinde uygulamam\u0131z\u0131n ne durumda oldu\u011funa dair neler ger\u00e7ekle\u015ftirmekteyiz? \u00c7o\u011funuzun bu soruya &#8216;log mekanizmalar\u0131&#8217; cevab\u0131n\u0131 vererek dibine kadar do\u011fru bir \u00f6neride bulundu\u011funuzu biliyorum. Evet, hakl\u0131s\u0131n\u0131z. Uygulaman\u0131n yay\u0131n s\u00fcrecinde sergiledi\u011fi davran\u0131\u015flar\u0131 derinlemesine bilgi aktar\u0131m\u0131nda bulundu\u011fumuz log mekanizmalar\u0131yla takip ederek, ad\u0131m ad\u0131m kendimize g\u00f6re metrikler olu\u015fturup nerede ne olmu\u015f rahatl\u0131kla bilebilmekteyiz. Ama bu log mekanizmalar\u0131 uygulama \u00e7al\u0131\u015ft\u0131\u011f\u0131 s\u00fcrece ge\u00e7erli olacak bir evrenin par\u00e7as\u0131 de\u011fil midir? <em>Nas\u0131l yani?\ud83e\uddd0<\/em> dedi\u011finizi duyar gibiyim. Yani demek istedi\u011fim, log mekanizmalar\u0131 uygulama \u00e7al\u0131\u015ft\u0131\u011f\u0131 s\u00fcrece bizlere takip edilebilir kay\u0131tlar sa\u011flamaktad\u0131rlar. Halbuki bir uygulaman\u0131n yay\u0131n s\u00fcrecinde ya\u015fad\u0131klar\u0131 loglar\u0131n alabilece\u011fiyle s\u0131n\u0131rl\u0131 de\u011fildir! Misal olarak; uygulama sunucusu \u00e7al\u0131\u015fm\u0131yor olabilir veya uygulaman\u0131n beslendi\u011fi veritaban\u0131 sunucusuna eri\u015fim sa\u011flanam\u0131yor da olabilir ya da kullan\u0131lan Redis yahut RabbitMQ gibi kritik sorumluluk \u00fcstlenen harici sunucularda da ar\u0131zalar s\u00f6z konusu da olabilir. B\u00f6yle durumlar uygulama a\u00e7\u0131s\u0131ndan log mekanizmas\u0131n\u0131 a\u015fan hayati bir krizle pen\u00e7ele\u015fildi\u011finin alametidir diyebiliriz. \u0130\u015fte bu durumlara istinaden, yukar\u0131larda ilk sat\u0131rlarda sordu\u011fumuz soruyu tekrar edersek e\u011fer cevap olarak uygulaman\u0131n genel sa\u011fl\u0131\u011f\u0131n\u0131 kontrol etmemizi sa\u011flayacak bir monitoring(izleme) sisteminin in\u015fa edilmesi olmazsa olmaz bir gerekliliktir diyebilir miyiz? Evet, dibine kadar deriz \ud83d\ude42 Haliyle bizler bu i\u00e7eri\u011fimizde Asp.NET Core uygulamalar\u0131nda monitoring ama\u00e7l\u0131 \u00f6zel olarak geli\u015ftirilmi\u015f olan Health Check mekanizmas\u0131na derinlemesine bak\u0131\u015f atacak ve konuyu yap\u0131sal olarak ele alabilmek i\u00e7in pratikte dockerize edilmi\u015f servisler \u00fczerinde nas\u0131l bir yakla\u015f\u0131m sergilenmesi gerekti\u011fine dair somut bir \u00f6rnek e\u015fli\u011finde seyrediyor olaca\u011f\u0131z. O halde fazla uzatmadan buyrun ba\u015flayal\u0131m&#8230;<\/p>\n<h4 style=\"color:#e83e8c;\">Neden Uygulamalar\u0131m\u0131z\u0131 Monitoring Etmeliyiz?<\/h4>\n<p>\u0130lk olarak bu sorunun cevab\u0131n\u0131 vererek ba\u015flayal\u0131m. Nas\u0131l ki insanlar, sa\u011fl\u0131k durumlar\u0131 i\u00e7in periyodik olarak doktor muayenesinden ge\u00e7iyorlarsa benzer mant\u0131kla yay\u0131n s\u00fcrecindeki yaz\u0131l\u0131mlar i\u00e7inde bu periyodik muayene kesinlikle olmazsa olmazlardand\u0131r. Nihayetinde yaz\u0131l\u0131mlar da t\u0131pk\u0131 insanlar gibi canl\u0131 bir organizmad\u0131r ve s\u00fcre\u00e7 i\u00e7erisinde farkl\u0131 sebeplerden dolay\u0131 krizler, \u00e7\u00f6k\u00fc\u015fler ve hatta \u00f6l\u00fcmler ya\u015fayabilmektedirler. Bu sebepler, bir \u00fcstteki paragrafta sayd\u0131\u011f\u0131m\u0131z birka\u00e7 hususla beraber ayriyeten kontrols\u00fcz bellek kullan\u0131m\u0131ndan do\u011fan s\u0131k\u0131nt\u0131lar, yetersiz disk alan\u0131ndan kaynakl\u0131 \u00e7\u00f6k\u00fc\u015fler vs. olabilmektedirler. \u0130\u015fte bu tarz i\u015flevselli\u011fi sonland\u0131r\u0131c\u0131 durumlar\u0131 y\u00f6netebilmek i\u00e7in \u00f6ncelikle bu durumlardan haberdar olmam\u0131z gerekmektedir. Bunun i\u00e7in ilgili yaz\u0131l\u0131mlar\u0131n ne durumda oldu\u011fu bilgisini veren api&#8217;lar olu\u015fturulmal\u0131 ve bu api&#8217;lar\u0131 dinleyerek bizlere g\u00f6rsel veri sa\u011flayan monitoring yap\u0131lar\u0131 kullan\u0131lmal\u0131d\u0131r. B\u00f6ylece anl\u0131k olarak yaz\u0131l\u0131mlar \u00fczerinde olu\u015fabilecek durumlar\u0131 daha dinamik takip edebilme ve gerekti\u011fi taktirde al\u0131nmas\u0131 gereken aksiyonlar\u0131 fazla kayba ve maliyete mahal vermeksizin alabilecek f\u0131rsat\u0131 kendimize sa\u011flam\u0131\u015f olmal\u0131y\u0131z.<\/p>\n<h4 style=\"color:#e83e8c;\">Asp.NET Core Health Check Nedir? Neden Bunu Tercih Etmeliyiz?<\/h4>\n<p>Yukar\u0131da monitoring&#8217;in \u00f6neminden bahsettik. E\u011fer ki, Asp.NET Core mimarisinde bir yaz\u0131l\u0131m yahut servis geli\u015ftiriyorsan\u0131z h\u0131zl\u0131 bir \u015fekilde Health Check \u00f6zelli\u011fiyle sa\u011fl\u0131k kontrol\u00fc yapabilece\u011finiz bir mekanizma olu\u015fturabilir ve bunu monitoring edebilirsiniz. Health Check mekanizmas\u0131, ilgili yaz\u0131l\u0131m\u0131n sa\u011fl\u0131k durumuna dair bilgi verirken bu i\u015flemi uygulamadaki i\u015f kural\u0131 gere\u011fi devreye sokulmu\u015f middleware&#8217;leri ve log mekanizmalar\u0131n\u0131 tetiklemeksizin ger\u00e7ekle\u015ftirmektedir. \u0130\u015fte bu \u00f6zellik ilgili mekanizman\u0131n etkisini kat be kat artt\u0131rmaktad\u0131r. Nihayetinde bizler bir uygulaman\u0131n ayakta olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilmek i\u00e7in herhangi bir api&#8217;sini tetikledi\u011fimizde Asp.NET Core mimarisinin pipeline&#8217;\u0131 devreye girecek ve sonu\u00e7 d\u00f6nene kadar devreye sokulmu\u015f olan t\u00fcm middleware&#8217;ler bir yandan tetiklenirken bir yandan da varsa log mekanizmas\u0131 \u00e7al\u0131\u015f\u0131p ilgili tabloya l\u00fczumsuz bir kay\u0131t eklenecektir. Oysa Asp.NET Core Health Check mekanizmas\u0131 sayesinde t\u00fcm middleware ve log yap\u0131lar\u0131 es ge\u00e7ilip direkt uygulaman\u0131n sa\u011fl\u0131\u011f\u0131 check edilecek ve duruma g\u00f6re bilgi d\u00f6nd\u00fcr\u00fclecektir. B\u00f6ylece ate\u015fi \u00e7\u0131km\u0131\u015f bir \u00e7ocu\u011fun ate\u015fini \u00f6l\u00e7mek i\u00e7in nas\u0131l ki l\u00fczumsuz yere di\u015flerini yahut kulaklar\u0131n\u0131 kontrol etmeksizin direkt ate\u015fini \u00f6l\u00e7\u00fcyorsak benzer mant\u0131kla sa\u011fl\u0131k kontrol\u00fc yap\u0131lacak yaz\u0131l\u0131m\u0131nda farkl\u0131 noktalar\u0131n\u0131 tetiklemeksizin direkt sa\u011fl\u0131k kontrol\u00fcn\u00fc nokta at\u0131\u015f sa\u011flam\u0131\u015f oluyoruz. Muazzam de\u011fil mi?<\/p>\n<h4 style=\"color:#e83e8c;\">Bir Asp.NET Core Uygulamas\u0131nda Health Check Nas\u0131l Uygulan\u0131r?<\/h4>\n<p>Bu makale i\u00e7eri\u011finin b\u00fcy\u00fck b\u00f6l\u00fcm\u00fc bu sorunun cevab\u0131n\u0131 detayland\u0131rmakla ge\u00e7ecektir. Haliyle \u015fimdi yava\u015f yava\u015f konuya pratikten giri\u015f yaparak ele almaya ba\u015flayabiliriz.<\/p>\n<p>Bir Asp.NET Core uygulamas\u0131 \u00fczerinde Health Check mekanizmas\u0131 en sade haliyle a\u015fa\u011f\u0131daki konfig\u00fcrasyonlar e\u015fli\u011finde etkinle\u015ftirilebilmektedir.<span style=\"font-size:11px;\">(Bu uygulaman\u0131n ad\u0131n\u0131 &#8216;Service1&#8217; olarak veriyorum)<\/span><\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddHealthChecks();\r\nvar app = builder.Build();\r\napp.UseHealthChecks(&quot;\/health&quot;);\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz, uygulamaya 2. sat\u0131rda oldu\u011fu gibi <code style=\"color:#9C61B9;\">AddHealthChecks<\/code> servisinin eklenmesi ve ard\u0131ndan 4. sat\u0131rda oldu\u011fu gibi <code style=\"color:#9C61B9;\">UseHealthChecks<\/code> middleware&#8217;inin tetiklenmesi yeterlidir. <code style=\"color:#9C61B9;\">UseHealthChecks<\/code> middleware&#8217;ine dikkat ederseniz e\u011fer parametre olarak &#8220;\/health&#8221; de\u011feri verilmektedir. Bu de\u011fer i\u015flevsel olarak bu uygulaman\u0131n sa\u011fl\u0131k kontrol\u00fcn\u00fc yapabilmemizi sa\u011flayacak olan health check mekanizmas\u0131n\u0131n endpoint&#8217;ini ayarlamam\u0131z\u0131 sa\u011flamaktad\u0131r ve tercihinize g\u00f6re de\u011fi\u015fkenlik g\u00f6sterebilmektedir.<\/p>\n<p>B\u00f6ylece art\u0131k bu uygulamada health check mekanizmas\u0131 aktifle\u015ftirilmi\u015ftir ve <code style=\"color:green;\">https:\/\/localhost:7188<span style=\"color:red;\">\/health<\/span><\/code> adresine yap\u0131lacak istek neticesinde ilgili yaz\u0131l\u0131m\u0131n sa\u011fl\u0131k durumuna dair bilgi d\u00f6nebilecek durumdad\u0131r.<\/p>\n<p>Uygulamay\u0131 derleyip, aya\u011fa kald\u0131rarak ilgili adrese istek g\u00f6nderdi\u011fimizde a\u015fa\u011f\u0131daki gibi &#8216;Healthy&#8217; mesaj\u0131yla kar\u015f\u0131la\u015faca\u011f\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"280\" height=\"66\" class=\"aligncenter size-full wp-image-24452\" \/><\/a>Health check neticesinde &#8216;Healthy&#8217; ile birlikte &#8216;Unhealthy&#8217; ve &#8216;Degraded&#8217; olmak \u00fczere alabilece\u011fimiz \u00fc\u00e7 farkl\u0131 durum bilgisi mevcuttur.<\/p>\n<ul>\n<li><em style=\"color:purple;\">Healthy<\/em>, yaz\u0131l\u0131m\u0131n problemsiz \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ifade eder.<\/li>\n<li><em style=\"color:purple;\">Unhealthy<\/em>, yaz\u0131l\u0131m\u0131n \u00e7al\u0131\u015fma s\u00fcrecinde baz\u0131 problemlerin var oldu\u011funu ifade eder. \u0130nceleme gerektirir.<\/li>\n<li><em style=\"color:purple;\">Degraded<\/em>, yaz\u0131l\u0131m\u0131n problemsiz ama cevap s\u00fcresinin ola\u011fandan daha fazla oldu\u011funu ifade etmektedir.<\/li>\n<\/ul>\n<p><strong>Peki bu health check mekanizmas\u0131yla sadece yaz\u0131l\u0131m\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 m\u0131 kontrol ediyoruz?<\/strong><br \/>\nTabi ki de hay\u0131r! Yaz\u0131l\u0131m\u0131n kulland\u0131\u011f\u0131 veritaban\u0131 sunucusundan tutun da Redis, RabbitMQ, EventStore ve hatta SignalR connection&#8217;\u0131na kadar akl\u0131n\u0131za gelebilecek bir\u00e7ok sunucular\u0131n sa\u011fl\u0131k durumlar\u0131n\u0131 check edebilmekteyiz. <\/p>\n<p>Bunun i\u00e7in kontrol edilecek sunucuya uygun olan paketi y\u00fcklemeniz gerekmektedir.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nInstall-Package AspNetCore.HealthChecks.System\r\nInstall-Package AspNetCore.HealthChecks.Network\r\nInstall-Package AspNetCore.HealthChecks.SqlServer\r\nInstall-Package AspNetCore.HealthChecks.MongoDb\r\nInstall-Package AspNetCore.HealthChecks.Npgsql\r\nInstall-Package AspNetCore.HealthChecks.Elasticsearch\r\nInstall-Package AspNetCore.HealthChecks.CosmosDb\r\nInstall-Package AspNetCore.HealthChecks.Solr\r\nInstall-Package AspNetCore.HealthChecks.Redis\r\nInstall-Package AspNetCore.HealthChecks.EventStore\r\nInstall-Package AspNetCore.HealthChecks.AzureStorage\r\nInstall-Package AspNetCore.HealthChecks.AzureServiceBus\r\nInstall-Package AspNetCore.HealthChecks.AzureKeyVault\r\nInstall-Package AspNetCore.HealthChecks.Azure.IoTHub\r\nInstall-Package AspNetCore.HealthChecks.MySql\r\nInstall-Package AspNetCore.HealthChecks.DocumentDb\r\nInstall-Package AspNetCore.HealthChecks.SqLite\r\nInstall-Package AspNetCore.HealthChecks.RavenDB\r\nInstall-Package AspNetCore.HealthChecks.Kafka\r\nInstall-Package AspNetCore.HealthChecks.RabbitMQ\r\nInstall-Package AspNetCore.HealthChecks.IbmMQ\r\nInstall-Package AspNetCore.HealthChecks.OpenIdConnectServer\r\nInstall-Package AspNetCore.HealthChecks.DynamoDB\r\nInstall-Package AspNetCore.HealthChecks.Oracle\r\nInstall-Package AspNetCore.HealthChecks.Uris\r\nInstall-Package AspNetCore.HealthChecks.Aws.S3\r\nInstall-Package AspNetCore.HealthChecks.Consul\r\nInstall-Package AspNetCore.HealthChecks.Hangfire\r\nInstall-Package AspNetCore.HealthChecks.SignalR\r\nInstall-Package AspNetCore.HealthChecks.Kubernetes\r\nInstall-Package AspNetCore.HealthChecks.Gcp.CloudFirestore\r\nInstall-Package AspNetCore.HealthChecks.SendGrid\r\nInstall-Package AspNetCore.HealthChecks.ArangoDb\r\nInstall-Package AspNetCore.HealthChecks.Gremlin\r\n<\/pre>\n<\/div>\n<p>Misal olarak, bizim yukar\u0131da olu\u015fturdu\u011fumuz servis varsayal\u0131m ki MS SQL ve Redis kullan\u0131yor olsun. Haliyle bunlarla ilgili paketleri uygulamaya y\u00fckledikten sonra a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fman\u0131n yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<p><span style=\"font-size:12px;\">\u0130lgili paketler : AspNetCore.HealthChecks.SqlServer, AspNetCore.HealthChecks.Redis<\/span><\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecks()\r\n    .AddSqlServer(builder.Configuration.GetConnectionString(&quot;MSSQLServer&quot;))\r\n    .AddRedis(builder.Configuration.GetConnectionString(&quot;Redis&quot;));\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code style=\"color:#9C61B9;\">AddHealthChecks<\/code> fonksiyonu \u00fczerinden <code style=\"color:#9C61B9;\">AddSqlServer<\/code> ve <code style=\"color:#9C61B9;\">AddRedis<\/code> servislerini ekleyerek health check mekanizmas\u0131nda MS SQL Server ve Redis sunucular\u0131n\u0131n da kontrol edilmesi gerekti\u011fi bildirilmi\u015ftir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-1.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"526\" height=\"109\" class=\"aligncenter size-full wp-image-24461\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-1.png 526w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-1-300x62.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-1-520x109.png 520w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/a>T\u00fcm sunucular ayaktayken &#8216;Healthy&#8217; cevab\u0131 al\u0131n\u0131rken, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-2.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"538\" height=\"115\" class=\"aligncenter size-full wp-image-24462\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-2.png 538w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-2-300x64.png 300w\" sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><\/a>herhangi birine eri\u015filmedi\u011fi taktirde &#8216;Unhealthy&#8217; cevab\u0131 al\u0131nmaktad\u0131r.<\/p>\n<p>Buradan anlayaca\u011f\u0131m\u0131z health check mekanizmas\u0131 gayet g\u00fczel bir \u015fekilde \u00e7al\u0131\u015fmaktad\u0131r.<\/p>\n<p>Ayr\u0131ca \u015funu s\u00f6ylemekte de fayda vard\u0131r ki, her bir health check ama\u00e7l\u0131 sunucu servisi eklendi\u011finde a\u015fa\u011f\u0131daki gibi name, tags, failure status vs. gibi bilgiler de desteklenebilmektedir.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecks()\r\n\r\n    .AddSqlServer(\r\n    connectionString: builder.Configuration.GetConnectionString(&quot;MSSQLServer&quot;),\r\n    healthQuery: &quot;SELECT 1&quot;,\r\n    name: &quot;MS SQL Server Check&quot;,\r\n    failureStatus: HealthStatus.Unhealthy | HealthStatus.Degraded,\r\n    tags: new string&#x5B;] { &quot;db&quot;, &quot;sql&quot;, &quot;sqlserver&quot; })\r\n\r\n    .AddRedis(\r\n    redisConnectionString: builder.Configuration.GetConnectionString(&quot;Redis&quot;),\r\n    name: &quot;Redis Check&quot;,\r\n    failureStatus: HealthStatus.Unhealthy | HealthStatus.Degraded,\r\n    tags: new string&#x5B;] { &quot;redis&quot; });\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funda oldu\u011fu gibi konfig\u00fcrasyonlar\u0131 ayarlarsak e\u011fer &#8220;\/health&#8221; adresine yap\u0131lan istek neticesinde a\u015fa\u011f\u0131daki gibi sonu\u00e7la kar\u015f\u0131la\u015f\u0131lmaktad\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-3.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"323\" height=\"467\" class=\"aligncenter size-full wp-image-24465\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-3.png 323w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-3-207x300.png 207w\" sizes=\"auto, (max-width: 323px) 100vw, 323px\" \/><\/a>Tabi bu sonucu alabilmek i\u00e7in <code style=\"color:#9C61B9;\">UseHealthChecks<\/code> middleware&#8217;ine a\u015fa\u011f\u0131daki gibi <code>HealthCheckOptions<\/code> parametresi eklenerek &#8216;ResponseWriter&#8217; property&#8217;sine <code>UIResponseWriter.WriteHealthCheckUIResponse<\/code> de\u011feri verilmelidir. Tabi burada <code>UIResponseWriter<\/code> s\u0131n\u0131f\u0131na eri\u015febilmek i\u00e7in <a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.UI.Client\/\" rel=\"noopener\" target=\"_blank\">AspNetCore.HealthChecks.UI.Client<\/a> paketinin y\u00fcklenmesi gerekti\u011fini s\u00f6ylemekte fayda vard\u0131r kanaatindeyim. <\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar app = builder.Build();\r\napp.UseHealthChecks(&quot;\/health&quot;, new HealthCheckOptions\r\n{\r\n    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse\r\n});\r\n<\/pre>\n<\/div>\n<h4 style=\"color:#e83e8c;\">Asp.NET Core Health Check UI Kullan\u0131m\u0131<\/h4>\n<p>Health check sayesinde ilgili yaz\u0131l\u0131m(lar)a dair al\u0131nan sa\u011fl\u0131k bilgilerinin sonu\u00e7lar\u0131n\u0131 depolayarak g\u00f6rselle\u015ftirilmesini sa\u011flayan haz\u0131r kullan\u0131c\u0131 aray\u00fcz\u00fc mevcuttur. Bu aray\u00fcz\u00fc kullanabilmek i\u00e7in birka\u00e7 sat\u0131r \u00f6nce bahsi ge\u00e7en <a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.UI\/\" rel=\"noopener\" target=\"_blank\">AspNetCore.HealthChecks.UI<\/a> paketinin y\u00fcklenmesi gerekmektedir. Tabi, anl\u0131k olarak g\u00f6rselli\u011fi destekleyecek verilerin bir storage&#8217;da depolanmas\u0131 gerekmektedir. Bu storage; In-Memory, Sql Server, SQLite, PostgreSQL yahut MySQL olabilir. Haliyle bu storagelar&#8217;dan ihtiyac\u0131n\u0131za binaen istedi\u011finizi a\u015fa\u011f\u0131daki k\u00fct\u00fcphanelerden kar\u015f\u0131layabilirsiniz:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.UI.InMemory.Storage\/\" rel=\"noopener\" target=\"_blank\">AspNetCore.HealthChecks.UI.InMemory.Storage<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.UI.SqlServer.Storage\/\" rel=\"noopener\" target=\"_blank\">AspNetCore.HealthChecks.UI.SqlServer.Storage<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.UI.SQLite.Storage\/\" rel=\"noopener\" target=\"_blank\">AspNetCore.HealthChecks.UI.SQLite.Storage<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.UI.PostgreSQL.Storage\/\" rel=\"noopener\" target=\"_blank\">AspNetCore.HealthChecks.UI.PostgreSQL.Storage<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.UI.MySql.Storage\/\" rel=\"noopener\" target=\"_blank\">AspNetCore.HealthChecks.UI.MySql.Storage<\/a><\/li>\n<\/ul>\n<p>\u015eimdi UI yap\u0131lanmas\u0131n\u0131 \u00f6rneklendirmeye ge\u00e7meden \u00f6nce bunun i\u00e7in ayr\u0131 bir servis olu\u015fturulmas\u0131n\u0131n best practices a\u00e7\u0131s\u0131ndan daha do\u011fru olaca\u011f\u0131n\u0131 bilmenizde fayda vard\u0131r. Nihayetinde birden fazla servisten gelecek olan sa\u011fl\u0131k bilgilerini tek bir aray\u00fcz e\u015fli\u011finde takip etmek isteyebilirsiniz, ki isteyeceksiniz de \ud83d\ude42 Bu sebepten dolay\u0131 yeni bir Asp.NET Core uygulamas\u0131 \u00fczerinden a\u015fa\u011f\u0131daki konfig\u00fcrasyonlar\u0131 sa\u011flayal\u0131m<span style=\"font-size:11px;\">(Bu uygulaman\u0131n ad\u0131n\u0131 &#8216;MonitoringService&#8217; olarak veriyorum)<\/span>:<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services\r\n    .AddHealthChecksUI(settings =&gt;\r\nsettings.AddHealthCheckEndpoint(&quot;Service 1&quot;, &quot;https:\/\/localhost:7188\/health&quot;))\r\n    .AddSqlServerStorage(connectionString: builder.Configuration.GetConnectionString(&quot;MonitoringSQLServer&quot;));\r\n\r\nvar app = builder.Build();\r\n\r\napp.UseHealthChecksUI(options =&gt; options.UIPath = &quot;\/health-ui&quot;);\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funa g\u00f6z atarsan\u0131z e\u011fer, 3 ile 6. sat\u0131r aral\u0131\u011f\u0131nda Health Check UI aray\u00fcz\u00fcn\u00fcn konfig\u00fcrasyonu yap\u0131lmaktad\u0131r. <code style=\"color:#9C61B9;\">AddHealthChecksUI<\/code> fonksiyonu ile aray\u00fcz servisi uygulamaya eklenmekte ve bu metot i\u00e7erisinde parametre olarak verilen lambda \u00fczerinden <code style=\"color:#9C61B9;\">AddHealthCheckEndpoint<\/code> fonksiyonu e\u015fli\u011finde metrikleri g\u00f6rselle\u015ftirilecek endpoint verilmektedir. Dikkat ederseniz verilen endpoint, i\u00e7eri\u011fimizin \u00f6nceki sat\u0131rlar\u0131nda olu\u015fturdu\u011fumuz servisimizin &#8220;\/health&#8221; endpoint&#8217;idir. Burada dinlenecek t\u00fcm endpoint&#8217;leri <code style=\"color:#9C61B9;\">AddHealthCheckEndpoint<\/code> metodu e\u015fli\u011finde seri bir \u015fekilde verebiliriz. Bununla ilgili sonraki sat\u0131rlar\u0131m\u0131zda \u00e7al\u0131\u015fma yap\u0131yor olaca\u011f\u0131z.<\/p>\n<p>6. sat\u0131rda ise <code style=\"color:#9C61B9;\">AddSqlServerStorage<\/code> fonksiyonu ile servislerin durumlar\u0131na dair verileri tutaca\u011f\u0131m\u0131z storage entegrasyonu ger\u00e7ekle\u015ftirilmektedir. Buradan anla\u015f\u0131ld\u0131\u011f\u0131 \u00fczere ben deniz SQL Server&#8217;\u0131 storage olarak benimsemi\u015f bulunuyorum. Sizler yukar\u0131daki sat\u0131rlarda bahsi ge\u00e7en storage&#8217;lardan istedi\u011finizi a\u015fa\u011f\u0131daki formatlarda kullanabilirsiniz.<br \/>\nIn-Memory:<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  services\r\n    .AddHealthChecksUI()\r\n    .AddInMemoryStorage();\r\n<\/pre>\n<\/div>\n<p>PostgreSQL:<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  services\r\n    .AddHealthChecksUI()\r\n    .AddPostgreSqlStorage(&quot;connectionString&quot;);\r\n<\/pre>\n<\/div>\n<p>MySQL:<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  services\r\n    .AddHealthChecksUI()\r\n    .AddMySqlStorage(&quot;connectionString&quot;);\r\n<\/pre>\n<\/div>\n<p>Sqlite:<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  services\r\n    .AddHealthChecksUI()\r\n    .AddSqliteStorage($&quot;Data Source=sqlite.db&quot;);\r\n<\/pre>\n<\/div>\n<p>Son olarak 10. sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer <code style=\"color:#9C61B9;\">UseHealthChecksUI<\/code> middleware&#8217;i \u00e7a\u011fr\u0131larak aray\u00fcz etkinle\u015ftirilmi\u015f ve &#8216;UIPath&#8217; property&#8217;si arac\u0131l\u0131\u011f\u0131yla &#8220;\/health-ui&#8221; adresinden eri\u015filebilir hale getirilmi\u015ftir.<\/p>\n<p>Velhas\u0131l&#8230; \u0130lgili uygulamay\u0131 bu vaziyette derleyip, aya\u011fa kald\u0131r\u0131rsak e\u011fer connection string&#8217;i verilen storage&#8217;a, aray\u00fcze dair verileri tutaca\u011f\u0131 veritaban\u0131 ve tablolar\u0131 direkt olarak a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi migrate edecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-4.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"276\" height=\"237\" class=\"alignleft size-full wp-image-24476\" \/><\/a>Elbet bu tablolar\u0131n neye yarad\u0131\u011f\u0131n\u0131 sonraki sat\u0131rlar\u0131m\u0131zda a\u00e7\u0131klayaca\u011f\u0131z. \u015eimdilik olu\u015fturdu\u011fumuz monitoring aray\u00fcz\u00fcn\u00fcn \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 test edelim istiyorum. Tabi bunun i\u00e7in hem &#8216;Service1&#8217; hem de &#8216;MonitoringService&#8217; aya\u011fa kald\u0131r\u0131lmal\u0131d\u0131r. Kald\u0131r\u0131ld\u0131\u011f\u0131n\u0131 varsayal\u0131m ve ard\u0131ndan &#8216;MonitoringService&#8217;in <code>https:\/\/localhost:7033\/health-ui<\/code> adresine taray\u0131c\u0131 \u00fczerinden istek g\u00f6nderip, a\u00e7al\u0131m.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-5.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"1888\" height=\"305\" class=\"aligncenter size-full wp-image-24478\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-5.png 1888w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-5-300x48.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-5-1024x165.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-5-768x124.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-5-1536x248.png 1536w\" sizes=\"auto, (max-width: 1888px) 100vw, 1888px\" \/><\/a>Bak\u0131n, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ilgili servisimiz ve kulland\u0131\u011f\u0131 sunucular gayet sa\u011fl\u0131kl\u0131.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-6.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"266\" height=\"120\" class=\"aligncenter size-full wp-image-24479\" \/><\/a>\u00c7\u00fcnk\u00fc sunucular\u0131m\u0131z gayet problemsiz \u00e7al\u0131\u015f\u0131yor. Misal, herhangi bir sunucuda s\u0131k\u0131nt\u0131 oldu\u011funu varsayarsak e\u011fer a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi uyar\u0131yla kar\u015f\u0131la\u015f\u0131lacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-7.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"261\" height=\"117\" class=\"aligncenter size-full wp-image-24480\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-8.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"1673\" height=\"257\" class=\"aligncenter size-full wp-image-24481\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-8.png 1673w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-8-300x46.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-8-1024x157.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-8-768x118.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-8-1536x236.png 1536w\" sizes=\"auto, (max-width: 1673px) 100vw, 1673px\" \/><\/a><\/p>\n<p>Tabi buradaki \u00f6rneklendirmeleri sizler paralel bir \u015fekilde icra ediyorsan\u0131z e\u011fer sunuculardaki problemlerin aray\u00fcz taraf\u0131ndan hemen alg\u0131lanmad\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. \u00c7\u00fcnk\u00fc Health Check UI mekanizmas\u0131n\u0131n servisleri yoklama s\u00fcresi default olarak 10 saniyedir. Sizler ihtiya\u00e7 do\u011frultusunda bu s\u00fcreye a\u015fa\u011f\u0131daki konfig\u00fcrasyonla m\u00fcdahale edebilirsiniz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecksUI(settings =&gt;\r\n    {\r\n        settings.AddHealthCheckEndpoint(&quot;Service 1&quot;, &quot;https:\/\/localhost:7188\/health&quot;);\r\n        settings.SetEvaluationTimeInSeconds(5);\r\n    })\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code style=\"color:#9C61B9;\">SetEvaluationTimeInSeconds<\/code> fonksiyonu ile servislerin saniye cinsinden ne kadar periyotta bir de\u011ferlendirilece\u011fi belirtilebilmektedir.<\/p>\n<p>Ayr\u0131ca servislerdeki health check adreslerine olabilecek a\u015f\u0131r\u0131 isteklerden ka\u00e7\u0131nmak i\u00e7in maksimum etkin istek say\u0131s\u0131n\u0131 a\u015fa\u011f\u0131daki gibi <code style=\"color:#9C61B9;\">SetApiMaxActiveRequests<\/code> metodu arac\u0131l\u0131\u011f\u0131yla yap\u0131land\u0131rabilirsiniz. Bu \u00f6zelli\u011fin defualt de\u011feri 3&#8217;t\u00fcr.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecksUI(settings =&gt;\r\n    {\r\n        settings.AddHealthCheckEndpoint(&quot;Service 1&quot;, &quot;https:\/\/localhost:7188\/health&quot;);\r\n        settings.SetApiMaxActiveRequests(2);\r\n    })\r\n<\/pre>\n<\/div>\n<p>Health Check UI yap\u0131lanmas\u0131n\u0131 kullan\u0131yorsak e\u011fer migration \u00f6zelli\u011fini de y\u00f6netebilmemiz gerekmektedir. Varsay\u0131lan olarak etkin olan migration yap\u0131lanmas\u0131n\u0131 yeri gelir kapatma ihtiyac\u0131 yahut iste\u011fi hissedebilirsiniz. \u0130\u015fte b\u00f6yle bir durumda a\u015fa\u011f\u0131daki iki y\u00f6ntemden birini tercih edebilirsiniz;<\/p>\n<p>1. Y\u00f6ntem:<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecksUI(settings =&gt;\r\n    {\r\n        .\r\n        .\r\n        .\r\n        settings.DisableDatabaseMigrations();\r\n    })\r\n<\/pre>\n<\/div>\n<p>Bu y\u00f6ntemde <code style=\"color:#9C61B9;\">AddHealthChecksUI<\/code> fonksiyonu i\u00e7erisinde <code style=\"color:#9C61B9;\">DisableDatabaseMigrations<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131 yeterlidir.<\/p>\n<p>2. Y\u00f6ntem;<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  &quot;HealthChecksUI&quot;: {\r\n    &quot;DisableMigrations&quot;: true\r\n  }\r\n<\/pre>\n<\/div>\n<p>Bu y\u00f6ntemde ise uygulaman\u0131n &#8216;appsettings.json&#8217; dosyas\u0131na yukar\u0131daki konfig\u00fcrasyon de\u011ferlerinin eklenmesi gerekir.<\/p>\n<p>Hangi y\u00f6ntemi kullan\u0131rsan\u0131z kullan\u0131n uygulama aya\u011fa kald\u0131r\u0131l\u0131rken migration&#8217;lar etkin olmad\u0131\u011f\u0131 i\u00e7in storage sunucusuna herhangi bir veritaban\u0131 ve tablo migrate edilmeyecektir.<\/p>\n<h4 style=\"color:#e83e8c;\">Health Check UI Veritaban\u0131 Tablolar\u0131n\u0131 \u0130nceleyelim<\/h4>\n<p>Health Check UI veritaban\u0131 tablolar\u0131n\u0131n ne oldu\u011funu izah edebilmek i\u00e7in konuyu zenginle\u015ftirebilmek ad\u0131na \u00f6ncelikle yeni bir servis ekleyelim isterim. Monitoring edilen servis say\u0131s\u0131 ne kadar fazla olursa UI veritaban\u0131ndaki tablolar\u0131n g\u00f6revini daha net g\u00f6rebilece\u011fiz kanaatindeyim. Haliyle a\u015fa\u011f\u0131daki gibi &#8216;MongoDb&#8217; ve &#8216;RabbitMQ&#8217; sunucular\u0131n\u0131 kontrol eden bir servis olu\u015ftural\u0131m<span style=\"font-size:11px;\">(Bu uygulaman\u0131n ad\u0131n\u0131 &#8216;Service2&#8217; olarak veriyorum)<\/span><\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing HealthChecks.UI.Client;\r\nusing Microsoft.AspNetCore.Diagnostics.HealthChecks;\r\nusing Microsoft.Extensions.Diagnostics.HealthChecks;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services\r\n    .AddHealthChecks()\r\n\r\n    .AddMongoDb(\r\n    mongodbConnectionString: &quot;mongodb:\/\/localhost:27017&quot;,\r\n    name: &quot;Mongo Db Check&quot;,\r\n    failureStatus: HealthStatus.Unhealthy | HealthStatus.Degraded,\r\n    tags: new string&#x5B;] { &quot;mongodb&quot; })\r\n\r\n    .AddRabbitMQ(\r\n    rabbitConnectionString: &quot;amqp:\/\/admin:123456@localhost:5672&quot;,\r\n    name: &quot;RabbitMQ Check&quot;,\r\n    failureStatus: HealthStatus.Unhealthy | HealthStatus.Degraded,\r\n    tags: new string&#x5B;] { &quot;rabbitmq&quot; });\r\n\r\nvar app = builder.Build();\r\n\r\napp.UseHealthChecks(&quot;\/health&quot;, new HealthCheckOptions\r\n{\r\n    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse\r\n});\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan bu servisinde endpoint&#8217;ini &#8216;MonitoringService&#8217;e a\u015fa\u011f\u0131daki gibi ekleyelim.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecksUI(settings =&gt;\r\n    {\r\n        settings.AddHealthCheckEndpoint(&quot;Service 1&quot;, &quot;https:\/\/localhost:7188\/health&quot;);\r\n        settings.AddHealthCheckEndpoint(&quot;Service 2&quot;, &quot;https:\/\/localhost:7169\/health&quot;);\r\n    })\r\n<\/pre>\n<\/div>\n<p>Yap\u0131lan konfig\u00fcrasyonlar neticesinde aray\u00fcz\u00fcm\u00fcz\u00fcn son durumu a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-9.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"1674\" height=\"362\" class=\"aligncenter size-full wp-image-24488\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-9.png 1674w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-9-300x65.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-9-1024x221.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-9-768x166.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-9-1536x332.png 1536w\" sizes=\"auto, (max-width: 1674px) 100vw, 1674px\" \/><\/a>\u015eimdi Health Check UI&#8217;\u0131n veritaban\u0131ndaki tablolar\u0131n\u0131n davran\u0131\u015flar\u0131n\u0131 daha rahat g\u00f6zlemleyebiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-10.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"240\" height=\"87\" class=\"aligncenter size-full wp-image-24491\" \/><\/a><\/p>\n<ul>\n<li><strong style=\"purple\"><em>Configurations Tablosu<\/em><\/strong><br \/>\n<table>\n<thead>\n<tr>\n<th>Tasar\u0131m\u0131<\/th>\n<th>\u0130\u015flevi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"vertical-align: top\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"248\" height=\"92\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-11.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" class=\"aligncenter size-full wp-image-24494\" \/><\/a><\/td>\n<td style=\"text-align:left;\">Health Check UI&#8217;\u0131n sa\u011fl\u0131k kontrol\u00fc ama\u00e7l\u0131 t\u00fcketti\u011fi servislere dair bilgileri tutan tablodur.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-12.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"365\" height=\"56\" class=\"aligncenter size-full wp-image-24496\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-12.png 365w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-12-300x46.png 300w\" sizes=\"auto, (max-width: 365px) 100vw, 365px\" \/><\/a>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li><strong style=\"purple\"><em>Executions Tablosu<\/em><\/strong><br \/>\n<table>\n<thead>\n<tr>\n<th>Tasar\u0131m\u0131<\/th>\n<th>\u0130\u015flevi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"vertical-align: top\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-13.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-13.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"239\" height=\"146\" class=\"aligncenter size-full wp-image-24498\" \/><\/a><\/td>\n<td style=\"text-align:left;\">Servislerin hangi tarihten itibaren ve son olarak ne zaman sa\u011fl\u0131k durumlar\u0131n\u0131n kontrol edildi\u011fini tutan tablodur.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-14.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-14.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"732\" height=\"52\" class=\"aligncenter size-full wp-image-24499\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-14.png 732w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-14-300x21.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-14-720x52.png 720w\" sizes=\"auto, (max-width: 732px) 100vw, 732px\" \/><\/a><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li><strong style=\"purple\"><em>Failures Tablosu<\/em><\/strong><br \/>\n<table>\n<thead>\n<tr>\n<th>Tasar\u0131m\u0131<\/th>\n<th>\u0130\u015flevi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"vertical-align: top\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-15.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-15.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"273\" height=\"90\" class=\"aligncenter size-full wp-image-24501\" \/><\/a><\/td>\n<td style=\"text-align:left;\">Sa\u011fl\u0131k durumunda problem olan servis bilgilerini tutan tablodur. Dikkat edilmesi gereken nokta hatan\u0131n kayna\u011f\u0131 ne olursa olsun sadece servis bilgilerini tutmaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-16.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-16.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"415\" height=\"34\" class=\"aligncenter size-full wp-image-24504\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-16.png 415w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-16-300x25.png 300w\" sizes=\"auto, (max-width: 415px) 100vw, 415px\" \/><\/a>Misal olarak, &#8216;Service 2&#8217;nin kulland\u0131\u011f\u0131 &#8216;RabbitMQ&#8217; sunucusuna eri\u015fim kapat\u0131ld\u0131\u011f\u0131 taktirde &#8216;Failures&#8217; tablosuna &#8216;Service 2&#8217;de bir hata oldu\u011funa dair yukar\u0131daki gibi kay\u0131t d\u00fc\u015fecektir.<\/p>\n<p>Servis&#8217;te ki problem \u00e7\u00f6z\u00fcld\u00fc\u011f\u00fc taktirde ilgili servise dair &#8216;IsUpAndRunning&#8217; kolonu &#8216;1&#8217; de\u011ferinde olacak \u015fekilde servisin tam olarak \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ifade eden bir kay\u0131t d\u00fc\u015f\u00fclecektir.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li><strong style=\"purple\"><em>HealthCheckExecutionEntries Tablosu<\/em><\/strong><br \/>\n<table>\n<thead>\n<tr>\n<th>Tasar\u0131m\u0131<\/th>\n<th>\u0130\u015flevi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"vertical-align: top\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-17.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-17.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"243\" height=\"145\" class=\"aligncenter size-full wp-image-24505\" \/><\/a><\/td>\n<td style=\"text-align:left;\">Servislerde sa\u011fl\u0131k kontrol\u00fc yap\u0131lan sunucular\u0131 ve bilgilerini tutan tablodur.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-18.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-18.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"651\" height=\"92\" class=\"aligncenter size-full wp-image-24507\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-18.png 651w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-18-300x42.png 300w\" sizes=\"auto, (max-width: 651px) 100vw, 651px\" \/><\/a>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li><strong style=\"purple\"><em>HealthCheckExecutionHistories Tablosu<\/em><\/strong><br \/>\n<table>\n<thead>\n<tr>\n<th>Tasar\u0131m\u0131<\/th>\n<th>\u0130\u015flevi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"vertical-align: top\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-19.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-19.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"245\" height=\"126\" class=\"aligncenter size-full wp-image-24509\" \/><\/a><\/td>\n<td style=\"text-align:left;\">Servislerde sa\u011fl\u0131k kontrol\u00fc yap\u0131lan sunuculardaki olas\u0131 hatalar\u0131n kayd\u0131n\u0131 tutan tablodur.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-20.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-20.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"757\" height=\"107\" class=\"aligncenter size-full wp-image-24510\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-20.png 757w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-20-300x42.png 300w\" sizes=\"auto, (max-width: 757px) 100vw, 757px\" \/><\/a>Sunuculardaki problem \u00e7\u00f6z\u00fcld\u00fc\u011f\u00fc taktirde ilgili sunucuya ait &#8216;Status&#8217; de\u011feri &#8216;2&#8217; olan ve &#8216;Description&#8217;\u0131 &#8216;NULL&#8217; olan ve b\u00f6ylece \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ifade eden yeni bir kay\u0131t at\u0131lmaktad\u0131r.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<h4 style=\"color:#e83e8c;\">Health Check Ge\u00e7mi\u015f Zaman \u00c7izelgesi<\/h4>\n<p>Health Check UI, sa\u011fl\u0131k kontrol\u00fc yap\u0131lan sunucular\u0131n ge\u00e7mi\u015f sa\u011fl\u0131k zaman \u00e7izelgelerini sunmaktad\u0131r. Bunun i\u00e7in ilgili sayfada &#8216;Details&#8217; butonuna t\u0131klanmas\u0131 yeterlidir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-21.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-21.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"279\" height=\"550\" class=\"alignleft size-full wp-image-24514\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-21.png 279w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-21-152x300.png 152w\" sizes=\"auto, (max-width: 279px) 100vw, 279px\" \/><\/a><br \/>\nMisal olarak; &#8216;Service 2&#8217;nin kullanm\u0131\u015f oldu\u011fu &#8216;RabbitMQ&#8217; sunucusunun zaman \u00e7izelgesini g\u00f6r\u00fcnt\u00fcledi\u011fimizde yandaki gibi bir g\u00f6r\u00fcnt\u00fcyle kar\u015f\u0131la\u015f\u0131lmaktad\u0131r. Haliyle bu hizmet sayesinde bizler servis ve sunucular\u0131m\u0131z\u0131n ge\u00e7mi\u015fine dair teferruatl\u0131 bilgiler alabilmekte ve ne zaman, hangi tarihte ne gibi problemler ya\u015fay\u0131p tekrardan \u00e7\u00f6z\u00fcm getirildi\u011fini g\u00f6rebilmekteyiz.<\/p>\n<p>Esas\u0131nda bu zaman \u00e7izelgesindeki verilerin, veritaban\u0131ndaki &#8216;HealthCheckExecutionHistories&#8217; tablosundan geldi\u011finin fark\u0131ndas\u0131n\u0131zd\u0131r. Dolay\u0131s\u0131yla bir sunucu ge\u00e7mi\u015fine dair herhangi bir veriyi temizlemek veritaban\u0131na manuel m\u00fcdahale yap\u0131lmad\u0131\u011f\u0131 s\u00fcrece fiziksel olarak m\u00fcmk\u00fcn de\u011fildir. Bu sebepten dolay\u0131 aray\u00fczde g\u00f6sterilecek maksimum ge\u00e7mi\u015f bilgilerini s\u0131n\u0131rland\u0131rmak i\u00e7in a\u015fa\u011f\u0131daki konfig\u00fcrasyonu kullanabilirsiniz:<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecksUI(settings =&gt;\r\n    {\r\n        .\r\n        .\r\n        .\r\n        settings.MaximumHistoryEntriesPerEndpoint(5);\r\n    })\r\n<\/pre>\n<\/div>\n<p><code style=\"color:#9C61B9;\">MaximumHistoryEntriesPerEndpoint<\/code> fonksiyonu sayesinde ge\u00e7mi\u015f zaman \u00e7izelgesinden gelecek veriyi s\u0131n\u0131rland\u0131rabilirsiniz.<\/p>\n<h4 style=\"color:#e83e8c;\">Konfig\u00fcrasyonlar\u0131 appsettings.json Dosyas\u0131na Ta\u015f\u0131nmas\u0131<\/h4>\n<p>\u015euana kadar anlat\u0131lan t\u00fcm konfig\u00fcrasyonlar kodun i\u00e7erisinden ger\u00e7ekle\u015ftirildi\u011fi gibi &#8216;appsettings.json&#8217; \u00fczerinden de a\u015fa\u011f\u0131daki formatla sa\u011flanabilmektedir.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  .\r\n  .\r\n  .\r\n  &quot;HealthChecksUI&quot;: {\r\n    &quot;HealthChecks&quot;: &#x5B;\r\n      {\r\n        &quot;Name&quot;: &quot;Service 1&quot;,\r\n        &quot;Uri&quot;: &quot;https:\/\/localhost:7188\/health&quot;\r\n      },\r\n      {\r\n        &quot;Name&quot;: &quot;Service 2&quot;,\r\n        &quot;Uri&quot;: &quot;https:\/\/localhost:7169\/health&quot;\r\n      },\r\n      {\r\n        &quot;Name&quot;: &quot;Service 3&quot;,\r\n        &quot;Uri&quot;: &quot;...&quot;\r\n      }\r\n    ],\r\n    &quot;Webhooks&quot;: &#x5B;\r\n      {\r\n        &quot;Name&quot;: &quot;&quot;,\r\n        &quot;Uri&quot;: &quot;&quot;,\r\n        &quot;Payload&quot;: &quot;&quot;,\r\n        &quot;RestoredPayload&quot;: &quot;&quot;\r\n      }\r\n    ],\r\n    &quot;EvaluationTimeInSeconds&quot;: 5,\r\n    &quot;MinimumSecondsBetweenFailureNotifications&quot;: 60\r\n  }\r\n  .\r\n  .\r\n  .\r\n}\r\n<\/pre>\n<\/div>\n<p>Yap\u0131land\u0131rma s\u00fcrecini &#8216;appsettings.json&#8217; \u00fczerinden y\u00f6netmeyi tercih etmenizi \u00f6neririm. Hem daha dinamik hem de best practices a\u00e7\u0131s\u0131ndan daha elveri\u015flidir.<\/p>\n<h4 style=\"color:#e83e8c;\">Health Check UI Tasar\u0131m \u00d6zelle\u015ftirmesi<\/h4>\n<p>Default gelen tasar\u0131m\u0131 pek be\u011fenmemi\u015f olabilir ya da i\u00e7 a\u00e7\u0131c\u0131 bulamayabilirsiniz. Bu durumda a\u015fa\u011f\u0131daki formatta bir css dosyas\u0131 haz\u0131rlay\u0131p belirtilen \u015fekilde yap\u0131land\u0131rmayla tasar\u0131m\u0131 customize edebilirsiniz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n:root {\r\n    --primaryColor: #68217a;\r\n    --secondaryColor: #f4f4f4;\r\n    --bgMenuActive: #8e47a0;\r\n    --bgButton: #68217a;\r\n    --logoImageUrl: url('https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/e\/e3\/.NET_Foundation_Logo.svg\/1200px-.NET_Foundation_Logo.svg.png');\r\n    --bgAside: var(--primaryColor);\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.UseHealthChecksUI(options =&gt;\r\n{\r\n    options.UIPath = &quot;\/health-ui&quot;;\r\n    options.AddCustomStylesheet(&quot;dotnet.css&quot;);\r\n});\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-22.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-22.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"926\" height=\"324\" class=\"aligncenter size-full wp-image-24519\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-22.png 926w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-22-300x105.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-22-768x269.png 768w\" sizes=\"auto, (max-width: 926px) 100vw, 926px\" \/><\/a><\/p>\n<h4 style=\"color:#e83e8c;\">HttpClient Nesnesinin Yap\u0131land\u0131r\u0131lmas\u0131<\/h4>\n<p>Health Check UI mekanizmas\u0131, servislerin sa\u011fl\u0131k durumlar\u0131n\u0131 kontrol edebilmek i\u00e7in saniye cinsinden belirtilen periyotta bir servis endpoint&#8217;lerine Http iste\u011fi g\u00f6ndermektedir. Bazen, health check yaparken kimlik do\u011frulama vs. gibi i\u015flemlerin yap\u0131lmas\u0131 gerekebilir. \u0130\u015fte b\u00f6yle durumlar i\u00e7in arkaplanda kullan\u0131lan HttpClient nesnesini a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131rabilirsiniz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecksUI(settings =&gt;\r\n    {\r\n        settings.ConfigureApiEndpointHttpclient((serviceProvider, httpClient) =&gt;\r\n        {\r\n            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(&quot;Bearer&quot;, &quot;...&quot;);\r\n        })\r\n        .ConfigureWebhooksEndpointHttpclient((serviceProvider, httpClient) =&gt;\r\n        {\r\n            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(&quot;Bearer&quot;, &quot;...&quot;);\r\n        });\r\n    })\r\n<\/pre>\n<\/div>\n<h4 style=\"color:#e83e8c;\">Health Check Verilerini Yap\u0131land\u0131r\u0131lm\u0131\u015f T\u00fcketicilere G\u00f6ndermek<\/h4>\n<p>Health Check mekanizmas\u0131, toplayabildi\u011fi verileri Application Insights, Datadog, Prometheus ve Seq gibi yap\u0131land\u0131r\u0131lm\u0131\u015f veri g\u00f6rselle\u015ftirici t\u00fcketicilere g\u00f6nderebilece\u011fi bir push modeli i\u00e7ermektedir. Bunun i\u00e7in ilgili t\u00fcketiciye \u00f6zel a\u015fa\u011f\u0131daki paketlerden herhangi birinin veya birilerinin projeye y\u00fcklenmesi gerekmektedir.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.Publisher.ApplicationInsights\/\" rel=\"noopener\" target=\"_blank\">AspNetcore.HealthChecks.Publisher.ApplicationInsights<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.Publisher.Datadog\/\" rel=\"noopener\" target=\"_blank\">AspNetcore.HealthChecks.Publisher.Datadog<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.Publisher.Prometheus\/\" rel=\"noopener\" target=\"_blank\">AspNetcore.HealthChecks.Publisher.Prometheus<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCore.HealthChecks.Publisher.Seq\/\" rel=\"noopener\" target=\"_blank\">AspNetcore.HealthChecks.Publisher.Seq<\/a><\/li>\n<\/ul>\n<p>Misal olarak; &#8216;Service 1&#8217;de &#8216;Redis&#8217; sucunusunun hata ald\u0131\u011f\u0131n\u0131 varsayarsak bunu &#8216;Seq&#8217; sunucusuna a\u015fa\u011f\u0131daki gibi g\u00f6nderebilir ve veriyi g\u00f6rselle\u015ftirebiliriz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services\r\n    .AddHealthChecks()\r\n    .AddSqlServer(...)\r\n    .AddRedis(...)\r\n    .AddSeqPublisher(options =&gt;\r\n    {\r\n        options.ApiKey = &quot;vruCdRqaQUT4CeRXEJMw&quot;;\r\n        options.Endpoint = &quot;http:\/\/localhost:5341&quot;;\r\n        options.DefaultInputLevel = HealthChecks.Publisher.Seq.SeqInputLevel.Information;\r\n    }, &quot;Service 1&quot;));\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-23.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-23.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Health Check \u0130le Derinlemesine Monitoring Uygulamas\u0131\" width=\"1906\" height=\"990\" class=\"aligncenter size-full wp-image-24523\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-23.png 1906w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-23-300x156.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-23-1024x532.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-23-768x399.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/02\/Asp.NET-Core-Uygulamalarinda-Health-Check-Ile-Derinlemesine-Monitoring-Uygulamasi-23-1536x798.png 1536w\" sizes=\"auto, (max-width: 1906px) 100vw, 1906px\" \/><\/a><\/p>\n<p>Nihai olarak;<br \/>\nGeli\u015ftirilen yaz\u0131l\u0131mlar\u0131m\u0131z\u0131n yay\u0131n s\u00fcre\u00e7lerindeki davran\u0131\u015flar\u0131n\u0131, t\u0131pk\u0131 \u00e7ocuklar\u0131m\u0131z\u0131n oyun park\u0131ndaki durumlar\u0131 gibi g\u00f6z\u00fcm\u00fcz\u00fc ay\u0131rmaks\u0131z\u0131n izlemeli ve gerekti\u011fi taktirde anl\u0131k m\u00fcdahalede bulunabilir bir \u015fekilde teyakkuzda olmal\u0131y\u0131z \ud83d\ude42 Aksi taktirde gecikilmi\u015f olas\u0131 problemlere kar\u015f\u0131 bizleri maliyeti bol durumlar bekliyor olabilir.<\/p>\n<p>Ve b\u00f6ylece uzun ve me\u015fakkatli olan bir yaz\u0131m\u0131z\u0131n daha sonuna gelmi\u015f bulunmaktay\u0131z. Sabredip okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131m\u0131zda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bir\u00e7o\u011fumuz uygulamalar\u0131m\u0131z\u0131n geli\u015fim s\u00fcre\u00e7lerinde olduk\u00e7a titiz davranmaya \u00e7al\u0131\u015fmakta ve yeni ihtiya\u00e7lara istinaden m\u00fcmk\u00fcn mertebe ilgili uygulaman\u0131n geli\u015fime a\u00e7\u0131k bir \u015fekilde in\u015fa edilmesine \u00f6zen g\u00f6stermekteyiz, \u00f6yle de\u011fil mi? Peki ya yay\u0131n s\u00fcre\u00e7lerinde uygulamam\u0131z\u0131n ne&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":24529,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3102,4443],"tags":[4520,4516,4519,4518,4517,4521],"class_list":["post-24410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core","category-asp-net-core-6-0","tag-addhealthchecks","tag-asp-net-core-health-check","tag-asp-net-core-health-check-monitoring","tag-asp-net-core-monitoring","tag-health-check","tag-usehealthchecks"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=24410"}],"version-history":[{"count":93,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24410\/revisions"}],"predecessor-version":[{"id":24530,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24410\/revisions\/24530"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/24529"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}