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: Apache, AWStats
Category:
Apache |
No comments »