Χρησιμοποιώντας τον MiniProfiler

Αυτό το άρθρο θα σας δώσει τη δυνατότητα να ενεργοποιήσετε τον MiniProfiler στο ASP.NET Core για να μετρήσετε την απόδοση της εφαρμογής σας.

Category Optimization | Tags: Profiler, Performance

Published: 15 Σεπτεμβρίου 2021

Ο MiniProlifer σας βοηθά να παρακολουθήσετε την απόδοση της εφαρμογής σας, επιτρέποντάς σας να σκιαγραφήσετε οποιοδήποτε μέρος του κώδικα σε μία εφαμοργή ASP.NET Core.

Ανάγκη για την παρακολούθηση της απόδοσης

Είναι πολύ προφανές στον κάθε προγραμματιστή εφαρμογών να αναρωτιέται για την απόδοση της εφαρμογής του και πάντα υπάρχει η απαίτηση του κώδικα της εφαρμογή για την βελτιστοποίηση της απόδοση.

Η παρακολούθηση της απόδοσης του κώδικα παρέχει λεπτομέρειες σχετικά με την απόδοση του κώδικα και εάν οποιοσδήποτε κώδικας ή λειτουργία εκτελείται χρονικά αργά, δηλαδή λαμβάνει περισσότερο από το αναμενόμενο χρόνο. Σε αυτήν την περίπτωση θα πρέπει να προσδιορίσετε που δαπανάται αυτός ο χρόνος τις περισσότερες φορές, δηλαδή πρέπει να γνωρίζετε ποιο σημείο του κώδικα εκτελείται αργά, έτσι ώστε μετέπειτα να μπορέσετε να το βελτιστοποιήσετε.

Η παρακολούθηση της απόδοσης μας επιτρέπει να καταγράφουμε εύκολα, χωρίς μεγάλες προσπάθειες (αλλαγές κώδικα ή διαμόρφωση), αυτές τις πληροφορίες με το που ξοδεύει τον χρόνο της εφαρμογή τις περισσότερες φορές.

Εάν κάτι δεν αποδίδει σωστά, τότε μπορούν να ληφθούν τα κατάλληλα μέτρα για να διορθωθεί αυτό το σημείο.

Τι είναι ο MiniProfiler;

Το MiniProfiler είναι ένας απλός αλλά αποτελεσματικός τρόπος παρακολούθηση της απόδοσης για το .NET, το Ruby, το Go και το Node.js. Ο MiniProfiler είναι απλός, εύχρηστος και ελαφρύς αναλυτής απόδοσης που μπορεί να χρησιμοποιηθεί μέσα σε εφαρμογές ASP.NET Core για να τις αναλύσει και να μας φανερώσει που δαπανείται ο χρόνος τις περισσότερες φορές.

Ο Minifprofiler στο ASP.NET Core τοποθετεί τα δεδομένα απευθείας στην ιστοσελίδα της εφαρμογής σας, γεγονός που καθιστά εύκολη την πρόσβασή τους. Προφανώς, η πρόσβαση σε αυτά τα δεδομένα του MiniProfiler, μπορεί να ελεγχθεί με βάση τους ρόλους του χρήστη.

Εδώ περιγράφονται περισσότερες λεπτομέρειες, σύμφωνα με τα επίσημα έγγραφα

Προσθήκη του MiniProfiler στην εφαρμογή σας

Παρακάτω θα ενεργοποιήσουμε τον MiniProfiler σε μία εφαρμογή ASP.NET Core, είτε νέα ή είτε υπάρχουσα εφαρμογή. Αρχικά, χρειάζεται να εγκαταστήσετε τον MiniProfiler στην εφαρμογή χρησιμοποιώντας τη διαχείριση των πακέτων Nuget.
Μπορείτε να εκτελέσετε τις παρακάτω εντολές στη κονσόλα διαχείριση πακέτων ή να εγκαταστήσετε τα απαιτούμενα πακέτα Nuget από τη διαχείριση πακέτων Nuget μέσω του γραφικού περιβάλλοντος. Εμείς θα εγκαταστήσουμε όλα τα πακέτα που απαιτούνται και περιγράφονται στο παρόν άρθρο.

Εγκατάσταση του MiniProfiler στο ASP.NET Core

 

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


Ρύθμιση παραμέτρων του MiniProfiler σε ASP.NET Core στο αρχείο Startup.cs

