ASP.NET отслеживает производительность загрузки страницы (без изменения кода) - PullRequest
2 голосов
/ 16 декабря 2011

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

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

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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 16 декабря 2011

Это не проблема WebForms, это проблема ASP.net.Использование global.asax или IHttpModule перехвата событий BeginRequest / 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.config

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

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

1 голос
/ 16 декабря 2011

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

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

0 голосов
/ 26 мая 2017

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

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

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

0 голосов
/ 16 декабря 2011

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

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

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

...