AWStats: время обслуживания запроса

Date August 1st, 2011 Author Vitaly Agapov

Отрешенно, не делая зла, беззаботно живи, словно слон, бредущий сквозь джунгли.

– Гаутама Будда

Недавно потребовалось в отчёт, генерируемый AWStats’ом добавить раздел со статистикой по времени, затрачиваемом на обработку запроса. Вроде бы простая на первый взгляд задача потребовала достаточно много времени на нормальное решение. Поэтому приведу это решение здесь.

Сначала надо включить Апачу модуль mod_log_config и настроить формат записи access.log:

LogFormat "%v:%p %h %l %u %t %D \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Здесь %D как раз отвечает за подстановку количества микросекунд, затраченных на обслуживание запроса.

После этого правим конфиг самого AWStats:

LogFormat = "%host_r %host %other %logname %time1 %extra1 %methodurl %code %bytesd %refererquot %uaquot"

ExtraSectionName1="Response Time (in milliseconds)"
ExtraSectionCodeFilter1=""
ExtraSectionCondition1="URL,\/"
ExtraSectionFirstColumnTitle1="Response Time"
ExtraSectionFirstColumnValues1="extra1,([0-9]*)[0-9][0-9][0-9]$"
ExtraSectionFirstColumnFormat1="%s"
ExtraSectionStatTypes1=PHB
ExtraSectionAddAverageRow1=1
ExtraSectionAddSumRow1=1
MaxNbOfExtra1=20
MinHitExtra1=1

ExtraTrackedRowsLimit=5000

То есть конфигурируем поле %extra для сбора статистики по времени обработки. И всё вроде бы неплохо, даже работает. Но толку от такой конфигурации мало, так как статистика собирается по разным значениям миллисекунд (последние три цифры поля игнорируются), их очень много, они плохо группируются. А если уникальных значений наберётся больше числа, указанного в строке ExtraTrackedRowsLimit, то парсер вообще будет ругаться нехорошей ошибкой.

Поэтому чтобы привести всё это к воспринимаемому виду, пришлось допилить awstats.pl (у меня он версии 7.0). Перед куском

elsif ( $rowkeytype =~ /extra(\d+)/i ) {
   if ( $field[ $pos_extra[$1] ] =~ /$rowkeytypeval/ ) {
      $rowkeyval = "$1";
      $rowkeyok  = 1;
      last;
   }
}

я вставил другой кусок:

elsif ( $rowkeytype =~ /extra1/i ) {
   if ( $field[ $pos_extra[1] ] =~ /^(\d+)$/ ) {
      if ($1 <= 1000 ) {
         $rowkeyval = "0ms-1ms";
      }
      elsif ($1 <= 10000 ) {
         $rowkeyval = "1ms-10ms";
      }
      elsif ($1 <= 50000 ) {
         $rowkeyval = "10ms-50ms";
      }
      elsif ($1 <= 100000 ) {
         $rowkeyval = "50ms-100ms";
      }
      elsif ($1 <= 500000 ) {
         $rowkeyval = "100ms-500ms";
      }
      elsif ($1 <= 1000000 ) {
         $rowkeyval = "500ms-1s";
      }
      elsif ($1 <= 5000000 ) {
         $rowkeyval = "1s-5s";
      }
      elsif ($1 <= 30000000 ) {
         $rowkeyval = "5s-30s";
      }
      else { $rowkeyval = "30s+"; }
      $rowkeyok  = 1;
      last;
   }
}

Переиндексировал логи и вуаля. Получилась вполне воспринимаемая информация.

Tags: ,
Category: Apache | No comments »

Comments

Leave a comment

 Comment Form