Calcula o tempo de resposta do Apache nos últimos 10 segundos

2

Eu tenho o próximo formato de registro do apache:

LogFormat "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\""

onde está %D - o tempo gasto para atender à solicitação, em microssegundos.

Eu quero saber como posso obter um tempo médio de resposta nos últimos 10 segundos. De alguma forma, um script ou algo deve calcular o número de solicitações dos últimos 10 segundos e resumir o tempo de resposta. O resultado deve ser: number_of_requests_for_last_10_seconds / sum_of_request_time_for_last_10_seconds.

Isso é possível com o awk ou algo assim? Obrigado

UPDATE

Amostra do log:

93.182.72.47 - - [19/Aug/2014:02:24:19 -0700] "GET /test/085 HTTP/1.1" 200 1006 445 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"
119.232.112.148 - - [19/Aug/2014:02:24:19 -0700] "GET /test/003 HTTP/1.1" 200 3 84234 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"
85.244.38.232 - - [19/Aug/2014:02:24:19 -0700] "GET /test/332 HTTP/1.1" 200 3 75760 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"
236.131.91.87 - - [19/Aug/2014:02:24:16 -0700] "GET /test/006 HTTP/1.1" 200 32 3640965 "-" "python-requests/2.2.1 CPython/2.7.3 Linux/2.6.32-431.17.1.el6.x86_64"
112.241.72.130 - - [19/Aug/2014:02:24:19 -0700] "GET /test/042 HTTP/1.1" 200 50 1148668 "-" "python-requests/2.2.1 CPython/2.6.6 Linux/2.6.32-431.20.3.el6.x86_64"

UPDATE2

tailf /var/log/httpd/access_log | perl -MTime::Piece -lne '
   BEGIN{$threshold = (localtime) - 10}
   if (/\[(.*?)\] ".*?" \d+ \d+ (\d+)/) {
     $d = Time::Piece->strptime($1, "%d/%b/%Y:%H:%M:%S %z");print $d->datetime." ".$threshold->datetime;
     if ($d >= $threshold) {$t += $2; $n++}
   }
   END{print $t/$n if $n}' /var/log/httpd/access_log

...
2014-08-19T03:54:42 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:42 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:45 2014-08-19T03:54:27
2014-08-19T03:54:45 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:45 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:46 2014-08-19T03:54:27
    
por KennyPowers 19.08.2014 / 11:39

1 resposta

2

Esse é um trabalho típico para perl :

Com o Tempo :: Peça 1,17 e acima ( perl 5,12 e acima):

perl -MTime::Piece -lne '
   BEGIN{$threshold = (localtime) - 10}
   if (/\[(.*?)\] ".*?" \d+ \d+ (\d+)/) {
     $d = Time::Piece->strptime($1, "%d/%b/%Y:%H:%M:%S %z");
     if ($d >= $threshold) {$t += $2; $n++}
   }
   END{print $t/$n if $n}' your-file.log

As versões de Time :: Piece 1.15 e inferiores não suportavam %z , portanto, supondo que o fuso horário do chamador corresponde ao do arquivo de log, você poderia fazer:

perl -MTime::Piece -lne '
   BEGIN{$threshold = (localtime) - 10}
   if (/\[([^]]*:\d+).*?".*?" \d+ \d+ (\d+)/) {
     $d = Time::Piece->strptime($1, "%d/%b/%Y:%H:%M:%S");
     if ($d->datetime ge $threshold->datetime) {$t += $2; $n++}
   }
   END{print $t/$n if $n}' your-file.log
    
por 19.08.2014 / 12:17