MiniProfiler - ASP.NET Core

MiniProfiler - ASP.NET Core

Image for post

Merhaba arkadaşlar,

Bu yazımda MiniProfiler’ı ASP.NET Core uygulamalarınızda nasıl kullanabileceğinizi anlatacağım. Daha önce hiç duymayanlar için kısaca özetlemek gerekirse, MiniProfiler Stack Overflow ekibinin uygulamalarının çalışma zamanlarını ayrıntılı olarak incelemeleri için geliştirdikleri pakettir.

Konular

  • MiniProfiler nedir ve neler yapabilir?
  • MiniProfiler’ı ASP.NET Core uygulamasına ekleme.
  • Entity Framework Core verilerini takip etmek.
  • Custom Timings ve Timing Sections.
  • API üzerinde MiniProfiler
  • Ekstra

MiniProfiler nedir ve neler yapabilir?

MiniProfiler projenizdeki performans ölçmede size yardımcı olabilecek lightweight bir kütüphanedir. Kurulumu gayet basit ve hızlıdır. 🚀

Simple. Fast. Pragmatic. Useful!

Developerlar doğal olarak hızlı uygulamalar geliştirmek ister, ancak uygulamanın yavaş çalıştığı bölümleri bazen analiz edemeyiz ve istediğimiz performans review’leri yapamayız. MiniProfiler bize kodun çalışma hızı hakkında ayrıntılı ve hızlı şekilde temiz okunaklı bir rapor oluşturur. Bizlerde bu yapılan ölçümler doğrultusunda kodu optimize ederiz…

Measure -> Optimize -> Measure -> Optimize -> Measure

MiniProfiler sayfanın açılma süresinde yapılan işlemlerin sonucu, sayfanın sol alt (ben sol altta seviyorum) bölümüne bir kutucuk içinde gösterir. Her kutucuk bir http request’i temsil etmektedir.

Image for post

Image for post

MiniProfilerın bizim için olutşurduğu analiz sonucu

Kutucuklara tıkladığımızda, request ile ilgili detaylar aşağıdaki şekilde gösterilmektedir. Eğer kutucuğun üstünde 🖱️ faremizi (imleç) tutarsak, http request’in nereye atıldığını görebiliriz.

Image for post

Image for post

MiniProfiler result table

Result table detaylı olarak hangi sorguların ne kadar sürdüğünü bizlere göstermektedir. Parentezlerin içerisinde kaç kere çağrı yapıldığı belirtilmektedir.

Image for post

Image for post

MiniProfiler Aditional Dialog

MiniProfiler bize atılan sql sorguları da dahil olmak üzere bir çok detay vermektedir. Performans problemi gördüğümüz sorguları kolayca yakalayıp, execution planını inceleyip optimize edebiliriz.

MiniProfiler’ı ASP.NET Core uygulamasına eklemek

Nuget aracılığıyla _MiniProfiler.AspNetCore.Mvc_paketini kuruyoruz.

Install-Package MiniProfiler.AspNetCore.Mvc -Version 4.1.0</span>

Sonrasında Startup.cs classımız’a giriyoruz. ConfigureServices() metodumuzda AddMiniProfiler() metodunu çağırıyoruz.

**public** **void** **ConfigureServices**(IServiceCollection services)
{
    // ... configurations</span><span id="a721" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">// AddMiniProfiler metodu bir çok configuration parametresi almaktadır.</span><span id="8844" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">services.AddMiniProfiler(options =></span><span id="7769" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">{
    // MiniProfiler'ın sağ altta görünmesi için</span> <span id="742d" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">options.PopupRenderPosition = RenderPosition.BottomLeft;</span> <span id="cfe7" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">options.PopupShowTimeWithChildren = true;</span> <span id="c7e0" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">});
}</span>

Sonrasında Configure() metoduna UseMiniProfiler() satırını ekliyoruz.

**public** **void** Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ... codes</span> <span id="b5ca" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">app.UseMiniProfiler();
}</span>

Sıra geldi MiniProfileri tag helper’i sayfalarımıza eklemeye. Öncelikle _ViewImport.cshtml‘mize tag helper’ımızı aşağıdaki gibi ekliyoruz.

@addTagHelper *, MiniProfiler.AspNetCore.Mvc</span>

