Thing: count stale hits and misses by class.

This commit is contained in:
Brian Simpson
2015-03-12 04:35:01 -04:00
parent 12db500229
commit 9e9861c7d0
4 changed files with 50 additions and 17 deletions

View File

@@ -623,7 +623,8 @@ class CacheChain(CacheUtils, local):
@cache_timer_decorator("get_multi")
@log_invalid_keys
def simple_get_multi(self, keys, allow_local = True, stale=None):
def simple_get_multi(self, keys, allow_local = True, stale=None,
stat_subname=None):
out = {}
need = set(keys)
hits = 0
@@ -667,8 +668,8 @@ class CacheChain(CacheUtils, local):
# If this chain contains no permanent caches, then we need to
# count the misses here.
misses = len(need)
self.stats.cache_hit(hits)
self.stats.cache_miss(misses)
self.stats.cache_hit(hits, subname=stat_subname)
self.stats.cache_miss(misses, subname=stat_subname)
return out
@@ -779,7 +780,7 @@ class StaleCacheChain(CacheChain):
@cache_timer_decorator("get_multi")
@log_invalid_keys
def simple_get_multi(self, keys, stale = False, **kw):
def simple_get_multi(self, keys, stale=False, stat_subname=None, **kw):
if not isinstance(keys, set):
keys = set(keys)
@@ -801,8 +802,8 @@ class StaleCacheChain(CacheChain):
stale_hits = len(stale_values)
stale_misses = len(keys)
if self.stats:
self.stats.stale_hit(stale_hits)
self.stats.stale_miss(stale_misses)
self.stats.stale_hit(stale_hits, subname=stat_subname)
self.stats.stale_miss(stale_misses, subname=stat_subname)
if keys:
values = self.realcache.simple_get_multi(keys)
@@ -814,8 +815,8 @@ class StaleCacheChain(CacheChain):
if self.stats:
misses = len(keys - set(ret.keys()))
hits = len(ret)
self.stats.cache_hit(hits)
self.stats.cache_miss(misses)
self.stats.cache_hit(hits, subname=stat_subname)
self.stats.cache_miss(misses, subname=stat_subname)
return ret

View File

@@ -389,7 +389,8 @@ class DataThing(object):
return items
bases = sgm(cls._cache, ids, items_db, prefix, time=THING_CACHE_TTL,
stale=stale, found_fn=count_found)
stale=stale, found_fn=count_found,
stat_subname=cls.__name__)
# Check to see if we found everything we asked for
missing = []

View File

@@ -23,7 +23,8 @@
# smart get multi:
# For any keys not found in the cache, miss_fn() is run and the result is
# stored in the cache. Then it returns everything, both the hits and misses.
def sgm(cache, keys, miss_fn, str prefix='', int time=0, stale=False, found_fn=None, _update=False):
def sgm(cache, keys, miss_fn, str prefix='', int time=0, stale=False,
found_fn=None, _update=False, stat_subname=None):
cdef dict ret
cdef dict s_keys
cdef dict cached
@@ -43,10 +44,14 @@ def sgm(cache, keys, miss_fn, str prefix='', int time=0, stale=False, found_fn=N
if _update:
cached = {}
else:
kw = {}
if stale:
cached = cache.get_multi(s_keys.keys(), prefix=prefix, stale=stale)
else:
cached = cache.get_multi(s_keys.keys(), prefix=prefix)
kw['stale'] = stale
if stat_subname:
kw['stat_subname'] = stat_subname
cached = cache.get_multi(s_keys.keys(), prefix=prefix, **kw)
for k, v in cached.iteritems():
ret[s_keys[k]] = v

View File

@@ -417,21 +417,34 @@ class CacheStats:
self.hit_stat_name = '%s.hit' % self.cache_name
self.miss_stat_name = '%s.miss' % self.cache_name
self.total_stat_name = '%s.total' % self.cache_name
self.hit_stat_template = '%s.%%s.hit' % self.cache_name
self.miss_stat_template = '%s.%%s.miss' % self.cache_name
self.total_stat_template = '%s.%%s.total' % self.cache_name
def cache_hit(self, delta=1):
def cache_hit(self, delta=1, subname=None):
if delta:
data = {
self.hit_stat_name: delta,
self.total_stat_name: delta,
}
if subname:
data.update({
self.hit_stat_template % subname: delta,
self.total_stat_template % subname: delta,
})
self.parent.cache_count_multi(data)
def cache_miss(self, delta=1):
def cache_miss(self, delta=1, subname=None):
if delta:
data = {
self.miss_stat_name: delta,
self.total_stat_name: delta,
}
if subname:
data.update({
self.miss_stat_template % subname: delta,
self.total_stat_template % subname: delta,
})
self.parent.cache_count_multi(data)
def cache_report(self, hits=0, misses=0, cache_name=None, sample_rate=None):
@@ -455,21 +468,34 @@ class StaleCacheStats(CacheStats):
self.stale_hit_name = '%s.stale.hit' % self.cache_name
self.stale_miss_name = '%s.stale.miss' % self.cache_name
self.stale_total_name = '%s.stale.total' % self.cache_name
self.stale_hit_stat_template = '%s.stale.%%s.hit' % self.cache_name
self.stale_miss_stat_template = '%s.stale.%%s.miss' % self.cache_name
self.stale_total_stat_template = '%s.stale.%%s.total' % self.cache_name
def stale_hit(self, delta=1):
def stale_hit(self, delta=1, subname=None):
if delta:
data = {
self.stale_hit_name: delta,
self.stale_total_name: delta,
}
if subname:
data.update({
self.stale_hit_stat_template % subname: delta,
self.stale_total_stat_template % subname: delta,
})
self.parent.cache_count_multi(data)
def stale_miss(self, delta=1):
def stale_miss(self, delta=1, subname=None):
if delta:
data = {
self.stale_miss_name: delta,
self.stale_total_name: delta,
}
if subname:
data.update({
self.stale_miss_stat_template % subname: delta,
self.stale_total_stat_template % subname: delta,
})
self.parent.cache_count_multi(data)