Performance Tracking On EF Core With Easy Profiler (Finally ­čśî)

Profesyonel kariyer hayat─▒mda hemen hemen her zorland─▒─č─▒mda akl─▒ma gelen, Mumin SekmanÔÇÖ─▒n TedX ─░zmirÔÇÖde ki konu┼čmas─▒nda ge├žen c├╝mlelerden bir tanesi ile bu yaz─▒ya ba┼člamak istiyorum. Haz─▒r m─▒s─▒n─▒z? ─░┼čte geliyooor. ­čžÉ­čöą

ÔÇťBa┼čar─▒n─▒n bedelini bir d├Ânem i├žin ├Âdemeyenler, ba┼čaramaman─▒n bedelini bir ├Âm├╝r boyu ├Âderler.ÔÇŁ

Mumin Sekman

Bili┼čim Teknolojileri alan─▒nda g├Ârev alan biz geli┼čtiriciler i├žin ba┼čar─▒ hemen hemen her g├Ârevimizde kar┼č─▒m─▒za ├ž─▒kan bir parametre. Basit bir ├Ârnek vermek gerekirse, bir task ├╝zerinde ├žal─▒┼č─▒rken bile ba┼čar─▒ kriterlerini belirliyor ve onlar─▒ yerine getirmeye ├žal─▒┼č─▒yoruz. Yaz─▒n─▒n ba┼čl─▒─č─▒nda ÔÇťfinallyÔÇŁ yazmas─▒n─▒n bir sebebi var. Hemen hemen bir y─▒l ├Ânce geli┼čtirdi─čim ve ├╝zerinde ├žok say─▒da ba┼čar─▒ kriterini yerine getirdi─čim isimli k├╝t├╝phanemin bir y─▒l sonra makalesini yaz─▒yor olmak asl─▒nda bir ba┼čar─▒s─▒zl─▒k. Open Source uygulamalar veya k├╝t├╝phaneler geli┼čtirmek biz geli┼čtiriciler i├žin ├Ânemli bir ba┼čar─▒ ancak mevcut i┼č yo─čunlu─čundan bu yap─▒lara vakit ay─▒ramamak ve yeni ├Âzellikleri kazand─▒ramamak da ayn─▒ oranla bir ba┼čar─▒s─▒zl─▒k g├Âstergesi. ├çok uzun bir girizgah oldu─čunun fark─▒nday─▒m. Daha fazla can─▒n─▒z─▒ s─▒kmadan EF Core ile beraber sorgularam─▒z─▒n performans─▒n─▒ nas─▒l izleyece─čimizi ve bunun yan─▒ s─▒ra uygulama i├žerisinde en yava┼č ve en h─▒zl─▒ endpointlerimizi yard─▒m─▒yla nas─▒l bulabilece─čimizi incelemeye ba┼člayal─▒m. ­čžÉ

ÔÇťThis is Sparta!!!ÔÇŁ unutulmaz bir replik benim i├žin. ├ľzellikle backend ekosisteminde uygulama geli┼čtiren bir geli┼čtiriciyseniz ┼ču c├╝mleleri duydu─čunuza eminim.
ÔÇťxxx isimli endpointin cevap vermesi i├žin x saniye veya milisaniye s├╝re ge├žmesi gerekiyor. Burada bir sorun var! Bu endpointin daha h─▒zl─▒ cevap vermesi gerekiyor.ÔÇŁ

Bu c├╝mleleri duydu─čumda kendimi tekme atan de─čil tekme yiyen adam gibi hissediyorum.
├ľrne─čin isimli bir endpointe sahip oldu─čumuzu ve bu endpointin cevap vermesi i├žin 2 saniye ge├žmesi gerekti─čini d├╝┼č├╝nelim.
2 saniye, ger├žekten ├žok uzun bir s├╝re. Sadece son kullan─▒c─▒ i├žin de─čil, geli┼čtirici i├žin de ├žok uzun ve ├žok karma┼č─▒k bir s├╝re.
Son kullan─▒c─▒ veya testi ger├žekle┼čtiren tak─▒m arkad─▒┼č─▒n─▒z neden 2 saniye sonra cevap verdi─čini anlamaya ├žal─▒┼č─▒rken biz geli┼čtiriciler neden 2 saniye i├žinde cevap veremedi─čini anlayamaya ├žal─▒┼č─▒yoruz.