Ρυθμίστε τις παραμέτρους του MiniProfiler στο έργο σας, προσθέτοντας τον ακόλουθο κώδικα στη μέθοδο ConfigureServices και Configure στο αρχείο Starup.cs

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();
    }
}


Ρύθμιση των παραμέτρων του MiniProfiler στα στοιχεία προβολής σελίδων

Προσθήκη της παρακάτω γραμμής στο _ViewImports.cshtml

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


Αυτό θα εισαγάγει όλους τους βοηθούς ετικετών που βρίσκονται στην βιβλιοθήκη MiniProfiler.AspNetCore.Mvc.

Επίσης προσθέτουμε την ετικέτα MiniProfiler στη σελίδα _Layouts.cshtml, έτσι ώστε να εμφανίζονται τα δεδομένα σε κάθε σελίδα. Προσθέτουμε την παρακάτω ετικέτα μέσα στο _Layouts.cshtml.

<mini-profiler />


Τώρα μετά την εκτέλεση της εφαρμογής θα πρέπει να αρχίσουμε να λαμβάνουμε τα δεδομένα από τον MiniProfiler στο ASP.NET Core. Ας τρέξουμε να δούμε τα δεδομένα.

Προβολή των δεδομένων από τον MiniProfiler


Η παραπάνω οθόνη εμφανίζει τα δεδομένα από τον MiniProfiler, όπου εμφανίζονται οι συνολικοί χρόνοι που χρειάστηκαν για τη φόρτωση της σελίδας. Κάνοντας κλικ στον παραπάνω εμφανιζόμενο αριθμό θα μπορούμε να δούμε περαιτέρω λεπτομέρειες για τους χρονισους εκτέλεσης του κώδικα, όπως παρακάτω:


Στην παραπάνω οθόνη, μπορείτε να δείτε ότι εμφανίζει κάποιες προεπιλεγμένες λεπτομέρειες, δηλαδή το χρόνο που δαπανάται στον ελεγκτή και το χρόνο που δαπανάται για την απόδοση της προβολής για το αίτημα στο http://localhost:5000/. Από αυτές τις λεπτομέρειες, γνωρίζουμε πού ξοδεύεται οχρόνος στον κώδικα τις περισσότερες φορές.

Με αυτόν τον τρόπο μπορείτε να μεταβείτε στην απαιτούμενη διεύθυνση URL και να αναλύσετε το χρόνο που έχει ληφθεί μαζί με τη διακοπή του συνολικού χρόνου που απαιτείται από το αίτημα.

Ενεργοποίηση της παρακολούθησης της απόδοσης για τα ερωτήματα SQLs του Entity Framework Core

Ο MiniProfiler στο ASP.NET Core μπορεί να παρακολουθεί και να παρέχει δεδομένα για όλα τα ερωτήματα SQL που εκτελούνται μέσα στην εφαρμογή. Συγκεκριμένα εδώ, θα ενεργοποιήσουμε τον MiniProfiler χρησιμοποιώντας τον Entity Framework Core στο επίπεδο πρόσβασης των δεδομένων.

Έχουμε ήδη εγκαταστήσει σε προηγούμενο βήμα το απαιτούμενο πακέτο NuGet, δηλαδή MiniProfiler.EntityFrameworkCore και τώρα πρέπει να προσθέσουμε μια επιπλέον κλήση στη μέθοδο ConfigureServices στο αρχείο Startup.cs. Εδώ παρακάτω φαίνεται η τροποποιημένη μέθοδος ConfigureServices:

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


Τώρα που ενεργοποιήσαμε την παρακολούθησης της απόδοσης για το Entity Framework Core, ας εκτελέσουμε τον κώδικα και ας ελέγξουμε τα δεδομένα που εμφανίζονται από τον MiniProfiler. Μετά την εκτέλεση της εφαρμογής, μπορείτε να δείτε ότι μια επιπλέον στήλη έχει προσθεθεί στα δεδομένα με το όνομα SQL, η οποία εμφανίζει το χρόνο που απαιτείται από το ερώτημα SQL και μέσα σε αγκύλες είναι ο αριθμός των sql που εκτελούνται. Αφού κάνετε κλικ στον αριθμό που εμφανίζεται στις λεπτομέρειες στήλης SQL, οι λεπτομέριες θα είναι διαθέσιμες όπως στο παρακάτω.


Ενεργοποίηση της παρακολούθησης της απόδοσης σε συγκεκριμένο κομμάτι κώδικα

Σε αυτό το σημείο θα δούμε πώς να παρακολουθούμε την απόδοση ενός συγκεκριμένου κομματιού κώδικα, όπως κάποιος υπολογισμός ή επεξεργασία.

