Initial attempt at a scalar callback-based metric to give instantaneous snapshot gauges

This commit is contained in:
Paul "LeoNerd" Evans 2015-03-04 16:46:44 +00:00
parent b0cdf097f4
commit d8caa5454d
3 changed files with 45 additions and 2 deletions

View File

@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from .metric import CounterMetric, CacheCounterMetric from .metric import CounterMetric, CallbackMetric, CacheCounterMetric
# We'll keep all the available metrics in a single toplevel dict, one shared # We'll keep all the available metrics in a single toplevel dict, one shared
@ -43,6 +43,15 @@ class Metrics(object):
return metric return metric
def register_callback(self, name, callback, *args, **kwargs):
full_name = "%s.%s" % (self.name_prefix, name)
metric = CallbackMetric(full_name, *args, callback=callback, **kwargs)
self._register(metric)
return metric
def register_cachecounter(self, name, *args, **kwargs): def register_cachecounter(self, name, *args, **kwargs):
full_name = "%s.%s" % (self.name_prefix, name) full_name = "%s.%s" % (self.name_prefix, name)

View File

@ -62,6 +62,20 @@ class CounterMetric(BaseMetric):
for k in sorted(self.counts.keys())] for k in sorted(self.counts.keys())]
class CallbackMetric(BaseMetric):
"""A metric that returns the numeric value returned by a callback whenever
it is rendered. Typically this is used to implement gauges that yield the
size or other state of some in-memory object by actively querying it."""
def __init__(self, name, callback, keys=[]):
super(CallbackMetric, self).__init__(name, keys=keys)
self.callback = callback
def render(self):
# TODO(paul): work out something we can do with keys and vectors
return ["%s %d" % (self.name, self.callback())]
class CacheCounterMetric(object): class CacheCounterMetric(object):
"""A combination of two CounterMetrics, one to count cache hits and one to """A combination of two CounterMetrics, one to count cache hits and one to
count misses. count misses.

View File

@ -15,7 +15,9 @@
from tests import unittest from tests import unittest
from synapse.metrics.metric import CounterMetric, CacheCounterMetric from synapse.metrics.metric import (
CounterMetric, CallbackMetric, CacheCounterMetric
)
class CounterMetricTestCase(unittest.TestCase): class CounterMetricTestCase(unittest.TestCase):
@ -61,6 +63,24 @@ class CounterMetricTestCase(unittest.TestCase):
]) ])
class CallbackMetricTestCase(unittest.TestCase):
def test_callback(self):
d = dict()
metric = CallbackMetric("size", lambda: len(d))
self.assertEquals(metric.render(), [
"size 0",
])
d["key"] = "value"
self.assertEquals(metric.render(), [
"size 1",
])
class CacheCounterMetricTestCase(unittest.TestCase): class CacheCounterMetricTestCase(unittest.TestCase):
def test_cachecounter(self): def test_cachecounter(self):