Temel anlamda ikisi de ayn─▒ soru gibi g├Âz├╝kebilir. Ancak biz geli┼čtiriciler genelde tekmeyi yiyip o sonsuz ├žukara d├╝┼č├╝yoruz. Tekmeyi atan ise genelde son kullan─▒c─▒lar oluyor.

Ay┼če teyzenin yol haritas─▒ ­čĄú­čĹÁ

Bize tekmeyi atan Ay┼če teyze uygulama i├žerisinde hangi ad─▒mlardan ge├žti k─▒saca ├Âzetlemek i├žin ├žizdi─čim sembolik resim ├╝zerinden ilerleyelim.

  • Ay┼če teyzemiz bir request at─▒yor
  • Bu istek uygulamam─▒z─▒n ├žal─▒┼čt─▒─č─▒ sunucuya geliyor
  • Sonucun verilmesi i├žin bir pipeline ayaklan─▒yor
  • ─░stek bu pipeline i├žerisinde authentication, authorization ve tan─▒mlanan ba┼čka ad─▒mlardan ge├žiyor
  • ─░stenilen cevap kulland─▒─č─▒m─▒z herhangi bir cache provider ├╝zerinde var m─▒ diye kontrol ediliyor
  • Sonu├ž varsa Ay┼če teyze sonucunu al─▒yor ve dua ediyor ­čĄ▓­čÖĆ
  • E─čer sonu├ž cache ├╝zerinde yoksa relational veya document bir veri taban─▒ ├╝zerinden sonu├ž i┼členiyor ve Ay┼če teyzeye g├Âsteriliyor

Bu ad─▒mlar art─▒r─▒labilir veya azalt─▒labilir ama g├╝n├╝n sonunda Ay┼če teyze bize tekmeyi at─▒yor ve biz bu ad─▒mlar ├╝zerinde nerelerde sorun olabilece─čini ├žaresizce ara┼čt─▒r─▒rken o sonsuz ├žukura d├╝┼č├╝yoruz.

┼×imdi hep beraber Ay┼če teyzenin yol haritas─▒nda nerelerde sorun olabilece─čini inceleyelim;

  • Ay┼če teyze d─▒┼č g├╝├žlerin bir ajan─▒ olabilir ve bir request atmak yerine binlerce request at─▒p DDoS (Denial-of-service attack) ba┼člatm─▒┼č olabilir. Bu senaryoda sunucumuzun anl─▒k olarak cevap verebilece─či limitler kontrol edilmeli ve sunucumuzun anl─▒k durumu kontrol edilmeli. (CPU, RAM kullan─▒m─▒ vb.)
  • Request-Response aras─▒nda ├žal─▒┼čan pipeline itemlar─▒n veya bir di─čer ad─▒yla middleware olarak tan─▒mlad─▒─č─▒m─▒z kod bloklar─▒ uzun s├╝r├╝yor olabilir.
  • Authentication i├žin kulland─▒─č─▒m─▒z servis Ay┼če teyzenin authenticate olup olmad─▒─č─▒n─▒ kontrol ederken cevap vermekte zorlan─▒yor olabilir.
  • Cache i├žin kulland─▒─č─▒m─▒z sa─člay─▒c─▒ya (memory cache, redis vb.) ba─član─▒rken veya cache ├╝zerindeki veriler kontrol edilirken ├žok fazla zaman harc─▒yor olabiliriz.
  • Relational veya document veri taban─▒na ba─član─▒rken bir network problemi ya┼č─▒yor olabiliriz.
  • Ay┼če teyzenin istedi─či sonu├ž kulland─▒─č─▒m─▒z veri taban─▒ ├╝zerinde hesaplan─▒rken zaman harc─▒yor olabiliriz. (Index, View function, Stored Procedure)
  • Veri taban─▒ ├╝zerinden al─▒nan sonucu uygulamam─▒z i├žerisinde anlamland─▒r─▒rken zaman harc─▒yor olabiliriz.
  • Serialization and Deserialization gibi i┼člemleri ger├žekle┼čtirirken Ay┼če teyzeyi uzun s├╝re bekletiyor olabiliriz.

