Dogslow

Software screenshot:
Dogslow
Software informatie:
Versie: 0.9.5
Upload datum: 14 Apr 15
Ontwikkelaar: Erik van Zijst
Licentie: Gratis
Populariteit: 1

Rating: nan/5 (Total Votes: 0)

Dogslow is Django waakhond middleware klasse die tracebacks van trage verzoeken logs.
Installatie:
Installeer dogslow:
pip dogslow installeren
Dan voeg indien aan je lijst met middleware klassen in uw Django settings.py bestand:
MIDDLEWARE_CLASSES = (
& Nbsp; 'dogslow.WatchdogMiddleware',
& Nbsp; ...
)
Voor het beste resultaat, maken het een van de eerste middlewares dat wordt gerund.
Configuratie:
U kunt de volgende configuratie-eigenschappen in uw settings.py bestand af te stemmen de waakhond te gebruiken:
# Watchdog is standaard ingeschakeld, om tijdelijk uit te schakelen, ingesteld op False:
DOGSLOW = True
# Locatie waar Watchdog slaat zijn logbestanden:
DOGSLOW_OUTPUT = '/ tmp'
# Inloggen aanvragen duurt langer dan 25 seconden:
DOGSLOW_TIMER = 25
# Wanneer beide gespecificeerd, e-mails backtraces:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Gebruik:
Elke binnenkomende HTTP request krijgt 25 seconden time-out in de waakhond. Indien een verzoek niet terug te sturen binnen die tijd, de waakhond activeert en neemt een kijkje op stapel verzoek draad en schrijft de backtrace (inclusief alle lokale stack variabelen - Django stijl) naar een logbestand.
Elke slow aanvraag wordt geregistreerd in een apart bestand dat ziet er zo uit:
Undead aanvraag onderschept op: 16-05-2011 02:10:12 GMT
GET http: // localhost: 8000 / delay = 2
Thread ID: 140539485042432
Proces-id: 18010
Ouder PID: 17762
Gestart: 16-05-2011 02:10:10 GMT
& Nbsp; Bestand "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", lijn 107, in inner_run
& Nbsp; run (self.addr, int (self.port), handler, ipv6 = self.use_ipv6)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lijn 696, in run
& Nbsp; httpd.serve_forever ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lijn 227, in serve_forever
& Nbsp; self._handle_request_noblock ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lijn 284, in _handle_request_noblock
& Nbsp; self.process_request (aanvraag, client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lijn 310, in process_request
& Nbsp; self.finish_request (aanvraag, client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lijn 323, in finish_request
& Nbsp; self.RequestHandlerClass (verzoek client_address, zelf)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lijn 570, in __init__
& Nbsp; BaseHTTPRequestHandler .__ init __ (zelf, * args, ** kwargs)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lijn 639, in __init__
& Nbsp; self.handle ()
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lijn 615, in het handvat
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lijn 283, in run
& Nbsp; self.result = applicatie (self.environ, self.start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", lijn 68, in __call__
& Nbsp; return self.application (environ, start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", lijn 273, in __call__
& Nbsp; respons = self.get_response (aanvraag)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", lijn 111, in GET_RESPONSE
& Nbsp; respons = callback (verzoek * callback_args, ** callback_kwargs)
& Nbsp; File "/home/erik/work/middleware/middleware/sleep/views.py", lijn 6, in slaap
& Nbsp; time.sleep (float (request.GET.get ("vertraging", 1)))
Volledige backtrace met lokale variabelen:
& Nbsp; Bestand "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", lijn 107, in inner_run
& Nbsp; run (self.addr, int (self.port), handler, ipv6 = self.use_ipv6)
& Nbsp; ... nog veel meer ...
Het bovenstaande voorbeeld toont dat het verzoek draad werd geblokkeerd time.sleep () op het tijdstip dogslow nam de momentopname.
Verzoeken die terugkeren voordat timeout dogslow verloopt niet registreerd.
Merk op dat dogslow duurt slechts een glimp op stapel van de thread. Het niet onderbreekt het verzoek, of daar enige invloed op andere wijze. Met dogslow derhalve veilig voor productie.
Voorbehoud
Dogslow maakt gebruik van multithreading. Het heeft een enkele achtergrond rijg de grepen de waakhond time-outs en neemt de tracebacks, zodat de oorspronkelijke verzoek discussies niet worden onderbroken. Dit heeft een aantal gevolgen.
Multithreading en de GIL
In CPython, de GIL (Global Interpreter Lock) voorkomt dat meerdere threads van gelijktijdig uitvoeren van Python-code. Alleen wanneer een thread expliciet geeft zijn slot op de GIL, kan een tweede draad run.
Het loslaten van de GIL gebeurt automatisch wanneer een Python-programma maakt het blokkeren van oproepen buiten de tolk, bijvoorbeeld bij het doen van IO.
Voor dogslow betekent dit dat het kan alleen betrouwbaar onderscheppen verzoeken die langzaam zijn, omdat ze zijn IO doen, belt slaap of bezet te wachten om sloten zichzelf te verwerven.
In de meeste gevallen is dit prima. Een belangrijke oorzaak van de trage Django verzoeken is een dure database query. Aangezien dit IO, kan dogslow onderscheppen die fijne. Een scenario waar CPython's GIL is problematisch is als de draad van het verzoek raakt een oneindige lus in Python-code (of legitiem Python dat is erg duur en kost veel tijd om uit te voeren), nooit loslaten van de GIL. Ook al dogslow's watchdog timer werkt jaagbaar geworden, kan het niet aanmelden van de stack.
Co-routines en Greenlets
Dogslow is bedoeld voor gebruik in een synchrone configuratie werknemer. Een webserver die speciale draden (of single-threaded, toegewijde werkprocessen) gebruikt om aanvragen te dienen. Django's ingebouwde WSGI server doet dit, net als Gunicorn in de standaard sync-werknemer mode.
Bij het uitvoeren van een "co-routines kader" waarin meerdere verzoeken tegelijk worden bediend door één draad, misschien backtraces onzinnig geworden

Eisen .

  • Python
  • Django

Andere software van ontwikkelaar Erik van Zijst

interruptingcow
interruptingcow

14 Apr 15

Reacties op Dogslow

Reacties niet gevonden
Commentaar toe te voegen
Zet op de beelden!