diff --git a/synapse/metrics/__init__.py b/synapse/metrics/__init__.py
index 1acaa3fd09..c161c17e9f 100644
--- a/synapse/metrics/__init__.py
+++ b/synapse/metrics/__init__.py
@@ -19,7 +19,9 @@ from __future__ import absolute_import
import logging
from resource import getrusage, getpagesize, RUSAGE_SELF
-from .metric import CounterMetric, CallbackMetric, TimerMetric, CacheMetric
+from .metric import (
+ CounterMetric, CallbackMetric, DistributionMetric, CacheMetric
+)
logger = logging.getLogger(__name__)
@@ -59,8 +61,8 @@ class Metrics(object):
def register_callback(self, *args, **kwargs):
return self._register(CallbackMetric, *args, **kwargs)
- def register_timer(self, *args, **kwargs):
- return self._register(TimerMetric, *args, **kwargs)
+ def register_distribution(self, *args, **kwargs):
+ return self._register(DistributionMetric, *args, **kwargs)
def register_cache(self, *args, **kwargs):
return self._register(CacheMetric, *args, **kwargs)
diff --git a/synapse/metrics/metric.py b/synapse/metrics/metric.py
index 6b7d3358bc..45d2752a20 100644
--- a/synapse/metrics/metric.py
+++ b/synapse/metrics/metric.py
@@ -101,35 +101,37 @@ class CallbackMetric(BaseMetric):
for k in sorted(value.keys())]
-class TimerMetric(CounterMetric):
- """A combination of an event counter and a time accumulator, which counts
- both the number of events and how long each one takes.
+class DistributionMetric(CounterMetric):
+ """A combination of an event counter and an accumulator, which counts
+ both the number of events and accumulates the total value. Typically this
+ could be used to keep track of method-running times, or other distributions
+ of values that occur in discrete occurances.
TODO(paul): Try to export some heatmap-style stats?
"""
def __init__(self, *args, **kwargs):
- super(TimerMetric, self).__init__(*args, **kwargs)
+ super(DistributionMetric, self).__init__(*args, **kwargs)
- self.times = {}
+ self.totals = {}
# Scalar metrics are never empty
if self.is_scalar():
- self.times[()] = 0
+ self.totals[()] = 0
- def inc_time(self, msec, *values):
+ def inc_by(self, inc, *values):
self.inc(*values)
- if values not in self.times:
- self.times[values] = msec
+ if values not in self.totals:
+ self.totals[values] = inc
else:
- self.times[values] += msec
+ self.totals[values] += inc
def render_item(self, k):
keystr = self._render_key(k)
return ["%s:count%s %d" % (self.name, keystr, self.counts[k]),
- "%s:msec%s %d" % (self.name, keystr, self.times[k])]
+ "%s:total%s %d" % (self.name, keystr, self.totals[k])]
class CacheMetric(object):
|