Yukar─▒da bahsetti─čim bu sorunlar art─▒r─▒labilir veya azalt─▒labilir. G├Âzlemlerim ve deneyimlerim do─črultusunda g├Ârd├╝─č├╝m operasyon ┼ču ┼čekilde ger├žekle┼čiyor;

Ay┼če teyzenin ger├žekle┼čtirdi─či istek sonucunda bu kadar uzun beklemesi kesinlikle veri taban─▒ ├╝zerinde ger├žekle┼čen bir problem olabilir. Bu sebeple;

  • Indexleri kontrol etmeliyim
  • Veri taban─▒ ile ileti┼čim kurup, sorguyu ne kadar s├╝rede execute etti─čine bakmal─▒y─▒m
  • Ay┼če teyzenin sorgusunu bir de sunucuya ba─član─▒p ilgili veri taban─▒ ├╝zerinde T-SQL olarak ├žal─▒┼čt─▒r─▒p ne kadar s├╝rede yan─▒t verdi─čini kontrol etmeliyim
  • Gerekirse bu sorguyu stored procedure olarak haz─▒rlay─▒p daha h─▒zl─▒ yan─▒t vermesini sa─člamal─▒y─▒m
  • Sonu├ž yine istedi─čim seviyede olmazsa bu sorguyu cache ├╝zerinde saklamay─▒l─▒m ve her seferinde veri taban─▒na gitmemeliyim
  • Hala d├╝zelmediyse yapacak bir ┼čey yok sorun Ay┼če teyzededir

Bir dakika! Neden hemen sorunun veri taban─▒ ├╝zerinde oldu─čunu d├╝┼č├╝nd├╝n? Belki sorun authentication ad─▒m─▒nda, belki sunucumuz anl─▒k bir yo─čunluk ya┼čad─▒, belki serialization and deserialization ad─▒m─▒nda bir sorun var. ­čĄö

Uzun laf─▒n k─▒sas─▒ asl─▒nda sorun ├žok farkl─▒ yerlerde olabilirken biz geli┼čtiriciler ilk olarak belki de son bakmam─▒z gereken alana odaklan─▒yoruz. G├Âzlemlerime ve deneyimlerime g├Âre do─čru kurgulanm─▒┼č bir veri taban─▒ varsa genellikle sorun, veri taban─▒na gelmeden ├Ânceki ad─▒mlarda ortaya ├ž─▒k─▒yor.

­čÄë─░┼čte tam bu noktada k├╝t├╝phanesi hayat─▒m─▒z─▒ kolayla┼čt─▒r─▒yor.

bu ve buna benzer sorunlarda ilk odakland─▒─č─▒m─▒z yer olan veri taban─▒ ├╝zerinde ger├žekle┼čen operasyonlar─▒ bizim i├žin raporluyor. Ek olarak sistem ├╝zerinde kullan─▒lan endpointler aras─▒nda en yava┼č veri taban─▒ i┼člemini ger├žekle┼čtiren endpointi bulubaliyor.

G├╝nl├╝k hayattan ├Ârnekler vererek konuyu teknik detaylardan uzak bir dille anlatt─▒─č─▒m─▒za g├Âre art─▒k Ay┼če teyzenin sorununu ├ž├Âz├╝p hay─▒r duas─▒n─▒ almak i├žin k├╝t├╝phanesinin nas─▒l ├žal─▒┼čt─▒─č─▒n─▒ anlayal─▒m ve sonras─▒nda uygulamam─▒za nas─▒l implemente edilece─čini inceleyelim. ­čÖĆ­čĄ▓

