diff options
Diffstat (limited to 'debug_toolbar/panels/cache.py')
| -rw-r--r-- | debug_toolbar/panels/cache.py | 89 | 
1 files changed, 62 insertions, 27 deletions
| diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index aa37858..e3b9dad 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -1,5 +1,6 @@  import time  import inspect +import sys  from django.core import cache  from django.core.cache.backends.base import BaseCache @@ -19,17 +20,18 @@ class CacheStatTracker(BaseCache):          self.misses = 0          self.sets = 0          self.gets = 0 -        self.get_many = 0 +        self.get_manys = 0          self.deletes = 0          self.total_time = 0      def _get_func_info(self): -        stack = inspect.stack()[2] -        return (stack[1], stack[2], stack[3], stack[4]) +        frame = sys._getframe(3) +        info = inspect.getframeinfo(frame) +        return (info[0], info[1], info[2], info[3]) -    def get(self, key, **kwargs): +    def get(self, *args, **kwargs):          t = time.time() -        value = self.cache.get(key, **kwargs) +        value = self.cache.get(*args, **kwargs)          this_time = time.time() - t          self.total_time += this_time * 1000          if value is None: @@ -37,37 +39,74 @@ class CacheStatTracker(BaseCache):          else:              self.hits += 1          self.gets += 1 -        self.calls.append((this_time, 'get', (key,), self._get_func_info())) +        self.calls.append((this_time, 'get', args, kwargs, self._get_func_info()))          return value -    def set(self, key, value, timeout=None, **kwargs): +    def set(self, *args, **kwargs):          t = time.time() -        self.cache.set(key, value, timeout, **kwargs) +        self.cache.set(*args, **kwargs)          this_time = time.time() - t          self.total_time += this_time * 1000          self.sets += 1 -        self.calls.append((this_time, 'set', (key, value, timeout), self._get_func_info())) +        self.calls.append((this_time, 'set', args, kwargs, self._get_func_info())) -    def delete(self, key, **kwargs): +    def delete(self, *args, **kwargs):          t = time.time() -        self.cache.delete(key, **kwargs) +        self.cache.delete(*args, **kwargs)          this_time = time.time() - t          self.total_time += this_time * 1000          self.deletes += 1 -        self.calls.append((this_time, 'delete', (key,), self._get_func_info())) +        self.calls.append((this_time, 'delete', args, kwargs, self._get_func_info())) -    def get_many(self, keys, **kwargs): +    def get_many(self, *args, **kwargs):          t = time.time() -        results = self.cache.get_many(keys) +        results = self.cache.get_many(*args, **kwargs)          this_time = time.time() - t          self.total_time += this_time * 1000 -        self.get_many += 1 +        self.get_manys += 1          for key, value in results.iteritems():              if value is None:                  self.misses += 1              else:                  self.hits += 1 -        self.calls.append((this_time, 'get_many', (keys,), self._get_func_info())) +        self.calls.append((this_time, 'get_many', args, kwargs, self._get_func_info())) +        return results + +    def make_key(self, *args, **kwargs): +        return self.cache.make_key(*args, **kwargs) + +    def add(self, *args, **kwargs): +        return self.cache.add(*args, **kwargs) + +    def has_key(self, *args, **kwargs): +        return self.cache.has_key(*args, **kwargs) + +    def incr(self, *args, **kwargs): +        return self.cache.incr(*args, **kwargs) + +    def decr(self, *args, **kwargs): +        return self.cache.decr(*args, **kwargs) + +    def __contains__(self, key): +        return self.cache.__contains__(key) + +    def set_many(self, *args, **kwargs): +        self.cache.set_many(*args, **kwargs) + +    def delete_many(self, *args, **kwargs): +        self.cache.delete_many(*args, **kwargs) + +    def clear(self): +        self.cache.clear() + +    def validate_key(self, *args, **kwargs): +        self.cache.validate_key(*args, **kwargs) + +    def incr_version(self, *args, **kwargs): +        return self.cache.incr_version(*args, **kwargs) + +    def decr_version(self, *args, **kwargs): +        return self.cache.decr_version(*args, **kwargs)  class CacheDebugPanel(DebugPanel): @@ -80,16 +119,10 @@ class CacheDebugPanel(DebugPanel):      def __init__(self, *args, **kwargs):          super(CacheDebugPanel, self).__init__(*args, **kwargs) -        # This is hackish but to prevent threading issues is somewhat needed -        if isinstance(cache.cache, CacheStatTracker): -            cache.cache.reset() -            self.cache = cache.cache -        else: -            self.cache = CacheStatTracker(cache.cache) -            cache.cache = self.cache +        cache.cache.reset()      def nav_title(self): -        return _('Cache') +        return _('Cache: %.2fms') % cache.cache.total_time      def nav_subtitle(self):          cache_calls = len(self.cache.calls) @@ -106,7 +139,9 @@ class CacheDebugPanel(DebugPanel):      def process_response(self, request, response):          self.record_stats({ -            'cache_calls': len(self.cache.calls), -            'cache_time': self.cache.total_time, -            'cache': self.cache, +            'cache_calls': len(cache.cache.calls), +            'cache_time': cache.cache.total_time, +            'cache': cache.cache,          }) + +cache.cache = CacheStatTracker(cache.cache) | 
