2011-12-16 6 views
2

Что я ищу - это какой-то способ контролировать page_load каждой страницы в системе, чтобы определить, сколько времени между запросом и концом отправленных данных для пользователя.ASP.NET мониторинг производительности page_load (без изменения кода)

Я ищу для этого 100% -ую сторону сервера, и я не хочу вносить какие-либо изменения кода в код приложения. Если потребуется изменение кода приложения, есть ли место для их создания? Я думаю о каком-то параметре типа web.config, который будет записывать информацию в местоположение/базу данных. Мы можем сделать часть обработки, просто нужно как-то необработанные данные.

Информация, которую я смотрел бы собрать это:

  1. Название страницы (включая строку запроса)
  2. DateTime запроса
  3. Количество времени, которое потребовалось
  4. Любая дополнительная информация о просьбе, которую мы можем получить!

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

Я также ищу либо недорогую, либо методологию, с которой мы можем развивать нашу систему.

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

В настоящее время мы используем IIS 6.0, если этот вид более эффективен и/или работает из коробки, с IIS 7.0/7.5, то это может ускорить переход к этому, так счастлив услышать об этих предложениях.

+0

Какую версию IIS вы используете? Для этого у IIS 7 есть встроенные функции. –

+0

6.0 в настоящее время, однако, мы смотрим на обновление до 7.5 в какой-то момент, поэтому информация 7 функций будет полезна (хотя и не считается ответом на этот вопрос, извините). – Martin

+0

@JohnSaunders Вы можете указать, где в IIS7 есть статистика страницы? я не могу найти такую ​​вещь (в IIS 7.5, Windows Server 2008 R2) –

ответ

3

Это не проблема WebForms, это проблема ASP.net. Используя либо global.asax, либо IHttpModule крючок в событиях /EndRequest, чтобы отслеживать, сколько времени занимает запрос.

StopWatchModule.cs

class StopWatchModule: IHttpModule 
{ 
    private Int64 _requestStartTicks; 

    public void Init(HttpApplication application) 
    { 
     application.Context.BeginRequest += Application_BeginRequest; 
     application.Context.EndRequest += Application_EndRequest; 
    } 

    private void Application_BeginRequest(object sender, EventArgs e) 
    { 
     _requestStartTicks = Stopwatch.GetTimestamp(); 
    } 

    private void Application_EndRequest(object sender, EventArgs e) 
    { 
     Int64 requestStopTicks = Stopwatch.GetTimestamp(); 

     Double requestDurationMs = (Double)(requestStopTicks - _requestStartTicks)/Stopwatch.Frequency/1000000f; 
     /* 
      Sample output: 
      Request for "~/EditCustomer.aspx" took 37 ms to complete 
     */ 
     HttpContext context = ((HttpApplication)sender).Context; 
     Logger.Info("Request for \"{0}\" to {1} ms to complete", 
       context.Request.AppRelativeCurrentExecutionFilePath, 
       requestDurationMs.ToString("r", CultureInfo.InvariantCulture)); 
    } 
} 

Web.конфиг

<configuration> 
    <system.web> 
     <httpModules> 
      <add name="StopWatchModule" type="StopWatchModule" /> 
     </httpModules> 
    </system.web> 
</configuration> 

Я пишу по памяти, так что могут быть ошибки выше, но это идея. ваше сообщение в журнале может быть как можно более подробным. и Logger - это некоторая библиотека регистрации. Я предпочитаю log4net, но выбор за вами.

+0

, где бы сидеть с этим, это вне линии от самого запроса? повлияет ли это на фактические запросы, которые происходят? Кроме того, какова жизнь контекста, это одна страница? Я предполагаю, что я также смогу получить информацию о сеансе? – Martin

+0

Я отмечу это как ответ, так как это было так, как мы решили пойти, хотя я не получил ответа от автора. – Martin

+0

это встроенный запрос, и у вас есть доступ ко всему контексту. запрос, ответ, сеанс и т. д. для получения дополнительной информации о том, как это вписывается в структуру вашего приложения, исследующего конвейер asp.net. это ядро ​​всей http-разработки в .net. webforms, mvc и т. д. все построено поверх конвейера asp.net. –

1

Можете ли вы прикоснуться к global.asax? Вы можете переопределять события Приложения там, когда запрос получен, завершен, не выполнен и т. Д.

В зависимости от того, что вам нужно, вы также можете попробовать разбор журналов IIS, так как вы можете добавить к нему некоторые показатели производительности.

+0

при условии, что код приложения не нужно перекомпилировать, то да, есть ли какие-либо ссылки, которые вы можете предоставить, и как это сделать? – Martin

0

Вы всегда можете включить трассировку в своем web.config с параметрами pageOutput = "false".

Затем вы можете перейти к trace.axd для просмотра информации по конкретному запросу.

Вы также можете сделать это для определенной страницы, установив ее в своей директиве @page.

0

То, что я ищу какой-то способ контролировать Page_Load каждой страницы в системе, чтобы выяснить, как долго между запросом и конец данных, передаваемых обратно пользователь.

Интересно, затраченное время поле логах IIS может быть любого использования, поскольку она предоставит вам время, IP, байт (переданных/полученных) и т.д.

См fields для получения дополнительной информации

Смежные вопросы