Easy Profiler K├╝t├╝phanesinin Amac─▒ Ne? ­čĄöÔŁô

Easy Profiler Dotnet uygulamalar─▒nda kulland─▒─č─▒n─▒z veri taban─▒n─▒ EF Core yard─▒m─▒yla track etmeye ba┼čl─▒yor. Context ├╝zerinde ger├žekle┼čen i┼člemleri raporluyor ve k├╝t├╝phanenin son kullan─▒c─▒s─▒ olan geli┼čtiricilere baz─▒ raporlar haz─▒rl─▒yor.

Easy Profiler K├╝t├╝phanesi Nas─▒l ├çal─▒┼č─▒yor? ­čĄöÔŁô

EasyProfiler k├╝t├╝phanesinin ilham kayna─č─▒ EF Core 3.x ile aram─▒za kat─▒lan Interceptor ├Âzelli─čidir.

Kelime anlam─▒ devreye girme, kesme, araya girme olan bu ├Âzellik ile database i┼člemleri i├žin araya girip kendi komutlar─▒n─▒z─▒ yazabilirsiniz.

SELECT [c].[CustomerId], [c].[CreateDate], [c].[IsActive], [c].[Name], [c].[PhoneNumber], [c].[Surname], [c].[UpdateDate]FROM [Customers] AS [c] order by 1 desc

ÔÇťEF Core Database ProvidersÔÇŁ c├╝mlesini aratt─▒─č─▒n─▒zda kar┼č─▒n─▒za ├ž─▒kan veri tabanlar─▒;

  • PostgreSql
  • SQL Server
  • MySQL
  • Oracle
  • MariaDb

yukar─▒daki gibi oluyor. O zaman i┼čimiz kolay. Kulland─▒─č─▒m─▒z interceptor ├Âzelli─či herhangi bir veri taban─▒na ├Âzel olmayacakt─▒r. EF Core ile bu ├Âzelli─či kulland─▒─č─▒m─▒z i├žin istedi─čimiz bir provider ├╝zerinde bu interceptor ├Âzelli─čini ├žal─▒┼čt─▒rabiliriz.
Ama listede en ├žok kullan─▒lan bir veri taban─▒ eksik. Mongo ­čÜÇ

Mongo ├ťzerinde Interceptor Nas─▒l Sa─član─▒r? ­čĄöÔŁô

Mongo i├žin context objemizi yarat─▒rken baz─▒ ayarlamalar yapabiliyoruz.
├ľrne─čin;

  • ServerAddress
  • ConnectionTimeout

gibi ayarlar─▒ ger├žekle┼čtirdi─čimiz yerde gizlenmi┼č bir feature var.

i├žerisinde ve i├žin araya girebiliyoruz.
E─čer bu iki event aras─▒nda veri payla┼č─▒m─▒n─▒ ├ž├Âzebilirsek o zaman mongo kullan─▒lan uygulamalarda da interceptor kurgusunu ├žal─▒┼čt─▒rabiliriz.

ClusterBuilderExtensions.cs

Yukar─▒da bahsetti─čimiz ve nesneleri ├╝zerine extension metodlar yazarak ilgili command ├╝zerinde bulunan;

  • OperationId
  • CommandName
  • CommandText
  • Command Duration

gibi bilgilere ula┼čabiliyoruz. Art─▒k ├Ân├╝m├╝zde bir engel yok. Interceptor mant─▒─č─▒n─▒ hem relational veri tabanlar─▒nda hem de mongo ├╝zerinde sa─člayabiliriz.

Easy Profiler Bu Verileri Nas─▒l Sakl─▒yor ­čĄöÔŁô

