Fix sampling of Thing._byID cache hit/miss rate.

This commit is contained in:
Logan Hanks
2012-02-08 14:19:29 -08:00
parent 259559f224
commit e78bd5e32a
2 changed files with 24 additions and 8 deletions

View File

@@ -357,7 +357,9 @@ class DataThing(object):
raise NotFound('huge thing_id in %r' % ids)
def count_found(ret, still_need):
cache.stats.cache_report(hits=len(ret), misses=len(still_need))
cache.stats.cache_report(
hits=len(ret), misses=len(still_need),
cache_name='sgm.%s' % cls.__name__)
if not cache.stats:
count_found = None

View File

@@ -97,6 +97,14 @@ class Stats:
if counter and random.random() < sample_rate:
counter.increment(name, delta=delta)
def cache_count_multi(self, data, cache_name=None, sample_rate=None):
if sample_rate is None:
sample_rate = self.CACHE_SAMPLE_RATE
counter = self.get_counter('cache')
if counter and random.random() < sample_rate:
for name, delta in data.iteritems():
counter.increment(name, delta=delta)
def amqp_processor(self, queue_name):
"""Decorator for recording stats for amqp queue consumers/handlers."""
def decorator(processor):
@@ -165,14 +173,20 @@ class CacheStats:
self.parent.cache_count(self.miss_stat_name, delta=delta)
self.parent.cache_count(self.total_stat_name, delta=delta)
def cache_report(self, hits=0, misses=0, sample_rate=None):
def cache_report(self, hits=0, misses=0, cache_name=None, sample_rate=None):
if hits or misses:
self.parent.cache_count(self.hit_stat_name, delta=hits,
sample_rate=sample_rate)
self.parent.cache_count(self.miss_stat_name, delta=misses,
sample_rate=sample_rate)
self.parent.cache_count(self.total_stat_name, delta=hits + misses,
sample_rate=sample_rate)
if not cache_name:
cache_name = self.cache_name
hit_stat_name = '%s.hit' % cache_name
miss_stat_name = '%s.miss' % cache_name
total_stat_name = '%s.total' % cache_name
data = {
hit_stat_name: hits,
miss_stat_name: misses,
total_stat_name: hits + misses,
}
self.parent.cache_count_multi(data, cache_name=cache_name,
sample_rate=sample_rate)
class StatsCollectingConnectionPool(pool.ConnectionPool):
def __init__(self, keyspace, stats=None, *args, **kwargs):