Dogslow é Django classe watchdog middleware que registra tracebacks de solicitações lentas.
Instalação:
Instale dogslow:
pip instalar dogslow
Em seguida, adicione se à sua lista de classes middleware em seu arquivo settings.py Django:
MIDDLEWARE_CLASSES = (
& Nbsp; "dogslow.WatchdogMiddleware ',
& Nbsp; ...
)
Para melhores resultados, torná-lo um dos primeiros middlewares que é executado.
Configuração:
Você pode usar as seguintes propriedades de configuração em seu arquivo settings.py para sintonizar o cão de guarda:
# Watchdog é ativado por padrão, para desativar temporariamente, definida como False:
DOGSLOW = True
# Local onde Watchdog armazena seus arquivos de log:
DOGSLOW_OUTPUT = '/ tmp'
Solicitações # Entrar demorando mais de 25 segundos:
DOGSLOW_TIMER = 25
# Quando ambos especificados, e-mails backtraces:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Uso:
Cada solicitação HTTP de entrada recebe um segundo tempo 25 no cão de guarda. Se o pedido não retornar dentro desse tempo, o cão de guarda ativa e leva uma espiada no pilha do segmento pedido e escreve o registo de chamadas (incluindo todas as variáveis de pilha locais - estilo Django) para um arquivo de log.
Cada pedido lento é registrado em um arquivo separado que se parece com isso:
Mortos-vivos pedido interceptado em: 16-05-2011 02:10:12 UTC
GET http: // localhost: 8000 / delay = 2
Tópico ID: 140539485042432
Processo ID: 18010
PID pai: 17762
Iniciado: 16-05-2011 02:10:10 UTC
& Nbsp; Arquivo "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", linha 107, em inner_run
& Nbsp; run (self.addr, int (self.port), manipulador, ipv6 = self.use_ipv6)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linha 696, em funcionamento
& Nbsp; httpd.serve_forever ()
& Nbsp; Arquivo "/usr/lib/python2.7/SocketServer.py", linha 227, em serve_forever
& Nbsp; self._handle_request_noblock ()
& Nbsp; Arquivo "/usr/lib/python2.7/SocketServer.py", linha 284, em _handle_request_noblock
& Nbsp; self.process_request (request, client_address)
& Nbsp; Arquivo "/usr/lib/python2.7/SocketServer.py", linha 310, em process_request
& Nbsp; self.finish_request (request, client_address)
& Nbsp; Arquivo "/usr/lib/python2.7/SocketServer.py", linha 323, em finish_request
& Nbsp; self.RequestHandlerClass (request, client_address, self)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linha 570, em __init__
& Nbsp; BaseHTTPRequestHandler .__ o init __ (self, * args, ** kwargs)
& Nbsp; Arquivo "/usr/lib/python2.7/SocketServer.py", linha 639, em __init__
& Nbsp; self.handle ()
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linha 615, na alça
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linha 283, em funcionamento
& Nbsp; self.result = aplicação (self.environ, self.start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", linha 68, em __call__
& Nbsp; retorno self.application (Environ, start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", linha 273, em __call__
& Nbsp; response = self.get_response (request)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", linha 111, em GET RESPONSE
& Nbsp; response = callback (request, callback_args *, ** callback_kwargs)
& Nbsp; Arquivo "/home/erik/work/middleware/middleware/sleep/views.py", linha 6, durante o sono
& Nbsp; time.sleep (float (request.GET.get ('atraso', 1)))
Backtrace completa com variáveis locais:
& Nbsp; Arquivo "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", linha 107, em inner_run
& Nbsp; run (self.addr, int (self.port), manipulador, ipv6 = self.use_ipv6)
& Nbsp; ... cargas mais ...
O exemplo acima mostra que o segmento pedido foi bloqueada em time.sleep () no momento dogslow foi feito o snapshot.
Solicita que voltar antes do tempo limite de dogslow expira não são registrados.
Note-se que dogslow leva apenas uma espiada no pilha do segmento. Não interrompe o pedido, ou influenciar de qualquer outra maneira. Usando dogslow é, portanto, seguro para uso em produção.
Advertências
Dogslow usa multithreading. Tem um único fundo enfiar as alças os tempos limite de vigilância e toma as tracebacks, de modo que os fios pedido inicial não sejam interrompidos. Isto tem algumas conseqüências.
Multithreading ea GIL
Em CPython, a GIL (Global Interpreter Lock) impede que vários segmentos de execução de código Python simultaneamente. Somente quando um segmento libera explicitamente seu bloqueio na GIL, pode uma segunda corrida de discussão.
Liberar o GIL é feito automaticamente sempre que um programa Python faz o bloqueio de chamadas fora do intérprete, por exemplo ao fazer IO.
Para dogslow isso significa que ele só pode confiavelmente interceptar solicitações que são lentos porque eles estão fazendo IO, chamando sono ou ocupado esperando para adquirir próprios bloqueios.
Na maioria dos casos, isso é bom. Uma importante causa de pedidos Django lentas é uma consulta de banco de dados caro. Uma vez que este é IO, dogslow pode interceptar as pessoas que bem. Um cenário onde GIL do CPython é problemático é quando segmento do pedido bate um loop infinito no código Python (ou Python legítimo que é extremamente caro e leva muito tempo para executar), nunca liberar a GIL. Mesmo que watchdog timer de dogslow se torne executável, ele não pode registrar a pilha.
Co-rotinas e Greenlets
Dogslow se destina a utilização numa configuração trabalhador síncrono. Um servidor que usa segmentos dedicados (ou, processos single-threaded de trabalho dedicados) para atender as solicitações. Servidor wsgi built-in de Django faz isso, como faz Gunicorn em seu modo padrão de sincronização de trabalho.
Quando executado com um "quadro de co-rotinas", onde várias solicitações são atendidas simultaneamente por um fio, backtraces pode se tornar sem sentido
Requisitos :.
- Python
- Django
Comentários não encontrado