K├╝t├╝phanenin ilk s├╝r├╝mlerinde interceptor ├Âzelli─či ile veri taban─▒ ├╝zerinde yap─▒lan operasyonlar anl─▒k olarak belirtti─činiz veri taban─▒ ├╝zerinde isimli bir tabloya kaydediliyordu. Ancak k├╝t├╝phanenin kullan─▒m─▒ artt─▒k├ža ve en ├Ânemlisi, production ortamlar─▒nda kullan─▒lmaya ba┼čland─▒k├ža Easy Profiler kullan─▒m─▒nda, veri taban─▒ sorgular─▒n─▒n performans─▒n─▒n ortalama %6.2 oran─▒nda d├╝┼čt├╝─č├╝n├╝ g├Âzlemledik. Yani 100 ms s├╝ren bir veri taban─▒ sorgusu art─▒k 106.2 ms s├╝r├╝yordu. ─░nsan g├Âz├╝n├╝n 40ms alt─▒nda ger├žekle┼čen olaylar─▒ handle edemedi─čini bilsek de yo─čun kullan─▒lan servislerde anl─▒k y├╝k ├žok artt─▒─č─▒ i├žin interceptor i├žerisinde bulunan logic par├žalar─▒ uygulamay─▒ performans anlam─▒nda geri g├Ât├╝rmeye ba┼člad─▒─č─▒ inkar edilemezdi. Biraz daha basitle┼čtirerek anlatmak gerekirse; Easy Profiler taraf─▒ndan kullan─▒lan bir interceptor, sorguyu yar─▒da kesip kendi logiclerini ├žal─▒┼čt─▒r─▒yor ve datay─▒ i┼čliyordu. Her sorguda b├Âyle bir maliyet bizi ve son kullan─▒c─▒lar─▒ rahats─▒z edince bu i┼člemin ger├žekle┼čece─či zaman dilimini geli┼čtiricilerin karar─▒na b─▒rakma karar─▒ ald─▒k.

E─čer 2.0.x ve ├╝zeri bir s├╝r├╝m├╝ kullan─▒yorsan─▒z initialize esnas─▒nda bir resulation se├žimi yapman─▒z gerekir.
- High (Her dakika)
- Medium (─░ki dakikada bir kere)
- Low (Be┼č dakikada bir kere)
se├žti─činiz bu yap─▒lar arka tarafta bir background job olu┼čturuyor ve bu aral─▒kta ger├žekle┼čen veri taban─▒ operasyonlar─▒n─▒ logluyor.
Evet yine her i┼člemde araya giren ancak yo─čun logic bar─▒nd─▒rmayan bir s├╝r├╝m ile %6.2 olan bu i┼člemi %1.8 seviyesine indirmeyi ba┼čard─▒k.
Arka tarafta ├žal─▒┼čan background i┼čleri i├žin kendi geli┼čtirdi─čimiz bir k├╝t├╝phaneyi kulland─▒k. Her ne kadar hangfire bu konuda ├žok ba┼čar─▒l─▒ olsa da ÔÇťEasy Profiler k├╝t├╝phanesini kullanmak istiyorsan Hangfire k├╝t├╝phanesini de kullanmal─▒s─▒nÔÇŁ gibi bir zorlama yapmak istemedik.

EasyCronJob k├╝t├╝phanesine ve detayl─▒ inceleme makalesine a┼ča─č─▒daki linklerden ula┼čabilirsiniz.

Makale

Repository

Ek olarak belirtilen veri taban─▒ i├žerisinde isimli bir ┼čemada verilerini saklar. B├Âylece kendi ┼čeman─▒zdan kolayca ay─▒rabilirsiniz ve backup senaryolar─▒n─▒z─▒ d├╝zenleyebilirsiniz.

Easy Profiler K├╝t├╝phanesi Nas─▒l Kullan─▒l─▒r (Relational Database)­čĄöÔŁô

Easy Profiler ┼čimdilik;

  • SQL Server
  • PostgreSQL
  • MariaDb
  • MySQL

relational veri tabanlar─▒n─▒ destekler. Kulland─▒─č─▒m─▒z veri taban─▒na g├Âre ilgili paketi nuget ├╝zerinden indirerek kuruluma ba┼člayabilirsiniz.

Install-Package EasyProfiler.PostgreSQL -Version 2.2.0Install-Package EasyProfiler.MariaDb -Version 2.2.0Install-Package EasyProfiler.SQLServer -Version 2.2.0

