ASP.NET MVC мини профайлер

вторник, 21 июня 2011, Александр Краковецкий

Команда StackOveflow разработала небольшой, но весьма полезный профайлер для ASP.NET MVC 3. Основа проекта - единственная библиотека, также можно скачать демо MVC проект.

Начинаем работу

Для начала необходимо добавить CSS и JavaScript в master page / layout после объявления jQuery:

<head>     
     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>     
     @MvcMiniProfiler.MiniProfiler.RenderIncludes()
</head>

Дальше необходиом решить, какую информацию вы хотите отслеживать - локальные запросы или что-то другое.

В тестовом примере профайлер стартует в файле Global.asax.cs (метод Application_BeginRequest) и отслеживает локальные запросы:

using MvcMiniProfiler;  
...  
protected void Application_BeginRequest() 
{     
     if (Request.IsLocal)     
     {         
          MiniProfiler.Start();     
    }  
}

Если вы хотите исследовать некий код с помощью профайлера, используете следующий код:

using MvcMiniProfiler;  
...  
var profiler = MiniProfiler.Current; // it's ok if this is null  
using (profiler.Step("Set page title")) 
{     
     ViewBag.Title = "Home Page"; 
}  

using (profiler.Step("Doing complex stuff")) 
{     
     using (profiler.Step("Step A"))     
     { 
          // something more interesting here         
          Thread.Sleep(100);     
     }     

     using (profiler.Step("Step B"))     
     { 
          // and here         
          Thread.Sleep(250);     
     } 
}

Вы можете использовать этот код как локально, так и на высоких уровнях (и можете, например, передавать экземпляр класса MiniProfiler как необязательный параметр (со значением по умолчанию null) вниз по иерархии классов / методов).

Для остановк профайлера используйте метод Stop():

protected void Application_EndRequest() 
{     
     MiniProfiler.Stop(); 
}

Если все было сделано правильно, то вы должны увидеть похожий результат:

alt text

Профилирование базы данных

Профайлер содержит мощные средства для профилирования баз данных. Для этоо вам необходимо обернуть ваше соединение с базой с помощью соединения профилировщика.

Профилировщик поддерживает любой тип DbConnection, а также Entity Framework и Linq to SQL.

Пример использования:

public static DbConnection GetOpenConnection() 
{     
      var cnn = CreateRealConnection(); // A SqlConnection, SqliteConnection ... or whatever          
      // wrap the connection with a profiling connection that tracks timings      
     return new MvcMiniProfiler.Data.ProfiledDbConnection.Get(cnn, MiniProfiler.Current); 
}

Entity Framework:

public static MyModel Get()    
{       
     var conn = ProfiledDbConnection.Get(GetConnection());       
     return ObjectContextUtils.CreateObjectContext<MyModel>(conn);    
}

LINQ to SQL:

partial class DBContext 
{    
     public static DBContext Get()    
     {       
          var conn = ProfiledDbConnection.Get(GetConnection());       
          return new DBContext(conn);       
          // or: return DataContextUtils.CreateDataContext<DBContext>(conn);    
     } 
}

Другие возможности

Определение (N+1) и дублирующихся запросов

Профайлер позволяет определять и выделять те области, которые выполняют одинаковые запросы несколько раз с разными параметрами.

alt text

А как насчет AJAX?

Профайлер позволяет исследовать ajax запросы:

alt text

Работа с профайлером

Часто в начале сесии вы не знаете, должен ли текущий пользователь видеть информацию о профилировании. Для решения этой проблемы используется такой подход:

protected void Application_BeginRequest() 
{    
      MvcMiniProfiler.MiniProfiler.Start();   
} 

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
{   
     if(!CurrentUserIsAllowedToSeeProfiler())
     {
           MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);   
     } 
}

С часто задаваемыми вопросами можно ознакомиться по ссылке.


Ищите нас в интернетах!

Комментарии

Свежие вакансии