| Index: infra_libs/ts_mon/common/metrics.py
|
| diff --git a/infra_libs/ts_mon/common/metrics.py b/infra_libs/ts_mon/common/metrics.py
|
| index 33a543761940d2f758dd5294ec722b361daeadbb..a9ee417384f1b4142449ab25ecf93beb040cf339 100644
|
| --- a/infra_libs/ts_mon/common/metrics.py
|
| +++ b/infra_libs/ts_mon/common/metrics.py
|
| @@ -32,6 +32,12 @@ class Metric(object):
|
| set() or increment() methods to modify a particular value, or passed to the
|
| constructor in which case they will be used as the defaults for this Metric.
|
|
|
| + The unit of measurement for Metric data can be specified with MetricsDataUnits
|
| + when a Metric object is created:
|
| + e.g., MetricsDataUnits.SECONDS, MetricsDataUnits.BYTES, and etc..,
|
| + A full list of supported units can be found in the following protobuf file
|
| + : infra_libs/ts_mon/protos/metrics.proto
|
| +
|
| Do not directly instantiate an object of this class.
|
| Use the concrete child classes instead:
|
| * StringMetric for metrics with string value
|
| @@ -44,7 +50,7 @@ class Metric(object):
|
| See http://go/inframon-doc for help designing and using your metrics.
|
| """
|
|
|
| - def __init__(self, name, fields=None, description=None):
|
| + def __init__(self, name, fields=None, description=None, units=None):
|
| """Create an instance of a Metric.
|
|
|
| Args:
|
| @@ -52,6 +58,9 @@ class Metric(object):
|
| fields (dict): a set of key-value pairs to be set as default metric fields
|
| description (string): help string for the metric. Should be enough to
|
| know what the metric is about.
|
| + units (int): the unit used to measure data for given
|
| + metric. Please use the attributes of MetricDataUnit to find
|
| + valid integer values for this argument.
|
| """
|
| self._name = name.lstrip('/')
|
| self._start_time = None
|
| @@ -61,6 +70,7 @@ class Metric(object):
|
| self._fields = fields
|
| self._normalized_fields = self._normalize_fields(self._fields)
|
| self._description = description
|
| + self._units = units
|
|
|
| interface.register(self)
|
|
|
| @@ -98,6 +108,8 @@ class Metric(object):
|
| metric_pb.name = self._name
|
| if self._description is not None:
|
| metric_pb.description = self._description
|
| + if self._units is not None:
|
| + metric_pb.units = self._units
|
|
|
| self._populate_value(metric_pb, value, start_time)
|
| self._populate_fields(metric_pb, fields)
|
| @@ -250,9 +262,10 @@ class NumericMetric(Metric): # pylint: disable=abstract-method
|
| class CounterMetric(NumericMetric):
|
| """A metric whose value type is a monotonically increasing integer."""
|
|
|
| - def __init__(self, name, fields=None, start_time=None, description=None):
|
| + def __init__(self, name, fields=None, start_time=None, description=None,
|
| + units=None):
|
| super(CounterMetric, self).__init__(
|
| - name, fields=fields, description=description)
|
| + name, fields=fields, description=description, units=units)
|
| self._start_time = start_time
|
|
|
| def _populate_value(self, metric, value, start_time):
|
| @@ -291,9 +304,10 @@ class GaugeMetric(NumericMetric):
|
| class CumulativeMetric(NumericMetric):
|
| """A metric whose value type is a monotonically increasing float."""
|
|
|
| - def __init__(self, name, fields=None, start_time=None, description=None):
|
| + def __init__(self, name, fields=None, start_time=None, description=None,
|
| + units=None):
|
| super(CumulativeMetric, self).__init__(
|
| - name, fields=fields, description=description)
|
| + name, fields=fields, description=description, units=units)
|
| self._start_time = start_time
|
|
|
| def _populate_value(self, metric, value, start_time):
|
| @@ -339,9 +353,9 @@ class DistributionMetric(Metric):
|
| }
|
|
|
| def __init__(self, name, is_cumulative=True, bucketer=None, fields=None,
|
| - start_time=None, description=None):
|
| + start_time=None, description=None, units=None):
|
| super(DistributionMetric, self).__init__(
|
| - name, fields=fields, description=description)
|
| + name, fields=fields, description=description, units=units)
|
| self._start_time = start_time
|
|
|
| if bucketer is None:
|
| @@ -435,13 +449,14 @@ class CumulativeDistributionMetric(DistributionMetric):
|
| """A DistributionMetric with is_cumulative set to True."""
|
|
|
| def __init__(self, name, bucketer=None, fields=None,
|
| - description=None):
|
| + description=None, units=None):
|
| super(CumulativeDistributionMetric, self).__init__(
|
| name,
|
| is_cumulative=True,
|
| bucketer=bucketer,
|
| fields=fields,
|
| - description=description)
|
| + description=description,
|
| + units=units)
|
|
|
| def is_cumulative(self):
|
| return True
|
| @@ -451,13 +466,28 @@ class NonCumulativeDistributionMetric(DistributionMetric):
|
| """A DistributionMetric with is_cumulative set to False."""
|
|
|
| def __init__(self, name, bucketer=None, fields=None,
|
| - description=None):
|
| + description=None, units=None):
|
| super(NonCumulativeDistributionMetric, self).__init__(
|
| name,
|
| is_cumulative=False,
|
| bucketer=bucketer,
|
| fields=fields,
|
| - description=description)
|
| + description=description,
|
| + units=units)
|
|
|
| def is_cumulative(self):
|
| return False
|
| +
|
| +
|
| +class MetaMetricsDataUnits(type):
|
| + """Metaclass to populate the enum values of metrics_pb2.MetricsData.Units."""
|
| + def __new__(mcs, name, bases, attrs):
|
| + attrs.update(metrics_pb2.MetricsData.Units.items())
|
| + return super(MetaMetricsDataUnits, mcs).__new__(mcs, name, bases, attrs)
|
| +
|
| +
|
| +class MetricsDataUnits(object):
|
| + """An enumeration class for units of measurement for Metrics data.
|
| + See infra_libs/ts_mon/protos/metrics.proto for a full list of supported units.
|
| + """
|
| + __metaclass__ = MetaMetricsDataUnits
|
|
|