Bu yaz─▒ ├╝zerinde PostgreSQL ├╝zerinde basit bir ├Ârnek yaparak ilerleyece─čim.

Startup.cs

kendi ┼čemas─▒n─▒n i├žerisinde verilerini saklad─▒─č─▒n─▒ art─▒k biliyoruz. i├žerisinde ilk olarak verilerin saklanmas─▒n─▒ istedi─čimiz sunucu bilgilerini ve bu i┼člemin s─▒kl─▒─č─▒n─▒ belirliyoruz.

├╝zerinde , ve tipinde haz─▒r s─▒kl─▒klar bulanmakla beraber isterseniz istedi─činiz bir cron de─čerini vererek de i┼člem s─▒kl─▒─č─▒n─▒ ayarlayabilirsiniz.

Bir sonraki ad─▒m olarak kendi veri taban─▒n─▒z─▒ initialize etti─činiz k─▒s─▒mda k├╝├ž├╝k bir extension metodunu ├ža─č─▒rmal─▒s─▒n─▒z.

Startup.cs

Art─▒k son ad─▒mday─▒z. uygulaman─▒z ayakland─▒─č─▒nda belirtti─činiz sunucu ├╝zerinde migrationlar─▒ kontrol eder ve eksik migration varsa uygular. B├Âylece yeni s├╝r├╝mlerde i├žerisindeki veri taban─▒ nesnelerinde de─či┼čiklik veya yeni eklenen nesneler varsa kendi kendini g├╝nceller. Bu i┼člemi yapabilmesi i├žin i├žerisinde aray├╝z├╝n├╝ kullanan extension metodunu ├ža─č─▒rman─▒z yeterli olacakt─▒r.

Startup.cs

Configuration a┼čamas─▒ bu kadar. Hadi uygulamam─▒zda ne oluyor izleyelim.­čĄô

Sonu├ž ­čĄöÔŁô

Sonu├žlar─▒ g├Ârmenin 3 farkl─▒ y├Ântemi var. Hadi ├Â─črenelim. ­čĄô

**Manuel**

Belirtti─činiz sunucu ├╝zerinde isimli ┼čemaya gidin. isimli tablonun i├žerisinde uygulaman─▒z─▒n verilerini g├Ârebilirsiniz.

**Az Manuel Az Otomatik (Tiptronik ­čĄú)**

Dependency Injection ile servisini al─▒n.
Bu servis ├╝zerinde bulunan ve metodlar─▒n─▒ kullanarak verilerinizi g├Ârebilirsiniz.

BaseService.cs

**Full Otomatik**

k├╝t├╝phanesini nuget ├╝zerinden indirin.
Bu k├╝t├╝phane ile built-in endpointlere sahip olacaks─▒n─▒z. Bu endpointleri kullanarak a┼ča─č─▒daki sonu├žlar─▒ edinebilirsiniz.

  • En yava┼č endpoint
  • En h─▒zl─▒ endpoint
  • En ├žok kullan─▒lan endpoint
  • Advanced Filter

~En Yava┼č Endpoint~

METHOD : GET
URL : {BASE_URL}/easy-profiler/slowest-endpoint

slowestEndpointResponse.json

~En H─▒zl─▒ Endpoint~

METHOD : GET
URL : {BASE_URL}/easy-profiler/fastest-endpoint

fastestEndpointResponse.json

~En Çok Kullanılan Endpoint~

METHOD : GET
URL : {BASE_URL}/easy-profiler/most-requested-endpoint

mostRequestedEndpoint.json

~Advanced Filter~

METHOD : GET
URL : {BASE_URL}/easy-profiler/advanced-filter

~~ Sort Properties for Advanced Filter ~~

  • {BASE_URL}/easy-profiler/advanced-filter?sort=Duration
  • {BASE_URL}/easy-profiler/advanced-filter?sort=Query
  • {BASE_URL}/easy-profiler/advanced-filter?sortBy=Ascending&sort=Duration
  • {BASE_URL}/easy-profiler/advanced-filter?sortBy=Ascending&sort=Query
  • {BASE_URL}/easy-profiler/advanced-filter?sortBy=Descending&sort=Duration
  • {BASE_URL}/easy-profiler/advanced-filter?sortBy=Descending&sort=Query

