summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <paul@matrix.org>2015-03-06 16:18:21 +0000
committerPaul "LeoNerd" Evans <paul@matrix.org>2015-03-12 16:24:51 +0000
commitb0cf86731957876ca877c35bf30c6f695f1a544c (patch)
tree1ca688153c5214ad3e2bc7b6192699abf37abeca
parentHave all @metrics.counted use a single metric name vectored on the method nam... (diff)
downloadsynapse-b0cf86731957876ca877c35bf30c6f695f1a544c.tar.xz
Use _ instead of . as a metric namespacing separator, for Prometheus
-rw-r--r--synapse/federation/transaction_queue.py4
-rw-r--r--synapse/handlers/presence.py2
-rw-r--r--synapse/http/client.py4
-rw-r--r--synapse/http/matrixfederationclient.py4
-rw-r--r--synapse/http/server.py4
-rw-r--r--synapse/metrics/__init__.py14
-rw-r--r--synapse/notifier.py2
-rw-r--r--synapse/storage/_base.py18
8 files changed, 34 insertions, 18 deletions
diff --git a/synapse/federation/transaction_queue.py b/synapse/federation/transaction_queue.py
index ae62c69fc3..ca5bcf21cf 100644
--- a/synapse/federation/transaction_queue.py
+++ b/synapse/federation/transaction_queue.py
@@ -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"],
         )
diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py
index 698946a48b..c6d6aef53b 100644
--- a/synapse/handlers/presence.py
+++ b/synapse/handlers/presence.py
@@ -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)
         )
 
diff --git a/synapse/http/client.py b/synapse/http/client.py
index ad2c9c05ec..01737a7188 100644
--- a/synapse/http/client.py
+++ b/synapse/http/client.py
@@ -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"],
 )
 
diff --git a/synapse/http/matrixfederationclient.py b/synapse/http/matrixfederationclient.py
index 6b6d79a044..11883d3852 100644
--- a/synapse/http/matrixfederationclient.py
+++ b/synapse/http/matrixfederationclient.py
@@ -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"],
 )
 
diff --git a/synapse/http/server.py b/synapse/http/server.py
index 35bd3a00ba..23708c08c9 100644
--- a/synapse/http/server.py
+++ b/synapse/http/server.py
@@ -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"],
 )
 
diff --git a/synapse/metrics/__init__.py b/synapse/metrics/__init__.py
index 443d67f41c..47e475acd2 100644
--- a/synapse/metrics/__init__.py
+++ b/synapse/metrics/__init__.py
@@ -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():
diff --git a/synapse/notifier.py b/synapse/notifier.py
index 1f7cad624e..75e8152d03 100644
--- a/synapse/notifier.py
+++ b/synapse/notifier.py
@@ -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())
diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py
index a38b603584..35d118c586 100644
--- a/synapse/storage/_base.py
+++ b/synapse/storage/_base.py
@@ -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),
         )