[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