~~ Filter Properties For Advanced Filter~~

  • BASE_URL}/easy-profiler/advanced-filter?duration.min=1&duration.max=10
  • {BASE_URL}/easy-profiler/advanced-filter?duration.min=1&duration.max=10&queryType=SELECT
  • {BASE_URL}/easy-profiler/advanced-filter?duration.min=1&duration.max=10&queryType=SELECT&page=1&perPage=10
  • {BASE_URL}/easy-profiler/advanced-filter?requestUrl=getAllCustomer&duration.min=1&duration.max=10&queryType=SELECT&page=1&perPage=10
  • {BASE_URL}/easy-profiler/advanced-filter?requestUrl=getAllCustomer&duration.min=1&duration.max=10&queryType=SELECT&page=1&perPage=10&combineWith=Or
  • {BASE_URL}/easy-profiler/advanced-filter?requestUrl=getAllCustomer&duration.min=1&duration.max=10&queryType=SELECT&page=1&perPage=10&query=customer

─░lerleyen s├╝r├╝mlerde ├╝zerine yeni parametreler eklenebilir. E─čer kullanmak istedi─činiz parametreler varsa bu yaz─▒ya yorum olarak yazabilirsiniz veya github ├╝zerinden issue a├žabilirsiniz.

Roadmap & Product Backlog ­čôŁ

Yaz─▒n─▒n bu a┼čamas─▒nda sizlere planlanan i┼člerden bahsetmek istiyorum. B├Âylece hep beraber i├žin hayal kurabilece─čiz. Sizlerin de eklemek istedi─či yeni ├Âzellikler varsa yorum olarak belirtmeniz ├žok faydal─▒ olacakt─▒r. G├╝n├╝n sonunda bir ├╝r├╝n ve bu ├╝r├╝n├╝n kullan─▒c─▒lar─▒ geli┼čtiriciler oldu─ču i├žin dedi─čimiz metrikler bizim i├žin ├žok ├Ânemli.

Supported Databases ­čŚâ´ŞĆ

tamamiyle database based bir library oldu─ču i├žin desteklenen veri tabanlar─▒ olduk├ža ├Ânemli. ┼×u an desteklenen veri tabanlar─▒na ek olarak dotnet d├╝nyas─▒nda en ├žok kullan─▒lan veri tabanlar─▒n─▒ listeledik ve bir s─▒ralama olu┼čturduk.

  • Oracle
  • Firebird
  • SQLite

ilerleyen s├╝r├╝mlerde yukar─▒da bahsetti─čim veri tabanlar─▒n─▒ da destekleyecek yeni yap─▒lar kurmak bizim ├Âncelikli hedefimiz.

Report Module ­čôî

Veri varsa bu verileri anlamd─▒rmak ve g├Ârselle┼čtirmek genelde iyi bir yakla┼č─▒m olacakt─▒r. Yukar─▒da bahsetti─čim k─▒sm─▒ asl─▒nda bu ├Âzelli─če g├Âz k─▒rp─▒yor. ­čśë
Ancak ilerleyen s├╝r├╝mlerde rapor mod├╝l├╝n├╝ biraz daha geli┼čtirmeyi d├╝┼č├╝n├╝yoruz. ┼×u an bulunan raporlara ek olarak;

  • Toplam Read Say─▒s─▒
  • Toplam Insert Say─▒s─▒
  • Toplam Update Say─▒s─▒
  • Toplam Delete Say─▒s─▒

gibi ├Âzellikleri de eklemek istiyoruz.

Rapor mod├╝l├╝ ile birlikte ve mod├╝llerini de k├╝t├╝phane i├žerisinde konumland─▒rmay─▒ d├╝┼č├╝n├╝yoruz. Hadi bu mod├╝lleri de inceleyelim.

Limit ve Notification ­čÖł­čöŐ