Έχουμε ήδη εγκαταστήσει το απαιτούμενο πακέτο NuGet, π.χ. MiniProfiler.AspNetCore. Θα χρησιμοποιήσουμε τη λειτουργία Step του MiniProfiler για να μετρήσουμε το χρόνο που απαιτείται για το συγκεκριμένο σημείο του κώδικα.

Η λειτουργία Step ξεκινά ένα νέο χρονόμετρο. Η συνάρτηση αυτή λαμβάνει μία περιγραφή ως είσοδο που θα εμφανίζεται στα δεδομένα του MiniProfiler αργότερα.

Για λόγους επίδειξης, έχω προσθέσει τον παρακάτω κώδικα στην ενέργεια Details.

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);
}


Τώρα που έχουμε προσθέσει την παρακολούθηση σε ένα συγκεκριμένο κομμάτι κώδικα, ας το εκτελέσουμε και παρατηρήσουμε τα δεδομένα που εμφανίζονται. Μετά την εκτέλεση της εφαρμογής βλέπουμε μια επιπλέον γραμμή που προστίθεται με τους χρονισμούς καθώς και την περιγραφή που χρησιμοποιήσαμε προηγουμένως.

Ενεργοποίηση της παρακολούθησης της απόδοσης σε ερωτήματα ADO.NET 

Αυτό ισχύει για εφαρμογές που δεν χρησιμοποιούν το Entity Framework Core, αλλά κάνουν χρήση του ADO.NET σε επίπεδο πρόσβασης δεδομένων. Έχουμε ήδη εγκαταστήσει το απαιτούμενο πακέτο NuGet StackExchange.Profiling. Θα πρέπει να χρησιμοποιήσουμε την κλάση ProfiledDbConnection μέσα από αυτό το πακέτο. Ο κατασκευαστής της κλάσης αυτής λαμβάνει ως είσοδο το αλφαριθμητικό της σύνδεσης στην βάση.

Για λόγους επίδειξης, μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα σε οποιαδήποτε μέθοδο.

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
            }
        }
    }
}


Τώρα, εφόσον, έχουμε προσθέσει την παρακολούθηση της απόδοσης σε ένα ADO.NET SQL ας εκτελέσουμε τον κώδικα και ας ελέγξουμε τα δεδομένα που εμφανίζονται στον MiniProfiler. Αφού εκτελέσουμε την εφαρμογή, μεταβένουμε στο στην σελίδα και κάνουμε κλικ στις λεπτομέρειες για τα δεδομένα. Όπως μπορείτε να δείτε οι λεπτομέρειες SQL από ADO.NET εμφανίζονται ως μέρος των δεδομένων του MiniProfiler.

Πώς να ασφαλίσετε τα δεδομένα του MiniProfiler

Όπως έχετε δει, ο MiniProfiler παρέχει πολλά χρήσιμα δεδομένα και πολλά από αυτά τα δεδομένα είναι διαθέσιμα, από προεπιλογή, σε όλους τους χρήστες χωρίς περιορισμούς. Τώρα, αν θέλετε να περιορίσετε την πρόσβαση σε αυτά τα δεδομένα μόνο στους προγραμματιστές, χρειάζεται να εφαρμόσετε το παρακάτω κώδικα. Μπορείτε να περιορίσετε την πρόσβαση σε δεδομένα σε ένα συγκεκριμένο ρόλο χρήστη ή και σε συγκεκριμένο χρήστη.

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();


Με το παραπάνω μπορείτε να ενεργοποιήσετε τον MiniProfiler στο περιβάλλον παραγωγής σας χωρίς να εκθέτετε ευαίσθητα δεδομένα στους τελικούς χρήστες.

Σύνοψη

Σε αυτό το άρθρο, είδαμε πώς να παρακολουθούμε την απόδοση του κώδικά μας χρησιμοποιώντας τον MiniProfiler σε εφαρμογή ASP.NET Core και να αναλύουμε που ξοδεύει ο κώδικας τον περισσότερο χρόνος. Προφανώς αυτό μπορεί να χρησιμοποιηθεί για τη βελτιστοποίηση του κώδικά όπου απαιτείται. Επιπλέον είδαμε πως να διαμορφώνουμε τον MiniProfiler χωρίς ιδιαίτερες προσπάθειες και πως λεπτομερή δεδομένα ήταν διαθέσιμα από την αρχή.