[Repoze-checkins] r1151 - in repoze.debug/trunk: . repoze/debug
Chris McDonough
chrism at agendaless.com
Fri Jun 27 20:26:40 EDT 2008
Author: Chris McDonough <chrism at agendaless.com>
Date: Fri Jun 27 20:26:40 2008
New Revision: 1151
Log:
Get request id right.
Modified:
repoze.debug/trunk/repoze/debug/responselogger.py
repoze.debug/trunk/repoze/debug/ui.py
repoze.debug/trunk/setup.py
Modified: repoze.debug/trunk/repoze/debug/responselogger.py
==============================================================================
--- repoze.debug/trunk/repoze/debug/responselogger.py (original)
+++ repoze.debug/trunk/repoze/debug/responselogger.py Fri Jun 27 20:26:40 2008
@@ -1,39 +1,28 @@
+import math
import time
import threading
from paste.exceptions.errormiddleware import Supplement
-from ui import is_gui_url, DebugGui
-
-rid = -1
-lock = threading.Lock()
+from repoze.debug.ui import is_gui_url
+from repoze.debug.ui import DebugGui
class ResponseLoggingMiddleware:
- def __init__(self, app, max_bodylen, logger, gui_flag):
+ def __init__(self, app, max_bodylen, logger):
self.application = app
self.max_bodylen = max_bodylen
self.logger = logger
- self.gui_flag = gui_flag
def __call__(self, environ, start_response):
+ if is_gui_url(environ):
+ gui = DebugGui(self)
+ return gui(environ, start_response)
- # Hook for the GUI
- if self.gui_flag is not None:
- # The INI file had a setting for the URL.
- # should have
- if is_gui_url(environ, self.gui_flag):
- gui = DebugGui(self.application, self, self.gui_flag)
- return gui(environ, start_response)
-
- global rid
- lock.acquire()
- try:
- rid = rid + 1
- finally:
- lock.release()
+ now = time.time()
+ request_id = get_request_id(now)
debug = environ['repoze.debug'] = {}
- debug['id'] = rid
- debug['begin'] = time.time()
+ debug['id'] = request_id
+ debug['begin'] = now
self.log_request(environ)
@@ -157,13 +146,41 @@
'mb': 1024*1024,
'gb': 1024*1024*1024L,})
+_CURRENT_PERIOD = None
+_PERIOD_COUNTER = 0
+
+def get_request_id(when, period=.10, max=10000, lock=threading.Lock()):
+ """
+ We'd like to hand out a request id that is related to UNIX time
+ but more unique than low-resolution timers (e.g. Windows) can give
+ us. To do so, we keep around 1/10 of a sec worth of history and
+ we keep up to max slots for entries within this period,
+ effectively limiting us to max / period items per second. In the
+ default configuration, this means we can hand out 100000 rids per
+ second maximum.
+ """
+ this_period = when - (when % period)
+ global _CURRENT_PERIOD
+ global _PERIOD_COUNTER
+ lock.acquire()
+ try:
+ if this_period != _CURRENT_PERIOD:
+ _CURRENT_PERIOD = this_period
+ _PERIOD_COUNTER = 0
+ if _PERIOD_COUNTER > max:
+ raise ValueError('more than %s items within %s period' % period)
+ result = when + (_PERIOD_COUNTER / float(max))
+ _PERIOD_COUNTER += 1
+ finally:
+ lock.release()
+ return result
+
def make_middleware(app,
global_conf,
filename,
max_bodylen='0KB', # all
max_logsize='100MB',
backup_count='10',
- gui_flag=None
):
""" Paste filter-app converter """
backup_count = int(backup_count)
@@ -177,4 +194,4 @@
backupCount=backup_count)
logger = Logger('repoze.debug.responselogger')
logger.handlers = [handler]
- return ResponseLoggingMiddleware(app, max_bodylen, logger, gui_flag)
+ return ResponseLoggingMiddleware(app, max_bodylen, logger)
Modified: repoze.debug/trunk/repoze/debug/ui.py
==============================================================================
--- repoze.debug/trunk/repoze/debug/ui.py (original)
+++ repoze.debug/trunk/repoze/debug/ui.py Fri Jun 27 20:26:40 2008
@@ -6,19 +6,12 @@
import mimetypes
from webob import exc
import os
-from urllib import quote
_HERE = os.path.abspath(os.path.dirname(__file__))
+gui_flag = '__repoze.debug'
-def is_gui_url(environ, gui_flag):
- """Tell the logger if the GUI class should take over"""
-
- req = Request(environ)
- print gui_flag, quote(gui_flag)
- if req.url.find(quote(gui_flag)) > -1:
- return True
- else:
- return False
+def is_gui_url(environ):
+ return gui_flag in environ.get('PATH_INFO', '')
def get_mimetype(filename):
type, encoding = mimetypes.guess_type(filename)
@@ -40,11 +33,9 @@
class DebugGui(object):
- def __init__(self, app, logger, gui_flag):
- self.app = app
+ def __init__(self, logger):
self.logger = logger
self.static_dir = os.path.join(_HERE, 'static')
- self.gui_flag = quote(gui_flag)
def __call__(self, environ, start_response):
"""Pick apart this debug URL and return the correct response"""
@@ -54,9 +45,9 @@
try:
# Process the request
- if req.url.find(self.gui_flag + "/static/") > -1:
+ if req.url.find(gui_flag + "/static/") > -1:
resp = self.getStatic(req)
- elif req.url.find(self.gui_flag + "feed.xml"):
+ elif req.url.find(gui_flag + "feed.xml"):
resp = self.getFeed(req)
except ValueError, e:
resp = exc.HTTPBadRequest(str(e))
@@ -77,7 +68,6 @@
return res
-
def getFeed(self, req):
"""Get XML representing information in the logger"""
Modified: repoze.debug/trunk/setup.py
==============================================================================
--- repoze.debug/trunk/setup.py (original)
+++ repoze.debug/trunk/setup.py Fri Jun 27 20:26:40 2008
@@ -49,9 +49,11 @@
zip_safe=False,
tests_require = [
'Paste',
+ 'WebOb',
],
install_requires = [
'Paste',
+ 'WebOb',
],
test_suite="repoze.debug.tests",
entry_points = """\
More information about the Repoze-checkins
mailing list