MiniProfiler'ı kullanma

Bu makalede, uygulamanızın performansını ölçmek için ASP.NET Core'da MiniProfiler'ı nasıl etkinleştirileceği ile ilgili.

Category Optimization | Tags: Profiler, Performance

Published: 07 Eylül 2021

MiniProlifer, ASP.NET Core Uygulamalarında çalışan kodların profilini çıkarmanıza izin vererek uygulamanızın nasıl performans gösterdiğini anlamanıza yardımcı olur.

Profil Oluşturmak için nedenler

Her uygulama geliştiricisinin uygulamalarının çalışma ortamında nasıl performans gösterdiğini merak eder. Profil oluşturma kodun daha iyi performans göstermesi için gerekir, yani işlemler hızlı olmalıdır.

Profil oluşturma, kod performansı hakkında ayrıntılı bilgi sağlayacaktır. Herhangi bir kod/işlev yavaş çalışıyorsa, yani beklenenden daha fazla zaman alıyorsa, bu kodun/işlevin bu zamanı nerede harcadığını belirlemeniz gerekir, yani hangi kod parçacığının yavaş çalıştığını bilmeniz gerekir, böylece bu kod parçasını optimize edebilirsiniz.

Profil oluşturucular, önemli çabalar (kod değişiklikleri veya yapılandırma) olmadan, uygulamanın çoğu zamanı nerede geçirdiği hakkında bu bilgileri kolayca yakalamamızı sağlar.

Bir şey doğru çalışmıyorsa, profil oluşturma yardımıyla bunu düzeltmek için adımlar atılabilir.

MiniProfiler nedir?

MiniProfiler ,NET, Ruby, Go ve Node.js için basit ama etkili bir profil oluşturucudur. MiniProfiler, kodun çoğu zamanı nerede harcadığını analiz etmek için ASP.NET Core uygulamalarında kullanılabilecek basit, kullanımı kolay ve hafif bir profil oluşturucudur.

ASP.NET Core'daki Minifprofiler, profil oluşturma verilerini uygulamanızın web sayfasına yerleştirir yani oluşturulan profile erişimi kolaylaştırır. Miniprofiler'den bu verilere erişim, kullanıcı/kullanıcı rollerine göre kontrol edilebilir.

Resmi belgelerden daha fazla bilgi edinebilirsiniz.

Uygulamanıza MiniProfiler ekleme

Burada, yeni veya mevcut uygulamalar için ASP.NET Core'da miniprofiler'i etkinleştireceğiz. Öncelikle Nuget Package Manager'ı kullanarak uygulamaya bir miniprofiler yüklemeniz gerekir.

Paket Yöneticisi'nde aşağıda belirtilen komutları çalıştırın veya Nuget Package Manager'dan gerekli Nuget paketlerini yükleyin. Makalenin tamamı için gerekli tüm paketleri yükleyeceğiz.

MiniProfiler'ı ASP.NET Çekirdeğine Yükleme

 

Install-Package MiniProfiler.AspNetCore
Install-Package MiniProfiler.AspNetCore.Mvc
Install-Package MiniProfiler.EntityFrameworkCore


ASP.NET Core'daki Startup.cs dosyasında MiniProfiler'ı yapılandırma

