[docs]class StoredMetric:
"""
Base class for storing metrics in registry.
"""
code = None
value = None
def __init__(self, code=None, initial=None):
if code:
self.code = code
if initial:
self.value = initial
[docs] @classmethod
def get_from_registry(cls):
"""
Getting metric from registry using metric code.
"""
from hurricane.metrics import registry
return registry.get(cls.code)
[docs] @classmethod
def set(cls, value):
"""
Setting new value for metric.
"""
metric = cls.get_from_registry()
metric.value = value
[docs] @classmethod
def get(cls):
"""
Getting value of metric from registry.
"""
metric = cls.get_from_registry()
return metric.value
class CalculatedMetric:
code = None
def __init__(self, code=None):
if code:
self.code = code
@classmethod
def get_from_registry(cls):
"""
Getting metric from registry using metric code.
"""
from hurricane.metrics import registry
return registry.get(cls.code)
@classmethod
def get(cls):
"""
Getting value of metric from registry.
"""
return cls.get_value(cls)
@classmethod
def get_value(cls):
raise NotImplementedError
[docs]class CounterMetric(StoredMetric):
"""
Metric, that can be incremented and decremented.
"""
value = 0
[docs] @classmethod
def increment(cls):
"""
Increment value to the metric.
"""
cls.set(cls.get() + 1)
[docs] @classmethod
def decrement(cls):
"""
Decrement value from the metric.
"""
cls.set(cls.get() - 1)
[docs]class AverageMetric(StoredMetric):
"""
Calculating average of a metric.
"""
counter = 0
value = 0
[docs] @classmethod
def add_value(cls, value):
"""
Implements the running (online) average of a metric.
"""
metric = cls.get_from_registry()
metric.counter += 1
metric.value = metric.value + (value - metric.value) / metric.counter