7/24 uygulaman─▒n ba┼č─▒nda olamayaca─č─▒m─▒z bir ger├žek. Notification mod├╝l├╝ ile belirledi─činiz saatlerde sistemin o aral─▒kta ger├žekle┼čtirdi─či t├╝m i┼člemler desteklenen kanallar ├╝zerinden sizinle payla┼č─▒lacak.

Her tak─▒m veya her ┼čirket kendine g├Âre bir channel kulland─▒─č─▒ i├žin burada dinamik bir channel mant─▒─č─▒ olu┼čturmak istiyoruz. Ancak ka─č─▒t ├╝zerinde karar verdi─čimiz baz─▒ kanallar a┼ča─č─▒da listelenmi┼čtir;

  • Slack
  • Discord
  • Sms
  • Email
  • Microsoft Teams
  • Push Notification
  • Web Hook
  • Amazon SQS/SNS
  • Kafka Event
  • RabbitMQ Event
  • Azure Service Bus

Limit ├Âzelli─či asl─▒nda notification mod├╝l├╝n├╝ do─črudan kullanan bir mod├╝l olarak tasarland─▒. Uygulaman─▒z i├žerisinde her mod├╝l farkl─▒ bir ├Ânceli─če sahip olabilir. A mod├╝l├╝ sizin i├žin ├žok ├Âncelikli iken B mod├╝l├╝ normal ├Âncelikli olabilir. Limit mod├╝l├╝ ile belirledi─činiz veya sistemin genelinde ger├žekle┼čen operasyonlar i├žin bir limit tan─▒m─▒ yapabileceksiniz. ├ľrne─čin tablosunda ger├žekle┼čen sorgular─▒ 25 ms ├╝zerinde olursa notification g├Ânder gibi i┼člemleri ger├žekle┼čtirebileceksiniz. Limit ve Notification mod├╝l├╝ ile sistem i├žerisinde alert mekanizmalar─▒ kurup kurallar─▒n─▒za tak─▒lan bir i┼člem olursa an─▒nda bilgilendirileceksiniz.

Real-Time Dashboard ­čôŞ

En ├žok heyecanland─▒─č─▒m─▒z mod├╝l olan dashboard ├Âzelli─či ile sistem i├žerisinde ger├žekle┼čen olaylar─▒ real-time bir ┼čekilde izleyebileceksiniz. Geli┼čtirdi─čimiz ├╝r├╝nlerde art─▒k monitoring kavram─▒ hi├ž olmad─▒─č─▒ kadar b├╝y├╝k bir ├Ânem arz ediyor. Dashboard ├Âzelli─či ile monitoring sorunun ├ž├Âzmekle kalmay─▒p isterseniz kendinize ├Âzel rapor ekranlar─▒ olu┼čturabileceksiniz. Ek olarak limit de─čerlerinizi g├╝ncelleyip sisteminizi anl─▒k filtreleyebileceksiniz.

Yaz─▒n─▒n son k─▒sm─▒nda bahsetti─čim bu ├Âzellikler birer hayalden ibaret. Hayallerimizi ger├žekle┼čtirmek i├žin kollar─▒ s─▒vad─▒k ve ka─č─▒t ├╝zerinde planlamalar─▒m─▒z─▒ ger├žekle┼čtirdik. Sizlerin de eklemek istedi─či ├Âzellikler olursa github ├╝zerinde fork butonuna t─▒klayarak ba┼člayabilirsiniz. Unutmay─▒n ÔÇťBa┼člamak bitirmenin yar─▒s─▒d─▒rÔÇŁ ­čśë

E─čer size yard─▒mc─▒ olduysa veya bak─▒┼č a├ž─▒n─▒za farkl─▒l─▒k katt─▒ysa star vererek destek olabilirsiniz.

Kodlar─▒n─▒z production ortam─▒nda hatas─▒z ko┼čsun, testler sizi korusun. ­čÖĆ

Happy Coding ­čĹęÔÇŹ­čĺ╗

Solution Developer ÔÇö I want to change the world, give me the source code.