Startup.cs dosyasında ConfigureServices ve Configure yöntemine aşağıdaki kodu ekleyerek MiniProfiler'ı yapılandırın.

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
   {
        services.AddMiniProfiler(options =>
        {
            options.PopupRenderPosition = StackExchange.Profiling.RenderPosition.BottomLeft;
            options.PopupShowTimeWithChildren = true;
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
       app.UseMiniProfiler();
    }
}


Razor bileşenlerinde MiniProfiler'ı yapılandırma

_ViewImports.cshtml'ye aşağıdaki satırı ekleyin

@using StackExchange.Profiling
@addTagHelper *, MiniProfiler.AspNetCore.Mvc


Bu, MiniProfiler.AspNetCore.Mvc derlemesinde bulunan tüm etiket yardımcılarını (tag helpers) alır.

MiniProfiler etiketini _Layouts.cshtml sayfasına ekleyeceğiz, böylece uygulamanın her sayfasında bu veriye ulaşacağız. _Layouts.cshtml'ye aşağıda belirtilen etiketi ekleyin.

<mini-profiler />

 

Şimdi uygulamayı çalıştırtıktan sonra ASP.NET Core'daki MiniProfiler'den varsayılan verileri alabiliriz. Çalıştıralım ve verileri görüntüleyelim.


ASP.NET Core Web Uygulamasında MiniProfiler varsayılan verilerini görüntüleme


Yukarıdaki ekranda, sayfayı oluşturmak için gereken toplam süreyi görüntüleyen miniprofiler verileri gösterilir. Yukarıda görüntülenen numaraya tıkladığınızda, aşağıda gösterildiği gibi kod yürütme zamanlamalarının ayrıntılarını gösterir.


Yukarıdaki ekranda, varsayılan ayrıntıları, yani denetleyicide harcanan zamanı ve istek http://localhost:5000/ için görünümü işlemek için harcanan zamanı görüntülediğini görebilirsiniz. Bu detaylardan, kodun zamanını nerede harcadığını bilebiliriz.

Bu şekilde gerekli URL'lere gidebilir ve istek aldığı andan itibaren geçen toplam süre içerisinde neler olduğunu ayrıntılı bir şekilde görebilirsiniz.

Entity Framework Core için SQL profili oluşturmayı etkinleştirme

ASP.NET Core'daki MiniProfiler, ASP.NET Core uygulamanızda çalışan tüm SQL'leri izleyebilir ve bunlar için veri sağlayabilir. Burada, veri erişim katmanında Entity Framework Core kullanarak ASP.NET Core uygulamasında MiniProfiler'ı etkinleştireceğiz.

Gerekli NuGet paketini (MiniProfiler.EntityFrameworkCore) zaten yükledik.

Şimdi Startup.cs dosyasındaki ConfigureServices yöntemine ek bir yöntem çağrısı eklememiz gerekiyor. 

public void ConfigureServices(IServiceCollection services)
{
    services.AddMiniProfiler(options =>
    {
        options.PopupRenderPosition = StackExchange.Profiling.RenderPosition.BottomLeft;
        options.PopupShowTimeWithChildren = true;
    }).AddEntityFramework();
}


Entity Framework core için profil oluşturmayı etkinleştirdiğimize göre, kodu çalıştıralım ve MiniProfiler tarafından ASP.NET Core'da görüntülenen verileri kontrol edelim. Uygulamayı çalıştırdıktan sonra, SQL adıyla verilere fazladan bir sütun eklendiğini, SQL deyimi tarafından alınan süreyi görüntülediğini ve köşeli ayraçlar içinde yürütülen SQL sayısı olduğunu görebilirsiniz. SQL için SQL sütun ayrıntılarında görüntülenen sayıya tıkladıktan sonra aşağıda gösterildiği gibi kullanılabilir.


Özel kod için profil oluşturmayı etkinleştirme

Burada, bazı hesaplamalar veya işleme gibi belirli bir kod parçacığının performansını nasıl takip edeceğimizi göreceğiz.

Gerekli NuGet paketini (MiniProfiler.AspNetCore) zaten yükledik. Belirli bir kod bloğu için geçen süreyi ölçmek için MiniProfiler'in Step işlevini kullanacağız.

Step işlevi belirtilen kod bloğu için yeni bir zamanlayıcı başlatır ve MiniProfiler'dan gelen verilerde görüntülemek için bir açıklama alır.

Örnek olsun diye, Post Denetleyicisinin Details eylemine aşağıdaki kodu ekledim.

public IActionResult Details(string id)
{
    Post post = null;
    using (MiniProfiler.Current.Step("Load Posts & Find Specific Post"))
    {
        post = DataHelper.GetAllPosts().Find(p => p.Id.Equals(id));
    }
    return View(post);
}


Artık özel bir kod bloğu için profil oluşturma eklediğimize göre, kodu çalıştıralım ve MiniProfiler tarafından görüntülenen verileri kontrol edelim. Uygulamayı çalıştırdıktan sonra Posts-Details sayfasına gidin. Özel blok kod profilinden zamanlamalar ve açıklama ile ayrıntılar sonrası istek için fazladan bir satır eklendiğini göreceksiniz.

ADO.NET sorguları için profil oluşturmayı etkinleştirme

Bu, yani veri erişim katmanında Entity Framework Core kullanmayan, yani ADO.NET kullanan uygulamalar içindir. Gerekli NuGet paketini zaten yükledik, yani StackExchange.Profiling. StackExchange.Profiling ad alanından ProfiledDbConnection sınıfını kullanmanız gerekiyor ve oluşturucusu bağlantı dizesini giriş olarak alır.

Örnek olarak, aşağıdaki kodu herhangi bir eylem yönteminde kullanabilirsiniz.

using (SqlConnection connection = new SqlConnection(@"Data Source=(localdb)....."))
{
    using (ProfiledDbConnection profiledDbConnection = new ProfiledDbConnection(connection, MiniProfiler.Current))
    {
        if (profiledDbConnection.State != System.Data.ConnectionState.Open)
            profiledDbConnection.Open();
        using (SqlCommand command = new SqlCommand
         ("Select * From Posts", connection))
        {
            using (ProfiledDbCommand profiledDbCommand =
              new ProfiledDbCommand(command, connection,
                MiniProfiler.Current))
            {
                var data =
                 profiledDbCommand.ExecuteReader();
                //Write code here to populate the list of Posts
            }
        }
    }
}


Şimdi bir ADO.NET SQL için profil oluşturma eklediğimize göre kodu çalıştıralım ve MiniProfiler tarafından görüntülenen verileri kontrol edelim. Uygulamayı çalıştırdıktan sonra gönderiler sayfasına gidin ve MiniProfiler ayrıntılara tıklayın. Gördüğünüz gibi, ADO.NET'daki SQL ayrıntıları MiniProfiler verilerinin bir parçası olarak görüntüleniyor.

MiniProfiler verileri nasıl güvenli hale döndürülr?

Gördüğünüz gibi MiniProfiler birçok yararlı veri sağlıyor. Bu veriler varsayılan olarak herhangi bir kısıtlama olmadan tüm kullanıcılar için kullanılabilir. Şimdi  bu verileri yalnızca geliştiricilerin görmesi için verilere erişimi kısıtlamak isteyebilirsiniz.

Ayrıca, son kullanıcıların görmesini istemediğiniz işlev adları, SQL'ler vb. gibi bir sürü detay var.

Verilere erişimi belirli bir kullanıcı veya kullanıcı rolüyle sınırlamak için aşağıdaki kodu kullanabilirsiniz.

services.AddMiniProfiler(options =>
{
    options.PopupRenderPosition = StackExchange.Profiling.RenderPosition.BottomLeft;
    options.PopupShowTimeWithChildren = true;
    options.ResultsAuthorize = (request=> request.HttpContext.User.IsInRole("Developer");
    options.UserIdProvider = (request=> request.HttpContext.User.Identity.Name;
}).AddEntityFramework();


Bu, son kullanıcılara veri açığa aktarmadan üretim ortamınızda MiniProfiler'ı etkinleştirmenizi sağlar.

Özet

Bu makalede, ASP.NET Core'daki MiniProfiler'ı kodun çoğu zamanı nerede harcadığını analiz etmek için kullabileceğimizi gördük. Bu, kodunuzu en iyi duruma getirmek için kullanılabilir. MiniProfiler'ı çok fazla çaba sarf etmeden yapılandırabildik ve ayrıca ayrıntılı varsayılan veriler kutudan çıktı.