Use _ instead of . as a metric namespacing separator, for Prometheus

This commit is contained in:
Paul "LeoNerd" Evans 2015-03-06 16:18:21 +00:00
parent 0b96bb793e
commit b0cf867319
8 changed files with 34 additions and 18 deletions

View file

@ -69,11 +69,11 @@ class TransactionQueue(object):
# HACK to get unique tx id
self._next_txn_id = int(self._clock.time_msec())
metrics.register_callback("pending_pdus",
metrics.register_callback("pendingPdus",
lambda: {(dest,): len(pdus[dest]) for dest in pdus.keys()},
labels=["dest"],
)
metrics.register_callback("pending_edus",
metrics.register_callback("pendingEdus",
lambda: {(dest,): len(edus[dest]) for dest in edus.keys()},
labels=["dest"],
)

View file

@ -136,7 +136,7 @@ class PresenceHandler(BaseHandler):
self._user_cachemap = {}
self._user_cachemap_latest_serial = 0
metrics.register_callback("user_cachemap:size",
metrics.register_callback("userCachemap:size",
lambda: len(self._user_cachemap)
)

View file

@ -34,10 +34,10 @@ logger = logging.getLogger(__name__)
metrics = synapse.metrics.get_metrics_for(__name__)
outgoing_requests_counter = metrics.register_counter("outgoing_requests",
outgoing_requests_counter = metrics.register_counter("requests",
labels=["method"],
)
incoming_responses_counter = metrics.register_counter("incoming_responses",
incoming_responses_counter = metrics.register_counter("responses",
labels=["method","code"],
)

View file

@ -43,10 +43,10 @@ logger = logging.getLogger(__name__)
metrics = synapse.metrics.get_metrics_for(__name__)
outgoing_requests_counter = metrics.register_counter("outgoing_requests",
outgoing_requests_counter = metrics.register_counter("requests",
labels=["method"],
)
incoming_responses_counter = metrics.register_counter("incoming_responses",
incoming_responses_counter = metrics.register_counter("responses",
labels=["method","code"],
)

View file

@ -37,10 +37,10 @@ logger = logging.getLogger(__name__)
metrics = synapse.metrics.get_metrics_for(__name__)
incoming_requests_counter = metrics.register_counter("incoming_requests",
incoming_requests_counter = metrics.register_counter("requests",
labels=["method"],
)
outgoing_responses_counter = metrics.register_counter("outgoing_responses",
outgoing_responses_counter = metrics.register_counter("responses",
labels=["method","code"],
)

View file

@ -41,7 +41,12 @@ class Metrics(object):
self.name_prefix = name
def _register(self, metric_class, name, *args, **kwargs):
full_name = "%s.%s" % (self.name_prefix, name)
if "_" in name:
raise ValueError("Metric names %s is invalid as it cannot contain an underscore"
% (name)
)
full_name = "%s_%s" % (self.name_prefix, name)
metric = metric_class(full_name, *args, **kwargs)
@ -78,10 +83,13 @@ class Metrics(object):
return wrapped
def get_metrics_for(name):
def get_metrics_for(pkg_name):
""" Returns a Metrics instance for conveniently creating metrics
namespaced with the given name prefix. """
return Metrics(name)
# Convert a "package.name" to "package_name" because Prometheus doesn't
# let us use . in metric names
return Metrics(pkg_name.replace(".", "_"))
def render_all():

View file

@ -122,7 +122,7 @@ class Notifier(object):
all_listeners |= x
return len(all_listeners)
metrics.register_callback("all_listeners", count_listeners)
metrics.register_callback("listeners", count_listeners)
metrics.register_callback("rooms",
lambda: count(bool, self.room_to_listeners.values())

View file

@ -40,7 +40,14 @@ metrics = synapse.metrics.get_metrics_for("synapse.storage")
sql_query_timer = metrics.register_timer("queries", labels=["verb"])
sql_txn_timer = metrics.register_timer("transactions", labels=["desc"])
sql_getevents_timer = metrics.register_timer("get_events", labels=["desc"])
sql_getevents_timer = metrics.register_timer("getEvents", labels=["desc"])
caches_by_name = {}
cache_counter = metrics.register_cache(
"cache",
lambda: {(name,): len(caches_by_name[name]) for name in caches_by_name.keys()},
labels=["name"],
)
# TODO(paul):
@ -62,8 +69,9 @@ def cached(max_entries=1000):
"""
def wrap(orig):
cache = OrderedDict()
name = orig.__name__
counter = metrics.register_cache(orig.__name__, lambda: len(cache))
caches_by_name[name] = cache
def prefill(key, value):
while len(cache) > max_entries:
@ -74,10 +82,10 @@ def cached(max_entries=1000):
@defer.inlineCallbacks
def wrapped(self, key):
if key in cache:
counter.inc_hits()
cache_counter.inc_hits(name)
defer.returnValue(cache[key])
counter.inc_misses()
cache_counter.inc_misses(name)
ret = yield orig(self, key)
prefill(key, ret)
defer.returnValue(ret)
@ -195,7 +203,7 @@ class SQLBaseStore(object):
self._get_event_cache = LruCache(hs.config.event_cache_size)
self._get_event_cache_counter = metrics.register_cache(
"get_event_cache",
"getEventCache",
size_callback=lambda: len(self._get_event_cache),
)