_Layout.cshtml sayfamızın sonuna (footer’ın atına) <mini-profiler /> tagini ekliyoruz. Aşağıdaki ekran görüntüsündeki gibi artık profiling’e hazırız. Ekran görüntüsünde Home/Index sayfası açılırken yapılan request’ler ve time duration’ları görüyoruz. (Makale ile birlikte boş bir proje yarattım.) Makaleyi yazarken aynı zamanda güncelliyor da olacağım. Final kodları için tık GitHub!

Image for post

Image for post

Entity Framework Core verilerini takip etmek

Bence bu özellik MiniProfiler’ın en önemli özelliği ve eklenmesi en basit özellik.

Bu özellikle birlikte request time’da yer alan tüm entity framework çağrılarını plain sql text ile görebiliyoruz. Gerçekten harika. Bu özellik sayesinde query’lerimizi optimize etmek gerçekten çok kolaylaşıyor.

Nuget aracılığıyla _MiniProfiler.EntityFramworkCore_paketini kuruyoruz.

Install-Package MiniProfiler.EntityFrameworkCore -Version 4.1.0</span>

ConfigureServices() de eklemiş olduğumuz AddMiniProfiler metodunun sonuna AddEntityFramework() metodunu ekliyoruz! Done… ✔

**public** **void** **ConfigureServices**(IServiceCollection services)
{
    // ... configurations</span> <span id="3145" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">services.AddMiniProfiler(options =></span><span id="f66a" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">{
     // MiniProfiler'ın sağ altta görünmesi için</span> <span id="520a" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">options.PopupRenderPosition = RenderPosition.BottomLeft;</span> <span id="3936" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">options.PopupShowTimeWithChildren = true;</span> <span id="ad50" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">}).AddEntityFramework(); // Here~!
}</span>

[## arslanaybars/ayb.miniprofiler.sample

You can’t perform that action at this time. You signed in with another tab or window. You signed out in another tab or…

github.com](https://github.com/arslanaybars/ayb.miniprofiler.sample)

Yukarıdaki adreste benim bu makalede kullandığım kaynak kodlar mevcut burada, Index açılırken bazı ef core sorguları yazacağım ve MiniProfiler verisini paylaşacağım.

}</span>

Yukaridaki sorgu sonucunda MiniProfilerin bize söylediği aşağıdadır.

Image for post

Image for post

Yukarıda gördüğümüz gibi total duration 627.9 ms. Hangi aşamalarda ne kadar zaman harcandığı görünmekte, ayrıca entity framework core sorgusunun plain halide dialog sayfasında görünmektedir!

Custom Timings ve Timing Sections

Timing Segments

using (MiniProfiler.Current.Step("name string"))</span>

Yukarıdaki satır ile çalışma planındaki kodları segmentlere bölüp analiz yapmanızı kolaylaştırabilirsiniz. Aşağıdaki ekran görüntüsündeki timing segmentler için MiniProfiler.Current.Step() kodu yazılmıştır. HomeControllerımızda yazılan kodu detaylı görebilirsiniz.

Image for post

Image for post

Custom Timings

Custom Timing için detail içerisinde görünen duration, with children, from start, sql gibi elemanlardır. Bu elemanlara yenisi eklemek için custom timing kullanılır. Ben http request’lerin yapıldığı http client üzerinden yapacağım. Yukarıdakı elemanları http ekleyerek duration ve detayları yazdıracağım. Bunun için http request’lerin yapıldığı base get metodunu aşağıdaki komutu ekliyorum.

using (MiniProfiler.Current.CustomTiming(
       “http”, string.Empty, “Get”))</span>

Kodun tamamı aşağıdaki gibidir. Bu classta http requestlerimizin yapildigini varsayabilirsiniz.

using (MiniProfiler.Current.CustomTiming(
           “http”, string.Empty, “Get”))
    {</span> <span id="32c4" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">var delay = new Random().Next(100, 400);</span> <span id="367b" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">Thread.Sleep(delay);</span> <span id="52e7" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">return text;</span> <span id="999f" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">}</span><span id="600a" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">}</span>

Home controllerımızda çağırdıktan sonra sonuç aşağıdaki ekran görüntüsündeki gibidir. Görüldüğü üzere http (ms) eklenmiştir.

