﻿
{"id":26389,"date":"2023-07-04T10:22:34","date_gmt":"2023-07-04T10:22:34","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26389"},"modified":"2023-07-04T10:22:34","modified_gmt":"2023-07-04T10:22:34","slug":"distributed-sistemlerde-traceability-derinlemesine-inceleme-asp-net-core-app-console-app-nlog","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/distributed-sistemlerde-traceability-derinlemesine-inceleme-asp-net-core-app-console-app-nlog\/","title":{"rendered":"Distributed Sistemlerde Traceability &#8211; Derinlemesine \u0130nceleme | Asp.NET Core App. | Console App. | NLog"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>G\u00fcn\u00fcm\u00fczdeki yaz\u0131l\u0131m yakla\u015f\u0131mlar\u0131ndaki en g\u00f6zde parametreler; performans, y\u00fcksek kullan\u0131labilirlik, \u00f6l\u00e7eklenebilirlik ve g\u00fcvenirliktir diyebiliriz. Hal b\u00f6yleyken, bu parametreleri mevcut kaynaklar\u0131m\u0131z do\u011frultusunda en ideal hale getirebilmek i\u00e7in do\u011fru bir mimari tasar\u0131m\u0131na ihtiya\u00e7 duyulmakta ve art\u0131k g\u00fcn\u00fcn tercihi olarak distributed(da\u011f\u0131t\u0131lm\u0131\u015f) sistemlerin in\u015fa edilmeleri mevzu bahis olmaktad\u0131r. Distributed sistemlerin; in\u015fa, tasar\u0131m ve senkronizasyon bedelleri ister istemez monolitik sistemlere nazaran daha maliyetli olabilmekte ve bu maliyet do\u011fal olarak in\u015fa edilmi\u015f olan da\u011f\u0131t\u0131k sistemlerin izlenebilirli\u011fini esas unsur olarak yorumlamam\u0131z\u0131 sa\u011flamakla birlikte m\u00fchim bir konuma getirmektedir. \u0130\u015fte bu noktada da distributed sistemlerde <em>Traceability<\/em> kavram\u0131 \u00f6n plana \u00e7\u0131kmaktad\u0131r. Bizler bu i\u00e7eri\u011fimizde da\u011f\u0131t\u0131k sistemlerde <em>Traceability<\/em> kavram\u0131n\u0131 teorik olarak ele alacak ve biryandan da yayg\u0131n olarak kullan\u0131lan bir y\u00f6ntem olan Correlation Id(\u0130li\u015fkilendirme Kimli\u011fi) \u00fczerinden de bir \u00e7al\u0131\u015fmay\u0131 pratiksel a\u00e7\u0131dan tecr\u00fcbe ediyor olaca\u011f\u0131z. O halde buyurun ba\u015flayal\u0131m&#8230;<\/p>\n<h3>Traceability(\u0130zlenebilirlik) Nedir?<\/h3>\n<p>Bir distributed sistemdeki bile\u015fenlerin, gereksinim do\u011frultusundaki unsurlar\u0131n ve genel anlamda uygulanan tasar\u0131m\u0131n izlenebilirli\u011fini yahut geri takibini ifade eden bir kavramd\u0131r. Traceability sayesinde, gereksinimler do\u011frultusunda geli\u015ftirilen bile\u015fenlerin ne kadar amac\u0131na uygun bir \u015fekilde in\u015fa edildi\u011fini anlayabilmekte ve sistemdeki olas\u0131 de\u011fi\u015fikliklerin etkilerini belirleyebilmekteyiz. B\u00f6ylece sistemde meydana gelen hatalar\u0131 tespit edebilmekte ve de\u011fi\u015fikliklerin nedenlerini daha rahat analiz edebilmekteyiz ve uzun laf\u0131n k\u0131sas\u0131 t\u00fcm bu s\u00fcre\u00e7 neticesinde nihai olarak in\u015fa edilmi\u015f olan sistemi daha iyi anlayabilmekteyiz.<\/p>\n<blockquote><p><em style=\"color:green;\">Traceability, bir i\u015flemin yahut veri par\u00e7as\u0131n\u0131n kayna\u011f\u0131ndan hedefine kadar t\u00fcm a\u015famalarda ge\u00e7ti\u011fi yolun takip edilmesi, g\u00f6zlenmesidir.<\/em><\/p><\/blockquote>\n<p>Traceability sayesinde, distributed sistemdeki i\u015flemler ve veriler t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca kay\u0131t alt\u0131na al\u0131narak, takip edilmekte ve do\u011frulanmaktad\u0131r. Bu s\u00fcre\u00e7te, ilgili i\u015flemlerin nerede ba\u015flad\u0131\u011f\u0131, hangi bile\u015fenler veya hizmetler \u00fczerinden i\u015flevler y\u00fcr\u00fctt\u00fc\u011f\u00fc ve nihai olarak hangi hedefe ula\u015ft\u0131\u011f\u0131 net bir \u015fekilde belirlenebilmektedir.<\/p>\n<p>\u015eimdi <em><strong>&#8216;la hoca, burada s\u00f6ylemeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n \u015fey loglama m\u0131 la allahisen?&#8217;<\/strong><\/em> dedi\u011finizi duyar gibiyim&#8230; Evet, bu tarz bir a\u00e7\u0131klama e\u015fli\u011finde akla direkt loglama yap\u0131s\u0131n\u0131n gelmesi olduk\u00e7a do\u011fald\u0131r. Amma velakin traceability ile kastedilen log de\u011fildir. \u015eimdi gelin bunun mukayesesini yaparak devam edelim&#8230;<\/p>\n<h5>Traceability ile Log Aras\u0131ndaki Fark Nedir?<\/h5>\n<p>Traceability ile log, birbirini tamamlayan lakin farkl\u0131 olan kavramlard\u0131r. Bu ikisi aras\u0131ndaki temel farklar\u0131 &#8216;Kapsam ve Ama\u00e7&#8217;, &#8216;\u0130\u00e7erik&#8217; ve &#8216;Kullan\u0131m Amac\u0131&#8217; a\u00e7\u0131s\u0131ndan a\u015fa\u011f\u0131daki gibi de\u011ferlendirelim;<\/p>\n<table style=\"font-size:12px;\">\n<thead>\n<tr>\n<th><\/th>\n<th>Traceability<\/th>\n<th>Log<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Kapsam ve Ama\u00e7<\/strong><\/td>\n<td>Traceability, <u>bir i\u015flemin veya veri par\u00e7as\u0131n\u0131n kayna\u011f\u0131ndan hedefine kadar ge\u00e7ti\u011fi yolun takip edilebilmesini sa\u011flamak i\u00e7in kullan\u0131lan bir kavramd\u0131r.<\/u> Ama\u00e7, i\u015flemin veya verinin ge\u00e7ti\u011fi bile\u015fenleri, hizmetleri veya sistemleri izlemek ve takip etmektir. Genellikle; g\u00fcvenlik, sorun giderme, uyumluluk ve performans analizi gibi ama\u00e7larla kullan\u0131l\u0131r.<\/td>\n<td>Loglar ise, <u>bir sistemin veya uygulaman\u0131n faaliyetlerini kaydetmek i\u00e7in kullan\u0131lan kay\u0131tlard\u0131r.<\/u> Sistemde ger\u00e7ekle\u015fen olaylar\u0131, hatalar\u0131, uyar\u0131lar\u0131, kullan\u0131c\u0131 etkile\u015fimlerini ve di\u011fer \u00f6nemli bilgileri kaydetmek amac\u0131yla olu\u015fturulur. Loglar genellikle; sistem durumunu anlamak, sorunlar\u0131 tespit etmek ve gidermek ve hatalar\u0131 izlemek i\u00e7in kullan\u0131l\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0130\u00e7erik<\/strong><\/td>\n<td>Traceability, <u>genellikle bir i\u015flemin veya veri par\u00e7as\u0131n\u0131n ge\u00e7ti\u011fi bile\u015fenlerin yahut hizmetlerin tan\u0131mland\u0131\u011f\u0131 ili\u015fkilendirme verilerini i\u00e7erir.<\/u> Bu veriler; i\u015flemin kayna\u011f\u0131, hedefi, ara bile\u015fenler, kullan\u0131lan protokoller, zaman damgalar\u0131(timestamp) vb. gibi bilgileri i\u00e7erebilir.<\/p>\n<blockquote><p><em style=\"color:orange;\">Traceability, i\u015flemin ge\u00e7ti\u011fi yolun\/s\u00fcrecin izlenmesini sa\u011flamak i\u00e7in kapsaml\u0131 bir bak\u0131\u015f sunar&#8230;<\/em><\/p><\/blockquote>\n<\/td>\n<td>Loglar ise, <u>kaydedilen olaylar\u0131n ayr\u0131nt\u0131lar\u0131n\u0131 i\u00e7erir.<\/u> Bu olaylar; i\u015flemler, hatalar, uyar\u0131lar, kullan\u0131c\u0131 etkile\u015fimleri ve di\u011fer \u00f6nemli bilgiler olabilir. Loglar, sistemde ger\u00e7ekle\u015fen olaylar\u0131n ayr\u0131nt\u0131l\u0131 bir kayd\u0131n\u0131 tutar ve belirli bir olay\u0131n ger\u00e7ekle\u015fti\u011fi zamana, i\u00e7eri\u011fe ve di\u011fer ilgili verilere sahip olmay\u0131 sa\u011flar.<\/td>\n<\/tr>\n<tr>\n<td><strong>Kullan\u0131m Amac\u0131<\/strong><\/td>\n<td>Traceability&#8217;de sistemin genel i\u015fleyini anlamak, verilerin kayna\u011f\u0131ndan hedefine olan yolunu takip ederek\/g\u00f6zlemleyerek sistem performans\u0131n\u0131 analiz etmek esast\u0131r. Bu y\u00fczden genellikle; sistem tasar\u0131m\u0131, g\u00fcvenlik analizi, sorun giderme ve iyile\u015ftirme s\u00fcre\u00e7lerinde hesaba kat\u0131l\u0131r.<\/td>\n<td>\nLoglar&#8217;da ki temel gaye ise sistemdeki olaylar\u0131\/davran\u0131\u015flar\u0131 kaydetmek ve sistemin \u00e7al\u0131\u015fma s\u00fcrecindeki hata ve uyar\u0131lar gibi reflekslerini tespit maksad\u0131yla takip etmektir. B\u00f6ylece loglar&#8217;daki temel amac\u0131n, sorunlar\u0131n izlenmesi ve giderilmesi oldu\u011funu s\u00f6yleyebiliriz. Log verileri sistem y\u00f6neticileri, geli\u015ftiriciler ve di\u011fer yetkililer taraf\u0131ndan eri\u015filebilir, bu eri\u015fim neticesinde yorumlanarak sistem durumu, sorunlar\u0131 ve sistemin performans\u0131 hakk\u0131nda bilgi edinilebilir.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u00d6zet olarak; traceability, bir i\u015flemin veya veri par\u00e7as\u0131n\u0131n i\u015fleni\u015f yolunu izlemek ve takip etmek s\u00f6z konusuyken, logda ise sistemin veya uygulaman\u0131n faaliyetlerini kaydetmek ve sistem durumuyla ilgili bilgiler sa\u011flamak temel gayedir. \u0130\u015fte aralar\u0131ndaki temel fark bunlardan ibarettir.<\/p>\n<p>\u015eimdi de traceability ile log aras\u0131ndaki fark\u0131 \u00f6rnek bir senaryo \u00fczerinden ele alarak daha da netle\u015ftirmeye \u00e7al\u0131\u015fal\u0131m;<\/p>\n<div style=\"color:blue;text-align:center;font-size:12px;\">\n<em>\u00d6rnek Senaryo<\/em><br \/>\nBir e-ticaret platformunda, kullan\u0131c\u0131 taraf\u0131ndan herhangi bir \u00fcr\u00fcn sipari\u015f verildi\u011finde, bu sipari\u015fin i\u015flenmesi ve teslimat s\u00fcreci \u00e7e\u015fitli bile\u015fenler ve hizmetler aras\u0131nda ger\u00e7ekle\u015fecektir. Bu s\u00fcre\u00e7te traceability ve loglar a\u015fa\u011f\u0131daki gibi \u015fekillenecektir;<\/p>\n<table style=\"color:black;font-size:12px;\">\n<thead>\n<tr>\n<th style=\"width:50%;\">Traceability<\/th>\n<th>Log<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left;vertical-align: top;\">\n<ol>\n<li>Kullan\u0131c\u0131dan sipari\u015f al\u0131n\u0131r ve sipari\u015f y\u00f6netim servisine y\u00f6nlendirilir.<\/li>\n<li>Burada sipari\u015f kayna\u011f\u0131(kullan\u0131c\u0131), hedefi(sistemin sipari\u015f y\u00f6netim bile\u015feni) ve s\u00fcrecin ge\u00e7ti\u011fi t\u00fcm bile\u015fenler(stok y\u00f6netimi, kargo hizmeti vb.) vs. gibi traceability bilgileri belirlenir.<\/li>\n<li>Sipari\u015fin ilerlemesi izlenir ve bu s\u00fcre\u00e7te traceability bilgileri g\u00fcncellenir. Misal olarak, stok y\u00f6netim bile\u015fenine ge\u00e7ti\u011finde, traceability bilgileri g\u00fcncellenerek, hangi \u00fcr\u00fcn\u00fcn stokta oldu\u011fu, ne zaman ve hangi ad\u0131mlar\u0131n ger\u00e7ekle\u015ftirildi\u011fi gibi detaylar kaydedilir.<\/li>\n<li>Teslimat s\u00fcrecinde de kullan\u0131c\u0131 sipari\u015finin nerede oldu\u011fu ve ne zaman teslim edilece\u011fi gibi veriler izlenebilir.<\/li>\n<\/ol>\n<\/td>\n<td style=\"text-align:left;vertical-align: top;\">\n<ol>\n<li>Kullan\u0131c\u0131dan sipari\u015f al\u0131n\u0131r ve sipari\u015f y\u00f6netim servisine y\u00f6nlendirilir.<\/li>\n<li>Sipari\u015fin i\u015fleme al\u0131nd\u0131\u011f\u0131na dair bir log kayd\u0131 olu\u015fturulur. Bu log; sipari\u015fin al\u0131nd\u0131\u011f\u0131 tarih, sipari\u015f numaras\u0131, kullan\u0131c\u0131n\u0131n bilgileri ve di\u011fer ilgili verileri i\u00e7erebilir.<\/li>\n<li>Stok kontrol\u00fc s\u00fcrecinde yap\u0131lan i\u015flemler loglanabilir. \u00d6rne\u011fin; stokta bulunan \u00fcr\u00fcn miktar\u0131n\u0131n g\u00fcncellenmesi, stok d\u00fc\u015f\u00fcm\u00fc gibi i\u015flemler loglanarak kaydedilir.<\/li>\n<li>Teslimat s\u00fcrecinde de kargo hizmeti taraf\u0131ndan sa\u011flanan loglar kullan\u0131labilir. Bu loglarda da kargonun al\u0131nmas\u0131, depolama s\u00fcreci, teslimat tarihi ve di\u011fer ilgili bilgiler olabilir.<\/li>\n<\/ol>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\">Verisel \u00d6rnek<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;vertical-align: top;\">\n<ul>\n<li>Kullan\u0131c\u0131dan sipari\u015f al\u0131nd\u0131\u011f\u0131nda traceability bilgileri;\n<div style=\"background-color:#738e96;font-size:10px;line-height: 15px;\">\nKaynak: Kullan\u0131c\u0131 ad\u0131 veya ID: &#8220;gen\u00e7ay&#8221;<br \/>\nHedef: Sipari\u015f y\u00f6netim bile\u015feni: &#8220;order-management-service&#8221;<br \/>\nGe\u00e7ilen bile\u015fenler: Stok y\u00f6netimi bile\u015feni: &#8220;inventory-management-service&#8221;, Kargo hizmeti: &#8220;shipping-service&#8221;\n<\/div>\n<\/li>\n<li>Stok y\u00f6netimi bile\u015fenine ge\u00e7ildi\u011finde traceability bilgileri;\n<div style=\"background-color:#738e96;font-size:10px;line-height: 15px;\">\n\u00dcr\u00fcn ad\u0131: &#8220;ABC \u00fcr\u00fcn\u00fc&#8221;<br \/>\nGe\u00e7en ad\u0131m: Stok d\u00fc\u015f\u00fcm\u00fc yap\u0131ld\u0131<br \/>\nTarih ve saat: 2023-06-30 10:15\n<\/div>\n<\/li>\n<li>Teslimat s\u00fcrecinde traceability bilgileri;\n<div style=\"background-color:#738e96;font-size:10px;line-height: 15px;\">\nKargo takip numaras\u0131: &#8220;1234567890&#8221;<br \/>\nSipari\u015f durumu: Teslimat a\u015famas\u0131nda<br \/>\nTahmini teslimat tarihi: 2023-07-05\n<\/div>\n<\/li>\n<\/ul>\n<\/td>\n<td style=\"text-align:left;vertical-align: top;\">\n<ul>\n<li>Kullan\u0131c\u0131dan sipari\u015f al\u0131nd\u0131\u011f\u0131nda log verisi;\n<div style=\"background-color:#738e96;font-size:10px;line-height: 15px;\">\nTarih ve saat: 2023-06-30 09:30<br \/>\nSipari\u015f numaras\u0131: &#8220;ORD123456&#8221;<br \/>\nKullan\u0131c\u0131 bilgisi: &#8220;gen\u00e7ay&#8221;<br \/>\n\u00dcr\u00fcn ad\u0131: &#8220;ABC \u00fcr\u00fcn\u00fc&#8221;\n<\/div>\n<\/li>\n<li>Stok y\u00f6netimi bile\u015fenine ge\u00e7ildi\u011finde log verisi;\n<div style=\"background-color:#738e96;font-size:10px;line-height: 15px;\">\nTarih ve saat: 2023-06-30 10:15<br \/>\n\u0130\u015flem: Stok d\u00fc\u015f\u00fcm\u00fc<br \/>\n\u00dcr\u00fcn ad\u0131: &#8220;ABC \u00fcr\u00fcn\u00fc&#8221;<br \/>\nStok miktar\u0131: 100&#8217;den 99&#8217;a d\u00fc\u015f\u00fcr\u00fcld\u00fc\n<\/div>\n<\/li>\n<li>Teslimat s\u00fcrecinde log verisi;\n<div style=\"background-color:#738e96;font-size:10px;line-height: 15px;\">\nTarih ve saat: 2023-07-01 14:30<br \/>\nKargo takip numaras\u0131: &#8220;1234567890&#8221;<br \/>\nKargonun al\u0131nd\u0131\u011f\u0131 \u015fube: &#8220;Merkez \u015eube&#8221;<br \/>\nKargonun depoland\u0131\u011f\u0131 tarih ve saat: 2023-07-01 15:00\n<\/div>\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Evet, \u00f6rnek senaryodan da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere traceability bilgileri, sipari\u015fin kayna\u011f\u0131ndan hedefine kadar ge\u00e7ti\u011fi bile\u015fenleri ve hizmetleri belirlerken, loglar ise sistemdeki faaliyetleri ve i\u015flemleri kaydederek sorun giderme ve analiz i\u00e7in \u00f6nemli birer kaynak sa\u011flamaktad\u0131rlar.<\/p>\n<h5>Distributed Sistemlerde Traceability Bile\u015fenleri<\/h5>\n<p>Traceability&#8217;nin log ile aras\u0131ndaki fark\u0131 inceledikten sonra distributed sistemlerdeki traceability i\u00e7in \u00f6nem arz eden bile\u015fenlere de\u011finmekte fayda vard\u0131r. Bunlar; &#8216;Gereksinim \u0130zlenebilirli\u011fi&#8217;, &#8216;Tasar\u0131m \u0130zlenebilirli\u011fi&#8217;, &#8216;Kod \u0130zlenebilirli\u011fi&#8217; ve &#8216;Test \u0130zlenebilirli\u011fi&#8217;dir. \u015eimdi gelin bunlar\u0131 s\u0131ras\u0131yla hafiften \u00f6zetleyelim;<\/p>\n<ul>\n<li><strong>Gereksinim \u0130zlenebilirli\u011fi<\/strong><br \/>\nSistem gereksinimlerinin izlenebilirli\u011fi, her bir gereksinimin sistemdeki bile\u015fenlere nas\u0131l d\u00f6n\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc g\u00f6sterir. B\u00f6ylece, gereksinimlerin nas\u0131l uyguland\u0131\u011f\u0131, de\u011fi\u015ftirildi\u011fi ve kald\u0131r\u0131ld\u0131\u011f\u0131 takip edilebilir.\n<\/li>\n<li><strong>Tasar\u0131m \u0130zlenebilirli\u011fi<\/strong><br \/>\nTasar\u0131m izlenebilirli\u011fi ise gereksinimlerin nas\u0131l bir tasar\u0131ma d\u00f6n\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc g\u00f6stermektedir. B\u00f6ylece de sistemdeki bile\u015fenlerin birbirleriyle nas\u0131l etkile\u015fime girdi\u011fini, veri ak\u0131\u015f\u0131n\u0131 ve di\u011fer sistem \u00f6zelliklerini daha rahat anlamam\u0131z\u0131 sa\u011flar.\n<\/li>\n<li><strong>Kod \u0130zlenebilirli\u011fi<\/strong><br \/>\nKod izlenebilirli\u011fi ile de tasar\u0131m\u0131n nas\u0131l uyguland\u0131\u011f\u0131 takip edilebilir. Bile\u015fenin nas\u0131l geli\u015ftirildi\u011fi, de\u011fi\u015ftirildi\u011fi ve hata d\u00fczeltmesinin nas\u0131l yap\u0131ld\u0131\u011f\u0131 takip edilebilir.\n<\/li>\n<li><strong>Test \u0130zlenebilirli\u011fi<\/strong><br \/>\nBir bile\u015fenin veya sistem \u00f6zelli\u011fini nas\u0131l test edildi\u011fini g\u00f6sterir. Bir test senaryosunun nas\u0131l uyguland\u0131\u011f\u0131n\u0131, sonu\u00e7lar\u0131n\u0131n nas\u0131l analiz edildi\u011fini ve hatalar\u0131n nas\u0131l d\u00fczeltildi\u011fini takip etmemizi sa\u011flar.\n<\/li>\n<\/ul>\n<blockquote><p><em style=\"color:purple;\">Traceability, distributed sistemlerin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 y\u00f6netmek ve sistemdeki de\u011fi\u015fikliklerin yan etkilerini anlamak i\u00e7in kritik bir \u00f6neme sahiptir.<\/em><\/p><\/blockquote>\n<p>Anlayaca\u011f\u0131n\u0131z; traceability, gelecekteki sistem de\u011fi\u015fikliklerini planlama s\u00fcrecinde rehberlik edebilecek ve b\u00f6ylece ekip \u00fcyeleri aras\u0131ndaki ileti\u015fimi kolayla\u015ft\u0131rabilecek ve t\u00fcm bunlar\u0131n yan\u0131nda sistem dok\u00fcmantasyonunun g\u00fcncel ve tutarl\u0131 olmas\u0131n\u0131 sa\u011flayabilecek bir davran\u0131\u015ft\u0131r.<\/p>\n<blockquote><p><em style=\"color:orange;\">Traceability, sistem dok\u00fcmantasyonunun g\u00fcncel ve tutarl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/em><\/p><\/blockquote>\n<h3>Projelerde Traceability&#8217;i Sa\u011flamak<\/h3>\n<p>Projelerimizde, projenin \u00f6l\u00e7e\u011fine ve gereksinimlerine ba\u011fl\u0131 olarak \u00e7e\u015fitli y\u00f6ntemler e\u015fli\u011finde traceability sa\u011flanabilmektedir. \u015eimdi bizler t\u00fcm projeler i\u00e7in traceability&#8217;i temel prensipleri e\u015fli\u011finde masaya yat\u0131r\u0131yor olacak ve i\u00e7eri\u011fimizin devam\u0131nda ise Correlation ID (\u0130li\u015fkilendirme Kimli\u011fi) \u00fczerinden de pratik bir inceleme e\u015fli\u011finde tecr\u00fcbede bulunuyor olaca\u011f\u0131z.<\/p>\n<p>Bir projede traceability&#8217;i a\u015fa\u011f\u0131daki prensipler e\u015fli\u011finde uygulayabilirsiniz;<\/p>\n<ol>\n<li><strong>Gereksinim Belirleme<\/strong> <em>(Gereksinimlerin \u0130zlenmesi)<\/em><br \/>\nGereksinimleri Jira, Trello vs. gibi bir gereksinim y\u00f6netim arac\u0131nda tan\u0131mlay\u0131n ve t\u00fcm gereksinimlere benzersiz bir kimlik (ID) atay\u0131n.\n<\/li>\n<li><strong>Tasar\u0131m ve Kodlama<\/strong> <em>(Tasar\u0131m\u0131n ve Kodun \u0130zlenmesi)<\/em><br \/>\nSistemin tasar\u0131m\u0131n\u0131 belirleyin ve bunu UML diyagramlar\u0131, ak\u0131\u015f \u015femalar\u0131 ve gerekli olabilecek di\u011fer belgelerle ifade edin. Kodunuzu ise versiyon kontrol sisteminde y\u00f6netin ve her geli\u015ftirmeyi ve de\u011fi\u015fikli\u011fi a\u00e7\u0131klayan commit mesajlar\u0131 kullan\u0131n.\n<\/li>\n<li><strong>Test Senaryolar\u0131n\u0131n Tan\u0131mlanmas\u0131<\/strong> <em>(Kodun \u0130zlenmesi)<\/em><br \/>\nGereksinimleri do\u011frulamak i\u00e7in gerekli test senaryolar\u0131n\u0131 tan\u0131mlay\u0131n. Her test senaryosu i\u00e7in bir kimlik olu\u015fturun ve bu kimlikleri gereksinimlerle ili\u015fkilendirin. Devam\u0131nda ise test senaryolar\u0131n\u0131z\u0131 ve sonu\u00e7lar\u0131n\u0131 NUnit veya xUnit gibi bir test y\u00f6netim arac\u0131yla takip edin.\n<\/li>\n<li><strong>Raporlama<\/strong><br \/>\nNihai olarak gereksinimlerin hangi bile\u015fenlerle ili\u015fkili oldu\u011funu, hangi bile\u015fenlerin hangi tasar\u0131mlara dayand\u0131\u011f\u0131n\u0131 ve hangi tasar\u0131mlar\u0131n hangi kod par\u00e7alar\u0131 taraf\u0131ndan uyguland\u0131\u011f\u0131n\u0131 g\u00f6sterecek raporlar olu\u015fturun.\n<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar\u0131 takip ederek her bir gereksinimin, tasar\u0131m\u0131n, kodun ve testin birbirleriyle ili\u015fkilendirildi\u011fi bir traceability mekanizmas\u0131 olu\u015fturabilir ve bu sayede bir gereksinimde yap\u0131lan de\u011fi\u015fikliklerin; tasar\u0131m\u0131, kodu ve test senaryolar\u0131n\u0131 nas\u0131l etkiledi\u011fini b\u00fct\u00fcnsel olarak g\u00f6zlemleyebilirsiniz.<\/p>\n<blockquote><p><em style=\"color:#3291AD;\">Unutulmamal\u0131d\u0131r ki Traceability, s\u00fcrekli olarak g\u00fcncellenmesi ve takip edilmesi gereken bir s\u00fcre\u00e7tir. Projeniz ilerledik\u00e7e yeni gereksinimler ortaya \u00e7\u0131kabilir, tasar\u0131mlar ve kodlar de\u011fi\u015febilir ve testlerin g\u00fcncellenmesi gerekebilir. Bu nedenle, Traceability&#8217;i proje ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca s\u00fcrd\u00fcrmek ve g\u00fcncel tutmak \u00f6nemlidir.<\/em><\/p><\/blockquote>\n<h3>Correlation ID \u0130le Traceability&#8217;i Sa\u011flamak<\/h3>\n<p>Projenin genel \u00e7er\u00e7evesi a\u00e7\u0131s\u0131ndan traceability&#8217;nin nas\u0131l uygulanaca\u011f\u0131n\u0131 ilkeleriyle birlikte yukar\u0131daki sat\u0131rlarda yeterince ayd\u0131nlatt\u0131k kanaatindeyim. \u015eimdi ise traceability&#8217;i pratiksel olarak geli\u015ftirme s\u00fcre\u00e7lerinde nas\u0131l uygulayabilece\u011fimize odaklanal\u0131m istiyorum. Yani perspektifi biraz daha daralt\u0131p, olaya kod \u00fczerinden yani operasyon s\u00fcrecinden g\u00f6z atal\u0131m istiyorum.<\/p>\n<p>\u00d6zellikle .NET ortam\u0131nda traceability&#8217;i uygulayabilmek i\u00e7in Correlation ID y\u00f6ntemi yayg\u0131n olarak kullan\u0131lmaktad\u0131r. Correlation ID, kullan\u0131c\u0131 taraf\u0131ndan ba\u015flat\u0131lan bir request&#8217;in sistem i\u00e7erisindeki t\u00fcm bile\u015fenler aras\u0131nda izlenebilirli\u011fini sa\u011flamak i\u00e7in kullan\u0131lan benzersiz bir kimliktir.  Bu kimlik sayesinde request&#8217;in sistemin hangi noktas\u0131nda ne gibi bir durumda oldu\u011funu rahatl\u0131kla takip edebilir ve s\u00fcreci g\u00f6zlemleyebiliriz.<\/p>\n<h5>Console Uygulamas\u0131nda Traceability<\/h5>\n<p>\u015eimdi ilk olarak Console uygulamas\u0131 \u00fczerinden bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirelim. Bunun i\u00e7in ilk etapta a\u015fa\u011f\u0131daki k\u00fct\u00fcphaneleri uygulamaya y\u00fckleyerek ba\u015flayal\u0131m.<\/p>\n<p><a href=\"https:\/\/www.nuget.org\/packages\/NLog.Extensions.Logging\" rel=\"noopener\" target=\"_blank\">dotnet add package NLog.Extensions.Logging<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Extensions.DependencyInjection\" rel=\"noopener\" target=\"_blank\">dotnet add package Microsoft.Extensions.DependencyInjection<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Extensions.Configuration.Json\" rel=\"noopener\" target=\"_blank\">dotnet add package Microsoft.Extensions.Configuration.Json<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/NLog\" rel=\"noopener\" target=\"_blank\">dotnet add package NLog<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/NLog.Database\" rel=\"noopener\" target=\"_blank\">dotnet add package NLog.Database<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/System.Data.SqlClient\/\" rel=\"noopener\" target=\"_blank\">dotnet add package System.Data.SqlClient<\/a><\/p>\n<p>Evet, bizler traceability&#8217;i uygularken NLog k\u00fct\u00fcphanesinden istifade ediyor olacak ve SQL Server veritaban\u0131 \u00fczerinde loglar\u0131m\u0131z\u0131 tutuyor olaca\u011f\u0131z. \u015eimdi uygulama \u00fczerinde &#8216;nlog.config&#8217; isimli dosyay\u0131 root dizinine olu\u015ftural\u0131m ve yap\u0131land\u0131rmas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirelim;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;\r\n&lt;!-- XSD manual extracted from package NLog.Schema: https:\/\/www.nuget.org\/packages\/NLog.Schema--&gt;\r\n&lt;nlog xmlns=&quot;http:\/\/www.nlog-project.org\/schemas\/NLog.xsd&quot; xsi:schemaLocation=&quot;NLog NLog.xsd&quot;\r\n      xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\r\n      autoReload=&quot;true&quot;\r\n      internalLogFile=&quot;c:\\temp\\console-example-internal.log&quot;\r\n      internalLogLevel=&quot;Info&quot; &gt;\r\n\r\n\t&lt;!-- the targets to write to --&gt;\r\n\t&lt;targets&gt;\r\n\t\t&lt;!-- write logs to file --&gt;\r\n\t\t&lt;target\r\n\t\t\txsi:type=&quot;Database&quot;\r\n\t\t\tname=&quot;database&quot;\r\n\t\t\tkeepConnection=&quot;true&quot;\r\n\t\t\tdbProvider=&quot;System.Data.SqlClient&quot;\r\n\t\t\tcommandType=&quot;Text&quot;&gt;\r\n\t\t\t&lt;connectionString&gt;\r\n\t\t\t\tServer=localhost, 1433;Database=TraceabilityDB;User ID=***;Password=***;TrustServerCertificate=True\r\n\t\t\t&lt;\/connectionString&gt;\r\n\t\t\t&lt;commandText&gt;\r\n\t\t\t\tINSERT INTO TraceabilityLogs\r\n\t\t\t\t\t (EventDateTime,\r\n\t\t\t\t\t  EventLevel,\r\n\t\t\t\t\t  CorrelationId, \r\n\t\t\t\t\t  MachineName, \r\n\t\t\t\t\t  EventMessage, \r\n\t\t\t\t\t  ErrorSource, \r\n\t\t\t\t\t  ErrorClass, \r\n\t\t\t\t\t  ErrorMethod, \r\n\t\t\t\t\t  ErrorMessage, \r\n\t\t\t\t\t  InnerErrorMessage)\r\n\t\t\t\tVALUES \r\n\t\t\t\t\t (@EventDateTime, \r\n\t\t\t\t\t  @EventLevel, \r\n\t\t\t\t\t  @CorrelationId, \r\n\t\t\t\t\t  @MachineName, \r\n\t\t\t\t\t  @EventMessage, \r\n\t\t\t\t\t  @ErrorSource, \r\n\t\t\t\t\t  @ErrorClass,\r\n\t\t\t\t\t  @ErrorMethod, \r\n\t\t\t\t\t  @ErrorMessage, \r\n\t\t\t\t\t  @InnerErrorMessage)\r\n\t\t\t&lt;\/commandText&gt;\r\n\t\t\t\r\n\t\t\t&lt;!-- parameters for the command --&gt;\r\n\t\t\t&lt;parameter name=&quot;@EventDateTime&quot; layout=&quot;${date:s}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@EventLevel&quot; layout=&quot;${level}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@CorrelationId&quot; layout=&quot;${activityid}&quot;\/&gt;\r\n\t\t\t&lt;parameter name=&quot;@MachineName&quot; layout=&quot;${machinename}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@EventMessage&quot; layout=&quot;${message}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorSource&quot; layout=&quot;${event-context:item=error-source}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorClass&quot; layout=&quot;${event-context:item=error-class}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorMethod&quot; layout=&quot;${event-context:item=error-method}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorMessage&quot; layout=&quot;${event-context:item=error-message}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@InnerErrorMessage&quot; layout=&quot;${event-context:item=inner-error-message}&quot; \/&gt;\r\n\t\t&lt;\/target&gt;\r\n\t&lt;\/targets&gt;\r\n\r\n\t&lt;!-- rules to map from logger name to target --&gt;\r\n\t&lt;rules&gt;\r\n\t\t&lt;logger name=&quot;*&quot; minlevel=&quot;Debug&quot; writeTo=&quot;database&quot; \/&gt;\r\n\t&lt;\/rules&gt;\r\n&lt;\/nlog&gt;\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki yap\u0131land\u0131rma dosyas\u0131na g\u00f6z atarsan\u0131z loglaman\u0131n hangi sunucuya yap\u0131laca\u011f\u0131 konfig\u00fcre edilmekte ve <strong><em>46<\/em><\/strong> ile <strong><em>56.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131ndaki parametreler e\u015fli\u011finde yakalanan verilerin, <strong><em>21<\/em><\/strong> ile <strong><em>44.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda commandText ile veritaban\u0131na insert edilmesi ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<p>Ayr\u0131ca, <strong><em>46<\/em><\/strong> ile <strong><em>56.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131ndaki parametrelere de \u015f\u00f6yle bi g\u00f6z att\u0131\u011f\u0131m\u0131z da sunucu ad\u0131ndan tutun da correlation id de\u011ferine kadar traceability s\u00fcrecinde ihtiyac\u0131m\u0131z olabilecek t\u00fcm de\u011ferler tan\u0131mlanm\u0131\u015f bulunmaktad\u0131r. Burada dikkat ederseniz, <strong><em>49.<\/em><\/strong> sat\u0131rdaki &#8216;CorrelationId&#8217;, de\u011ferini <em>activityid<\/em> parametresinden almaktad\u0131r. Bu parametre NLog k\u00fct\u00fcphanesinin log mesajlar\u0131n\u0131 trace edebilmek i\u00e7in bizlere sundu\u011fu ekstra bir \u00f6zelliktir ve bu \u00f6zellik neticesinde <em>activityid<\/em> parametresi, correlation id de\u011ferini <em>System.Diagnostics<\/em> namespace&#8217;i alt\u0131ndaki <em>Trace.CorrelationManager.ActivityId<\/em> property&#8217;sinden edinmektedir.<\/p>\n<p>Ek olarak <strong><em>6.<\/em><\/strong> sat\u0131rdaki <code>internalLogFile<\/code> \u00f6zelli\u011finden de bahsetmek istiyorum. Bu \u00f6zellik, NLog k\u00fct\u00fcphanesi taraf\u0131ndan \u00fcretilen hata ve uyar\u0131 mesajlar\u0131n\u0131 kontrol edebilmemiz i\u00e7in kendince tuttu\u011fu loglar\u0131n konumunu ifade etmektedir. E\u011fer ki, olas\u0131 bir veritaban\u0131 kesintisinden yahut konfig\u00fcrasyonel hatadan kaynakl\u0131 k\u00fct\u00fcphanenin sa\u011fl\u0131kl\u0131 \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcrseniz bu \u00f6zelli\u011fe verilen konumdaki log dosyas\u0131 \u00fczerinden duruma dair detayl\u0131 bilgi edinebilir ve h\u0131zl\u0131ca \u00e7\u00f6z\u00fcm i\u00e7in aksiyon alabilirsiniz.<\/p>\n<p>Velhas\u0131l,<\/p>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 uygulamada kullanabilmek i\u00e7in &#8216;.csproj&#8217; uzant\u0131l\u0131 dosyada a\u015fa\u011f\u0131daki gibi tan\u0131mda bulunulmas\u0131 gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;Project Sdk=&quot;Microsoft.NET.Sdk&quot;&gt;\r\n\t.\r\n\t.\r\n\t.\r\n\t&lt;ItemGroup&gt;\r\n\t\t&lt;None Update=&quot;nlog.config&quot; CopyToOutputDirectory=&quot;Always&quot; \/&gt;\r\n\t&lt;\/ItemGroup&gt;\r\n\r\n&lt;\/Project&gt;\r\n<\/pre>\n<\/div>\n<p>Bu i\u015flemin ard\u0131ndan art\u0131k bu yap\u0131land\u0131rmada connection string&#8217;te belirtilen veritaban\u0131 ve bu veritaban\u0131 i\u00e7erisinde de parametrelere kar\u015f\u0131l\u0131k kolonlar\u0131 bar\u0131nd\u0131ran tabloyu olu\u015fturmam\u0131z gerekmektedir. Bunun i\u00e7in a\u015fa\u011f\u0131daki script&#8217;ten istifade edebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nCREATE DATABASE TraceabilityDB\r\nGO\r\nUSE TraceabilityDB\r\nGO\r\nCREATE TABLE &#x5B;dbo].&#x5B;TraceabilityLogs]\r\n(\r\n\t&#x5B;Id] &#x5B;int] IDENTITY(1,1) NOT NULL PRIMARY KEY,\r\n\t&#x5B;EventDateTime] &#x5B;datetime] NOT NULL,\r\n\t&#x5B;EventLevel] &#x5B;nvarchar](100) NOT NULL,\r\n\t&#x5B;CorrelationId] &#x5B;uniqueidentifier] NOT NULL,\r\n\t&#x5B;MachineName] &#x5B;nvarchar](100) NOT NULL,\r\n\t&#x5B;EventMessage] &#x5B;nvarchar](max) NOT NULL,\r\n\t&#x5B;ErrorSource] &#x5B;nvarchar](100) NULL,\r\n\t&#x5B;ErrorClass] &#x5B;nvarchar](500) NULL,\r\n\t&#x5B;ErrorMethod] &#x5B;nvarchar](max) NULL,\r\n\t&#x5B;ErrorMessage] &#x5B;nvarchar](max) NULL,\r\n\t&#x5B;InnerErrorMessage] &#x5B;nvarchar](max) NULL\r\n)\r\n<\/pre>\n<\/div>\n<p>T\u00fcm bu \u00e7al\u0131\u015fmalardan sonra art\u0131k &#8216;Program.cs&#8217;de a\u015fa\u011f\u0131daki gibi basit bir program yazarak traceability&#8217;i g\u00f6zlemleyebiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing NLog;\r\n\r\nLogger _logger = LogManager.GetCurrentClassLogger();\r\nSystem.Diagnostics.Trace.CorrelationManager.ActivityId = Guid.NewGuid();\r\n\r\nWork1();\r\n\r\nvoid Work1()\r\n{\r\n    _logger.Debug(&quot;Work1 metodu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131...&quot;);\r\n    Work2();\r\n}\r\nvoid Work2()\r\n{\r\n    _logger.Debug(&quot;Work2 metodu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131...&quot;);\r\n    Work3();\r\n}\r\nvoid Work3()\r\n{\r\n    _logger.Debug(&quot;Work3 metodu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131...&quot;);\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere i\u00e7 i\u00e7e sequentially olarak ilerleyen 3 adet metot \u00fczerinden gerekli testi ger\u00e7ekle\u015ftirmekteyiz. Burada NLog k\u00fct\u00fcphanesinin correlation id&#8217;yi &#8216;ActivityId&#8217;den alabilmesi i\u00e7in <code>System.Diagnostics.Trace.CorrelationManager.ActivityId<\/code> property&#8217;sine bir guid de\u011fer \u00fcretip set etmemiz yeterli olacakt\u0131r. Bu a\u015famadan sonra &#8216;Work1&#8217; metoduna yap\u0131lan call neticesinde, program\u0131n sonuna kadar ge\u00e7ti\u011fi t\u00fcm a\u015famalardaki durumlar\u0131 takip edecek ve bunu &#8216;ActivityId&#8217; \u00fczerinden ili\u015fkilendirerek g\u00f6zlemleyebiliyor olaca\u011f\u0131z.<\/p>\n<p>Uygulamay\u0131 derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki gibi neticeyle kar\u015f\u0131la\u015faca\u011f\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog.png\" alt=\"Distributed Sistemlerde Traceability - Derinlemesine \u0130nceleme | Asp.NET Core App. | Console App. | NLog\" width=\"714\" height=\"141\" class=\"aligncenter size-full wp-image-26401\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog.png 714w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-300x59.png 300w\" sizes=\"auto, (max-width: 714px) 100vw, 714px\" \/><\/a>Evet, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere program \u00e7al\u0131\u015ft\u0131\u011f\u0131 s\u00fcre\u00e7te at\u0131lan loglar genel anlamda uygulaman\u0131n verisel i\u015flem s\u00fcrecini bizlere \u00f6zetleyen ve bunu da correlation id \u00fczerinden bir b\u00fct\u00fcn olarak ili\u015fkilendirerek sunan g\u00f6r\u00fcnt\u00fcyle kar\u015f\u0131la\u015fm\u0131\u015f bulunuyoruz&#8230;<\/p>\n<p>Console uygulamas\u0131nda i\u015fte bu kadar \ud83d\ude42<\/p>\n<p>\u015eimdi benzer mant\u0131\u011f\u0131 biraz daha komplike bir yap\u0131 olan distributed sistem \u00fczerinden \u00f6rneklendirelim. Bunun i\u00e7in de Asp.NET Core mimarisinden istifade edece\u011fiz.<\/p>\n<h5>Asp.NET Core Uygulamas\u0131nda Traceability<\/h5>\n<p>Asp.NET Core uygulamalar\u0131nda correlation id ile traceability&#8217;i sa\u011flayabilmek i\u00e7in mant\u0131ken a\u015fa\u011f\u0131daki s\u0131ralamada bir \u00e7al\u0131\u015fma sergilenmesi gerekmektedir;<\/p>\n<ol>\n<li><em>Correlation ID Olu\u015fturma ve \u0130letme<\/em><br \/>\nAsp.NET Core uygulamas\u0131na gelen HTTP request&#8217;lerini i\u015fleyecek olan bir middleware olu\u015fturunuz ve ard\u0131ndan bu middleware i\u00e7erisinde her request&#8217;e bir correlation id ekleyiniz ya da varsa bir id onunla ili\u015fkilendiriniz. Bu ili\u015fkilendirmeyi request&#8217;in header&#8217;\u0131nda <code>X-Correlation-ID<\/code> gibi bir key&#8217;e kar\u015f\u0131l\u0131k ger\u00e7ekle\u015ftirebilirsiniz.\n<\/li>\n<li><em>Correlation ID&#8217;nin \u0130\u015flem Zinciri Boyunca \u0130letilmesi<\/em><br \/>\nUygulama s\u00fcrecinde gelen request&#8217;in i\u015flenece\u011fi bile\u015fenler aras\u0131nda correlation id&#8217;yi ta\u015f\u0131yabilmek i\u00e7in de yine bu middleware&#8217;den istifade edebilirsiniz. Buradaki mant\u0131k, request neticesinde gelen correlation id&#8217;yi al\u0131p, bunu bir sonraki bile\u015fen taraf\u0131ndan eri\u015filebilir olmas\u0131 i\u00e7in iletilebilir k\u0131lmakt\u0131r.\n<\/li>\n<li><em>Correlation ID&#8217;nin Log Kay\u0131tlar\u0131nda ve Response&#8217;da Kullan\u0131lmas\u0131<\/em><br \/>\nCorrelation ID e\u015fli\u011finde loglar\u0131 at\u0131n\u0131z. B\u00f6ylece bir request&#8217;e kar\u015f\u0131l\u0131k t\u00fcm loglar\u0131 ili\u015fkisel bir \u015fekilde ifade edebilir ve k\u00fcm\u00fclatif olarak s\u00fcreci izlenebilir k\u0131lm\u0131\u015f olacaks\u0131n\u0131z. Benzer \u015fekilde response&#8217;larla correlation id&#8217;yi de ili\u015fkilendirerek request&#8217;lerin response s\u00fcre\u00e7lerini de bu b\u00fct\u00fcnselli\u011fe katabilir ve daha geni\u015f yelpazede bir izlenebilirlik ortaya koyabilirsiniz.\n<\/li>\n<\/ol>\n<p>\u015eimdi gelin t\u00fcm bu s\u00fcreci pratik olarak tecr\u00fcbe edelim.<\/p>\n<p>\u00d6ncelikle bir Asp.NET Core uygulamas\u0131na a\u015fa\u011f\u0131daki k\u00fct\u00fcphaneleri y\u00fckleyerek ba\u015flayal\u0131m;<\/p>\n<p><a href=\"https:\/\/www.nuget.org\/packages\/NLog\" rel=\"noopener\" target=\"_blank\">dotnet add package NLog<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/NLog.Database\" rel=\"noopener\" target=\"_blank\">dotnet add package NLog.Database<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/NLog.Web.AspNetCore\" rel=\"noopener\" target=\"_blank\">dotnet add package NLog.Web.AspNetCore<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/System.Data.SqlClient\" rel=\"noopener\" target=\"_blank\">dotnet add package System.Data.SqlClient<\/a><\/p>\n<p>Asp.NET Core uygulamas\u0131nda da t\u00fcm traceability s\u00fcrecini NLog ile takip ediyor olaca\u011f\u0131z. Ee haliyle yukar\u0131daki console uygulamas\u0131nda yapt\u0131\u011f\u0131m\u0131z gibi uygulaman\u0131n root dizininde &#8216;nlog.config&#8217; isimli bir dosyay\u0131 olu\u015ftural\u0131m ve i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi \u015fekillendirelim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;\r\n&lt;!-- XSD manual extracted from package NLog.Schema: https:\/\/www.nuget.org\/packages\/NLog.Schema--&gt;\r\n&lt;nlog xmlns=&quot;http:\/\/www.nlog-project.org\/schemas\/NLog.xsd&quot; xsi:schemaLocation=&quot;NLog NLog.xsd&quot;\r\n      xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\r\n      autoReload=&quot;true&quot;\r\n      internalLogFile=&quot;c:\\temp\\console-example-internal.log&quot;\r\n      internalLogLevel=&quot;Info&quot; &gt;\r\n\r\n\t&lt;!-- the targets to write to --&gt;\r\n\t&lt;targets&gt;\r\n\t\t&lt;!-- write logs to file --&gt;\r\n\t\t&lt;target\r\n\t\t\txsi:type=&quot;Database&quot;\r\n\t\t\tname=&quot;database&quot;\r\n\t\t\tkeepConnection=&quot;true&quot;\r\n\t\t\tdbProvider=&quot;System.Data.SqlClient&quot;\r\n\t\t\tcommandType=&quot;Text&quot;&gt;\r\n\t\t\t&lt;connectionString&gt;\r\n\t\t\t\tServer=localhost, 1433;Database=TraceabilityDB;User ID=SA;Password=1q2w3e4r+!;TrustServerCertificate=True\r\n\t\t\t&lt;\/connectionString&gt;\r\n\t\t\t&lt;commandText&gt;\r\n\t\t\t\tINSERT INTO TraceabilityLogs\r\n\t\t\t\t(EventDateTime,\r\n\t\t\t\tEventLevel,\r\n\t\t\t\tCorrelationId,\r\n\t\t\t\tMachineName,\r\n\t\t\t\tEventMessage,\r\n\t\t\t\tErrorSource,\r\n\t\t\t\tErrorClass,\r\n\t\t\t\tErrorMethod,\r\n\t\t\t\tErrorMessage,\r\n\t\t\t\tInnerErrorMessage)\r\n\t\t\t\tVALUES\r\n\t\t\t\t(@EventDateTime,\r\n\t\t\t\t@EventLevel,\r\n\t\t\t\t@CorrelationId,\r\n\t\t\t\t@MachineName,\r\n\t\t\t\t@EventMessage,\r\n\t\t\t\t@ErrorSource,\r\n\t\t\t\t@ErrorClass,\r\n\t\t\t\t@ErrorMethod,\r\n\t\t\t\t@ErrorMessage,\r\n\t\t\t\t@InnerErrorMessage)\r\n\t\t\t&lt;\/commandText&gt;\r\n\r\n\t\t\t&lt;!-- parameters for the command --&gt;\r\n\t\t\t&lt;parameter name=&quot;@EventDateTime&quot; layout=&quot;${date:s}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@EventLevel&quot; layout=&quot;${level}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@CorrelationId&quot; layout=&quot;${mdc:item=CorrelationId}&quot;\/&gt;\r\n\t\t\t&lt;parameter name=&quot;@MachineName&quot; layout=&quot;${machinename}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@EventMessage&quot; layout=&quot;${message}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorSource&quot; layout=&quot;${event-context:item=error-source}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorClass&quot; layout=&quot;${event-context:item=error-class}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorMethod&quot; layout=&quot;${event-context:item=error-method}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@ErrorMessage&quot; layout=&quot;${event-context:item=error-message}&quot; \/&gt;\r\n\t\t\t&lt;parameter name=&quot;@InnerErrorMessage&quot; layout=&quot;${event-context:item=inner-error-message}&quot; \/&gt;\r\n\t\t&lt;\/target&gt;\r\n\t&lt;\/targets&gt;\r\n\r\n\t&lt;!-- rules to map from logger name to target --&gt;\r\n\t&lt;rules&gt;\r\n\t\t&lt;logger name=&quot;*&quot; minlevel=&quot;Debug&quot; writeTo=&quot;database&quot; mdc=&quot;true&quot; \/&gt;\r\n\t&lt;\/rules&gt;\r\n&lt;\/nlog&gt;\r\n<\/pre>\n<\/div>\n<p>Bu sefer yukar\u0131daki yap\u0131land\u0131rma dosyas\u0131nda bir noktaya dikkatinizi \u00e7ekmek istiyorum. Asp.NET Core uygulamas\u0131nda NLog k\u00fct\u00fcphanesini kullanarak correlation id \u00fczerinden traceability&#8217;i sa\u011flamaya \u00e7al\u0131\u015f\u0131yorsan\u0131z bu de\u011fer console uygulamalar\u0131nda ki gibi &#8216;activityid&#8217; \u00fczerinden gelmeyecektir. Art\u0131k mimariye uygun bir \u015fekilde bu de\u011feri \u00f6zel bir formatla e\u015fle\u015ftirmeniz gerekecektir. Bunun i\u00e7in <strong><em>49.<\/em><\/strong> sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer correlation id parametresinin &#8216;layout&#8217; de\u011ferine <code>${mdc:item=CorrelationId}<\/code> \u015feklinde bir tan\u0131mlamada bulunulmu\u015ftur. Bu tan\u0131mlama <em>MDC(Mapped Diagnostics Context)<\/em> denen \u00f6zelle\u015ftirilmi\u015f bir parametre de\u011ferini ifade etmektedir ve birazdan kod \u00fczerinden bu parametrenin de\u011ferini veriyor olaca\u011f\u0131z. Ayr\u0131ca bu konuya ba\u011fl\u0131 olarak NLog&#8217;da MDC kullanabilmek i\u00e7in <em><strong>62.<\/strong><\/em> sat\u0131rda oldu\u011fu gibi <code>&lt;logger ... <span style=\"color:red;\">mdc=\"true\"<\/span> \/&gt;<\/code> ifadesi e\u015fli\u011finde MDC&#8217;nin aktifle\u015ftirilmesi gerekmektedir.<\/p>\n<p>\u015eimdi de uygulamada NLog entegrasyonunu ger\u00e7ekle\u015ftirelim;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n.\r\n.\r\n.\r\n\r\n#region NLog Setup\r\nbuilder.Logging.ClearProviders();\r\nbuilder.Host.UseNLog();\r\n#endregion\r\n\r\nvar app = builder.Build();\r\n\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Log yap\u0131land\u0131rmas\u0131ndan sonra correlation id&#8217;yi olu\u015fturmaktan ve iletmekten sorumlu olacak olan middleware&#8217;i a\u015fa\u011f\u0131daki gibi olu\u015ftural\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class CorrelationIdMiddleware\r\n    {\r\n        private const string correlationIdHeaderKey = &quot;X-Correlation-ID&quot;;\r\n        private readonly RequestDelegate _next;\r\n\r\n        public CorrelationIdMiddleware(RequestDelegate next)\r\n        {\r\n            _next = next;\r\n        }\r\n\r\n        public async Task Invoke(HttpContext context, ILogger&lt;CorrelationIdMiddleware&gt; _logger)\r\n        {\r\n            \/\/Request'e kar\u015f\u0131l\u0131k yeni bir correlation id \u00fcretiliyor.\r\n            string correlationId = Guid.NewGuid().ToString();\r\n\r\n            \/\/Request'in header'\u0131n\u0131 kontrol ediliyor e\u011fer ki iste\u011fin correlation id'si varsa elde ediliyor, yoksa \u00fcretilen correlation id de\u011feri header'a ekleniyor.\r\n            if (context.Request.Headers.TryGetValue(correlationIdHeaderKey, out StringValues _correlationId))\r\n                correlationId = _correlationId.ToString();\r\n            else\r\n                context.Request.Headers.Add(correlationIdHeaderKey, correlationId);\r\n\r\n            \/\/nlog.config dosyas\u0131ndaki Mapped Diagnostics Context (MDC) olan @CorrelationId parametresine de\u011feri set ediliyor.\r\n            NLog.MappedDiagnosticsContext.Set(&quot;CorrelationId&quot;, correlationId);\r\n\r\n            \/\/Correlation Id \u00fczerinden k\u00fcm\u00fclatif log at\u0131l\u0131yor.\r\n            _logger.LogDebug(&quot;Asp.NET Core App. Log Example&quot;);\r\n\r\n            \/\/B\u00fct\u00fcnsel bir izlenebilirlik kazand\u0131rabilmek i\u00e7in correlation id response'la da ili\u015fkilendiriliyor.\r\n            context.Response.OnStarting(() =&gt;\r\n            {\r\n                if (!context.Response.Headers.TryGetValue(correlationIdHeaderKey, out _))\r\n                    context.Response.Headers.Add(correlationIdHeaderKey, correlationId);\r\n                return Task.CompletedTask;\r\n            });\r\n\r\n            \/\/Correlation ID sonraki bile\u015fene aktar\u0131l\u0131yor.\r\n            context.Items&#x5B;&quot;CorrelationId&quot;] = correlationId;\r\n\r\n            await _next(context);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Bu middleware&#8217;i detayland\u0131r\u0131rsak e\u011fer; uygulamaya gelen her request&#8217;te yeni bir correlation id olu\u015fturularak header&#8217;a yerle\u015ftirilmekte yahut gelen request&#8217;in header&#8217;\u0131n da varsa o de\u011fer kullan\u0131lmaktad\u0131r. Ard\u0131ndan bu correlation id e\u015fli\u011finde loglama ger\u00e7ekle\u015ftirilmektedir ve bunun i\u00e7in <em><strong>23.<\/strong><\/em> sat\u0131rdaki <code>NLog.MappedDiagnosticsContext.Set(\"CorrelationId\", correlationId);<\/code> komutu e\u015fli\u011finde NLog k\u00fct\u00fcphanesindeki &#8216;CorrelationId&#8217; parametresine de\u011feri g\u00f6nderilmektedir. Burada <strong><em>29<\/em><\/strong> ile <strong><em>34.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda ilgili correlation id response header&#8217;\u0131na da eklenerek, d\u0131\u015f d\u00fcnyaya ta\u015f\u0131nmakta ve b\u00f6ylece client taraf\u0131ndan da kullan\u0131labilir hale getirilmektedir. Bu sayede correlation id, daha geni\u015f perspektiften izlenebilirli\u011fi sa\u011flayacak ve b\u00f6ylece de hata ay\u0131klama s\u00fcre\u00e7leri, de\u011ferlendirilebilecek detay veri bollu\u011fu sayesinde olabildi\u011fince daha kolayla\u015ft\u0131r\u0131lm\u0131\u015f olacakt\u0131r.<\/p>\n<p>Son olarak, <strong><em>37.<\/em><\/strong> sat\u0131rda <code>context.Items[\"CorrelationId\"] = correlationId;<\/code> komutu e\u015fli\u011finde request i\u015flem s\u00fcrecini farkl\u0131 bile\u015fenler veya katmanlar aras\u0131nda payla\u015fabilmek i\u00e7in correlation id&#8217;yi context \u00fczerine ge\u00e7ici olacak \u015fekilde depolam\u0131\u015f bulunuyoruz. Bu i\u015flem sayesinde correlation id&#8217;ye farkl\u0131 middleware&#8217;ler \u00fczerinden yahut controller gibi s\u0131n\u0131flardan rahatl\u0131kla eri\u015febilir ve kullanabiliriz.<\/p>\n<p>Bunu hemen \u015f\u00f6yle \u00f6rneklendirelim istiyorum;<\/p>\n<p>Farkl\u0131 bir middleware&#8217;den correlation id&#8217;ye eri\u015fmek istiyorsan\u0131z a\u015fa\u011f\u0131daki gibi yine request&#8217;in header&#8217;\u0131ndan okuyabilir ya da <code>context.Items<\/code> \u00fczerinden de h\u0131zl\u0131ca elde edebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class OtherMiddleware\r\n    {\r\n        private readonly RequestDelegate _next;\r\n\r\n        public OtherMiddleware(RequestDelegate next)\r\n        {\r\n            _next = next;\r\n        }\r\n\r\n        public async Task Invoke(HttpContext context, ILogger&lt;OtherMiddleware&gt; _logger)\r\n        {\r\n            var correlationId = context.Request.Headers&#x5B;&quot;X-Correlation-ID&quot;].FirstOrDefault();\r\n            \/\/ya da\r\n            correlationId = context.Items&#x5B;&quot;CorrelationId&quot;].ToString();\r\n\r\n            NLog.MappedDiagnosticsContext.Set(&quot;CorrelationId&quot;, correlationId);\r\n            _logger.LogDebug(&quot;OtherMiddleware Log&quot;);\r\n\r\n            await _next(context);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Ayn\u0131 i\u015flemi controller i\u00e7in de a\u015fa\u011f\u0131daki gibi y\u00fcr\u00fctebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    &#x5B;ApiController]\r\n    public class ValuesController : ControllerBase\r\n    {\r\n        readonly ILogger&lt;ValuesController&gt; _logger;\r\n\r\n        public ValuesController(ILogger&lt;ValuesController&gt; logger)\r\n        {\r\n            _logger = logger;\r\n        }\r\n\r\n        &#x5B;HttpGet]\r\n        public async Task Get()\r\n        {\r\n            var correlationId = HttpContext.Request.Headers&#x5B;&quot;X-Correlation-ID&quot;].FirstOrDefault();\r\n            \/\/ya da\r\n            correlationId = HttpContext.Items&#x5B;&quot;CorrelationId&quot;].ToString();\r\n\r\n            NLog.MappedDiagnosticsContext.Set(&quot;CorrelationId&quot;, correlationId);\r\n            _logger.LogDebug(&quot;ValuesController Log&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar&#8230; Yazd\u0131\u011f\u0131m\u0131z <code>CorrelationIdMiddleware<\/code> isimli middleware&#8217;i uygulamada kullanabilmek i\u00e7in a\u015fa\u011f\u0131daki extension metottan istifade edebilir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class CorrelationIdMiddlewareExtensions\r\n    {\r\n        public static IApplicationBuilder UseCorrelationIdMiddleware(this IApplicationBuilder app)\r\n        {\r\n            return app.UseMiddleware&lt;CorrelationIdMiddleware&gt;();\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>ve uygulamaya \u015f\u00f6yle dahil edebiliriz;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddControllers();\r\n.\r\n.\r\n.\r\nvar app = builder.Build();\r\n\r\napp.UseCorrelationIdMiddleware();\r\napp.UseMiddleware&lt;OtherMiddleware&gt;();\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>T\u00fcm bu \u00e7al\u0131\u015fmalardan sonra uygulamay\u0131 aya\u011fa kald\u0131r\u0131p, bir yandan da controller&#8217;a istek g\u00f6nderirseniz veritaban\u0131nda a\u015fa\u011f\u0131daki gibi correlation id e\u015fli\u011finde loglar\u0131n tutuldu\u011funu g\u00f6zlemleyebilirsiniz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-1.png\" alt=\"Distributed Sistemlerde Traceability - Derinlemesine \u0130nceleme | Asp.NET Core App. | Console App. | NLog\" width=\"849\" height=\"464\" class=\"aligncenter size-full wp-image-26405\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-1.png 849w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-1-300x164.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-1-768x420.png 768w\" sizes=\"auto, (max-width: 849px) 100vw, 849px\" \/><\/a>Bizlerin burada tek bir Asp.NET Core uygulamas\u0131 \u00fczerinde sim\u00fcle etti\u011fi bu davran\u0131\u015f, birbirleriyle etkile\u015fimde olan birden fazla servisin s\u00f6z konusu oldu\u011fu durumlarda da ge\u00e7erli olacak ve request&#8217;in header&#8217;\u0131 \u00fczerinde ta\u015f\u0131nan correlation id sayesinde distributed yakla\u015f\u0131m sergilenen mimarilerde de b\u00fct\u00fcnsel loglama ger\u00e7ekle\u015ftirilmi\u015f olacakt\u0131r.<\/p>\n<p><strong><em>Peki, iyi ho\u015f g\u00fczel de bu traceability yakla\u015f\u0131m\u0131n\u0131 message broker kullanan distributed servislerde uygulamak isteseydik nas\u0131l yapacakt\u0131k la hoca?<\/em><\/strong> \u015feklinde sorunuzu duyar gibiyim&#8230; Evet, hakl\u0131s\u0131n\u0131z. Tasarlad\u0131\u011f\u0131m\u0131z her mimari HTTP protokol\u00fc \u00fczerinden haberle\u015fmiyor. Hatta distributed mimari dendi\u011finde ilk olarak akla message broker yap\u0131lanmas\u0131 geliyor. \u015eimdi ak\u0131llara gelen bu suali de cevapland\u0131r\u0131p i\u00e7eri\u011fimizi \u00f6yle sonland\u0131ral\u0131m istiyorum.<\/p>\n<h5>Message Broker Kullan\u0131lan Senaryolarda Traceability<\/h5>\n<p>Konunun d\u0131\u015f\u0131na \u00e7\u0131kmamak ve i\u00e7eri\u011fi haddinden fazla \u015fi\u015firmemek i\u00e7in direkt kod odakl\u0131 bir seyirde bulunal\u0131m istiyorum. E\u011fer ki, message broker&#8217;lara dair bilginiz yoksa blog&#8217;umda ki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/rabbitmq-yazi-dizisi\/\" rel=\"noopener\" target=\"_blank\">RabbitMQ Yaz\u0131 Dizisi<\/a>&#8216;ni ba\u015ftan sona okuyabilir ya da youtube kanal\u0131mdaki <a href=\"https:\/\/www.youtube.com\/watch?v=3SHFwb7exgM&#038;list=PLQVXoXFVVtp2aVwD6GX2KCjcD3hSe6vWM\" rel=\"noopener\" target=\"_blank\">A&#8217;dan Z&#8217;ye RabbitMQ E\u011fitimi<\/a>&#8216;ni izleyebilirsiniz.<\/p>\n<p>Burada bizler \u00f6rneklendirmeyi &#8216;Consumer&#8217; ve &#8216;Publisher&#8217; olmak \u00fczere iki servis \u00fczerinden ger\u00e7ekle\u015ftirece\u011fiz, sizler ise bunu t\u00fcm distributed yakla\u015f\u0131m\u0131n\u0131 sergiledi\u011finiz operasyonlara genelleyeceksiniz.<\/p>\n<p>Publisher;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\r\nusing MassTransit;\r\nusing NLog;\r\nusing Traceability.Example.MessageBrokers.Shared.Messages;\r\n\r\nstring rabbitMQUri = &quot;amqps:\/\/befjdvjy:dBfEg0GaJyIWuF1Yxd8J0z9CcOsErzk6@moose.rmq.cloudamqp.com\/befjdvjy&quot;;\r\n\r\nstring queueName = &quot;example-queue&quot;;\r\n\r\nIBusControl bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n{\r\n    factory.Host(rabbitMQUri);\r\n});\r\n\r\nvar correlationId = Guid.NewGuid();\r\n\r\nLogger _logger = LogManager.GetCurrentClassLogger();\r\nSystem.Diagnostics.Trace.CorrelationManager.ActivityId = correlationId;\r\n_logger.Debug(&quot;Publisher log&quot;);\r\n\r\nISendEndpoint sendEndpoint = await bus.GetSendEndpoint(new($&quot;{rabbitMQUri}\/{queueName}&quot;));\r\n\r\nConsole.Write(&quot;G\u00f6nderilecek mesaj : &quot;);\r\nstring message = Console.ReadLine();\r\nawait sendEndpoint.Send&lt;IMessage&gt;(new ExampleMessage()\r\n{\r\n    Text = message\r\n}, context =&gt;\r\n{\r\n    context.Headers.Set(&quot;CorrelationId&quot;, correlationId);\r\n});\r\n\r\nConsole.Read();\r\n<\/pre>\n<\/div>\n<p>Consumer;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\r\nusing MassTransit;\r\nusing Traceability.Example.MessageBrokers.Consumer.Consumers;\r\n\r\nstring rabbitMQUri = &quot;amqps:\/\/befjdvjy:dBfEg0GaJyIWuF1Yxd8J0z9CcOsErzk6@moose.rmq.cloudamqp.com\/befjdvjy&quot;;\r\n\r\nstring queueName = &quot;example-queue&quot;;\r\n\r\nIBusControl bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n{\r\n    factory.Host(rabbitMQUri);\r\n\r\n    factory.ReceiveEndpoint(queueName, endpoint =&gt;\r\n    {\r\n        endpoint.Consumer&lt;ExampleMessageConsumer&gt;();\r\n    });\r\n});\r\n\r\nawait bus.StartAsync();\r\n\r\nConsole.Read();\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ExampleMessageConsumer : IConsumer&lt;IMessage&gt;\r\n    {\r\n        public Task Consume(ConsumeContext&lt;IMessage&gt; context)\r\n        {\r\n            Console.WriteLine($&quot;Gelen mesaj : {context.Message.Text}&quot;);\r\n\r\n            var correlationId = Guid.NewGuid();\r\n            if (context.Headers.TryGetHeader(&quot;CorrelationId&quot;, out object _correlationId))\r\n                correlationId = Guid.Parse(_correlationId.ToString());\r\n\r\n            Logger _logger = LogManager.GetCurrentClassLogger();\r\n            System.Diagnostics.Trace.CorrelationManager.ActivityId = correlationId;\r\n            _logger.Debug(&quot;Consumer log&quot;);\r\n\r\n            return Task.CompletedTask;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00e7al\u0131\u015fmay\u0131 incelerseniz e\u011fer, &#8216;Publisher&#8217; taraf\u0131ndan message broker&#8217;a g\u00f6nderilen mesaj\u0131n header&#8217;\u0131na correlation id verilmekte ve ayn\u0131 \u015fekilde &#8216;Consumer&#8217; taraf\u0131nda da bu de\u011fer yine header \u00fczerinden elde edilerek gerekli loglama i\u015flemleri ger\u00e7ekle\u015ftirilmektedir. Bu \u00f6rnekle birlikte makale s\u00fcrecindeki t\u00fcm \u00e7al\u0131\u015fmalar\u0131n detaylar\u0131n\u0131 github&#8217;ta ki kaynaktan titizce g\u00f6zlemlemenizi tavsiye ediyorum. Velhas\u0131l, yukar\u0131daki da\u011f\u0131t\u0131k mimariyi \u00e7al\u0131\u015ft\u0131rma neticesinde veritaban\u0131na yans\u0131t\u0131lan log a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-2.png\" alt=\"Distributed Sistemlerde Traceability - Derinlemesine \u0130nceleme | Asp.NET Core App. | Console App. | NLog\" width=\"660\" height=\"121\" class=\"aligncenter size-full wp-image-26406\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-2.png 660w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/07\/Distributed-Sistemlerde-Traceability-Derinlemesine-Inceleme-Asp.NET-Core-App.-Console-App.-NLog-2-300x55.png 300w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><\/p>\n<p>Nihai olarak;<br \/>\nBir mimarinin in\u015fa edilmesinden ziyade o mimarinin in\u015fadan sonraki i\u015fleyi\u015f s\u00fcrecindeki takibi biz yaz\u0131l\u0131m geli\u015ftiricileri i\u00e7in olduk\u00e7a \u00f6nem arz etmektedir. \u00c7\u00fcnk\u00fc geli\u015ftirme s\u00fcrecinde \u00f6ng\u00f6remedi\u011fimiz t\u00fcm hatalar, s\u00fcre\u00e7te son kullan\u0131c\u0131lar taraf\u0131ndan tecr\u00fcbe edildikleri taktirde surlardaki gedikler misali onar\u0131lmas\u0131 gereken hayati durumlar\u0131 ifade etmektedirler. Bizlerin bu hatalardan bilgi sahibi olmas\u0131 ve daha da \u00f6nemlisi hatalara dair nerede, ne zaman, hangi sunucuda, hangi a\u015famada, hangi bile\u015fende vs. gibi detayl\u0131 bilgilere sahip olmas\u0131 son derece kritik \u00f6nem g\u00f6stermektedir. \u0130\u015fte log mekanizmas\u0131 ile traceability&#8217;nin \u00f6nemi bu noktada kar\u015f\u0131m\u0131za \u00e7\u0131kmaktad\u0131r.<\/p>\n<p>Bir \u00f6r\u00fcmce\u011fin a\u011f\u0131ndaki ufak bir hasar, \u00f6r\u00fcmce\u011fin beslenmesi i\u00e7in nas\u0131l ki bir \u00f6nem arz ediyorsa, uygulamalar\u0131m\u0131zdaki olas\u0131 hatalarda uygulaman\u0131n kalitesi ve son kullan\u0131c\u0131n\u0131n g\u00f6z\u00fcndeki de\u011feri i\u00e7in o kadar \u00f6nem arz etmektedir. Ve \u00f6r\u00fcmcek a\u011f\u0131ndaki ufak bir hasara an\u0131nda m\u00fcdahale edebilecek refleksin altyap\u0131s\u0131n\u0131 geli\u015ftirmi\u015fse i\u015fte bizler de uygulamalar\u0131m\u0131zdaki hatalara ve kesintilere m\u00fcdahale edebilecek altyap\u0131y\u0131 geli\u015ftirmeli ve bunun i\u00e7in hem operasyonel s\u00fcre\u00e7lerde hem de servisler aras\u0131ndaki ak\u0131\u015f ve bile\u015fen aktar\u0131mlar\u0131nda, yani uygulaman\u0131n her noktas\u0131nda refleksif a\u011f\u0131m\u0131z\u0131 kurmal\u0131 ve en az bir \u00f6r\u00fcmcek kadar h\u0131zl\u0131 aksiyon alarak hasarlar\u0131 onarmal\u0131y\u0131z&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki github adresinden eri\u015febilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/Traceability.Example\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/Traceability.Example<\/a><\/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, G\u00fcn\u00fcm\u00fczdeki yaz\u0131l\u0131m yakla\u015f\u0131mlar\u0131ndaki en g\u00f6zde parametreler; performans, y\u00fcksek kullan\u0131labilirlik, \u00f6l\u00e7eklenebilirlik ve g\u00fcvenirliktir diyebiliriz. Hal b\u00f6yleyken, bu parametreleri mevcut kaynaklar\u0131m\u0131z do\u011frultusunda en ideal hale getirebilmek i\u00e7in do\u011fru bir mimari tasar\u0131m\u0131na ihtiya\u00e7 duyulmakta ve art\u0131k&#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":26407,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,3573],"tags":[4888,4887,4885,4884,4886,4890,4889,4892,4891,4883],"class_list":["post-26389","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-genel","category-microservices","tag-asp-net-core-app-traceability","tag-console-app-traceability","tag-distributed","tag-distributed-sistemlerde-traceability","tag-distributed-traceability","tag-mapped-diagnostics-context","tag-mdc","tag-nlog-mapped-diagnostics-context","tag-nlog-mdc","tag-traceability"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26389","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=26389"}],"version-history":[{"count":15,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26389\/revisions"}],"predecessor-version":[{"id":26409,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26389\/revisions\/26409"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/26407"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=26389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}