Neste post irei mostrar como fazer para ter um feedback automático das aplicações quando elas já estiverem em produção. A intenção é detectar anormalidades na execução de um script e/ou saber um pouco mais do andamento da aplicação. Neste caso é estabelecido um tempo máximo para a execução de uma action, caso ela demore mais que esse tempo, um email é enviado para o administrador e um arquivo de log específico é criado.
Para executar essa tarefa vamos utilizar os filters do symfony.
Por padrão o tempo de execução é de 200ms, mas isso pode ser configurado no arquivo app.yml
Vamos criar o arquivo app.yml:
all:
log_slow_requests:
status: on
tempo: 200
Vamos criar o arquivo logSlowRequestsFilter.php na pasta lib/:
<?php
class myFilter
extends sfFilter
{
public function execute
($filterChain)
{
$timer = sfTimerManager::
getTimer(‘slow_request’);
$filterChain->
execute();
// pegamos o tempo de execucao
$elapsedTimeMs =
$timer->
getElapsedTime() *
1000;
if (($elapsedTimeMs >= sfConfig::
get(‘app_log_slow_requests_tempo’,
200)) &&
(sfConfig::
get(‘app_log_slow_requests_status’) ==
"on")) {
$logfile = sfConfig::
get(‘sf_log_dir’) .
‘/slow_requests.log’;
// vamos logar a URL e o tempo de execucao
$text =
sprintf("[%s Tempo: %.2f ms] %s – %s",
date(‘Y-m-d H:m’) ,
$elapsedTimeMs, sfRouting::
getInstance()->
getCurrentInternalUri(true), sfRouting::
getInstance()->
getCurrentInternalUri());
// escrevendo no log
file_put_contents
($logfile,
$text .
"\n", FILE_APPEND
);
// essa é uma classe de email personalizada.. use seu metodo para o envio do email
Email::
enviar("[slowRequest] Cliente" ,
"Um script demorou mais que o tempo de execucao estipulado. <br/ >O log foi gravado." ,
"to@email.com");
// cuidado ao utilizar a linha acima porque pode sobrecarregar o servidor
}
else
{
$filterChain->
execute();
}
}
}
Vamos adicionar o novo filtro no myapp/config/filters.yml:
rendering: ~
web_debug: ~
security: ~
slow_requests:
class: myFilter
cache: ~
common: ~
flash: ~
execution: ~
Limpe o cache!
$ symfony cc
Pronto! O arquivo `log/slow_requests.log` será atualizado sempre que um script passar do tempo estipulado. Faça uns testes diminuindo o valor no yml (200).
Você terá um arquivo mais ou menos assim…
$ more log/slow_requests.log
[2008-06-20 Tempo: 292.67 ms] @default_index – modulo/index
$
Atualmente estou com a linha que envia email comentada e um script na crontab que faz o envio do log para meu email toda semana.. Isso foi bom para reduziu um pouco a carga no servidor..
Esse é o meu script..
$ more slow_request.sh
#!/bin/bash
mail -s “[Cliente] slow_request.log” to@email.com < ../../log/slow_requests.log
$
Saiba como utilizar a crontab…
Adaptado de http://groups.google.com/group/symfony-users/browse_thread/thread/535b264eb31cf4ac