Image for post

Image for post

API üzerinde MiniProfiler

MiniProfiler sadece MVC uygulamarında değil, api uygulamarında da çalışmaktadır. Tek yapmamız gereken

**public** **void** **ConfigureServices**(IServiceCollection services)
{
    // ... configurations </span><span id="4b7c" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">    // unutulmamalıdır.
    services.AddMemoryCache();</span> <span id="00d6" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">// AddMiniProfiler metodu bir çok 
    //configuration parametresi almaktadır.</span> <span id="0c4d" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">services.AddMiniProfiler(options =></span> <span id="8b09" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">{
        options.RouteBasePath = "/profiler";</span> <span id="4def" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">}).AddEntityFramework();
}</span>

NOT : MiniProfiler da olan bir bugtan dolayı services.AddMemoryCache(); services.AddMiniProfiler() satırından önce eklemeyi unutmamalıyız.

Configure() metodunda UseMiniProfiler() diyoruz.

**public** **void** Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ... codes</span> <span id="afa2" class="dy kn it db kk b ko ks kt ku kv kw kq s kr">app.UseMiniProfiler();
}</span>

Artık kullanıma hazır! Tüm requestlere /profiler/result-index adresinden erişilebiliriz.

Image for post

Image for post

Request’lere tıklayarak detaylı profiling sonucuna erişebliriz.

Extra

MiniProfilerın bir çok konfigurasyon ayarı bulunmakta. Başlıca sevdiğim özellikeri aşağıdaki satırlarda belirtiyor olacağım.

Belli kişilerin MiniProfilerı görmesini sağlayan konfigurasyon;

// (Optional) To control authorization, you can use the Func<HttpRequest, bool> options:
        // (default is everyone can access profilers)
        options.ResultsAuthorize = request => **MyGetUserFunction**(request).CanSeeMiniProfiler;
        options.ResultsListAuthorize = request => **MyGetUserFunction**(request).CanSeeMiniProfiler;</span>

Profile edilen dataları loglamak içinde_MiniProfiler.Providers.SqlServer_paketini ekleyip, tabloları yaratıp aşağıdaki satır ile db bağlantısı ayarlanmaktadır.

options.Storage = new SqlServerStorage(Configuration.GetConnectionString(“AybMiniProfilerConnection”));</span>

Tüm konfigurasyonlar aşağıdaki linke tıklayabilirsiniz.

[## MiniProfiler for .NET : ASP.NET Core

If you'd rather learn by example, sample apps are available. The ASP.NET Core sample is here, with the important bits…

miniprofiler.com](https://miniprofiler.com/dotnet/AspDotNetCore)

MiniProfiler’ı ben test ortamlarımıza kurup kullanıyorum. Ancak Stack Overflow production ortamlarında da kullanmaktadır. Linkte MiniProfilerı kullanımı anlattıkları bölüm;

[## Stack Overflow: How We Do Monitoring - 2018 Edition

This is #4 in a very long series of posts on Stack Overflow's architecture. Previous post (#3): Stack Overflow: How We…

nickcraver.com](https://nickcraver.com/blog/2018/11/29/stack-overflow-how-we-do-monitoring/#miniprofiler)

Bu yazıya başlamadan önce bulduğum harika bir sunumun linkini de buraya paylaşıyorum, yine Nick Craver tarafından :) 👏🏻

Kaynak kodlar;

[## arslanaybars/ayb.miniprofiler.sample

Contribute to arslanaybars/ayb.miniprofiler.sample development by creating an account on GitHub.

github.com](https://github.com/arslanaybars/ayb.miniprofiler.sample)

Referans:

[## Using MiniProfiler in ASP.NET Core

This course will help you enable MiniProfiler, which can show you the timing of different code segments within your…

app.pluralsight.com](https://app.pluralsight.com/library/courses/using-miniprofiler-aspdotnet-core/table-of-contents)

Umarım faydalı bir yazı olmuştur. Biz ekip olarak MiniProfiler’dan çok memnun kaldık. Adeta kodları optimize etmek bir oyuna döndü bizim için :)

Ayrıca yeni projelerimizde complex sorgular için MiniProfiler deneyimlerimizden sonra Dapper ile devam etme kararı aldık.