Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rename Observer to ValueObserver #764

Merged
merged 16 commits into from
Jun 8, 2020
3 changes: 2 additions & 1 deletion docs/examples/basic_meter/observer.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import psutil

from opentelemetry import metrics
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics import MeterProvider, ValueObserver
from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter
from opentelemetry.sdk.metrics.export.batcher import UngroupedBatcher
from opentelemetry.sdk.metrics.export.controller import PushController
Expand All @@ -43,6 +43,7 @@ def get_cpu_usage_callback(observer):
description="per-cpu usage",
unit="1",
value_type=float,
observer_type=ValueObserver,
label_keys=("cpu_number",),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,10 @@ def translate_to_collector(
)

metric_descriptor = metrics_pb2.MetricDescriptor(
name=metric_record.metric.name,
description=metric_record.metric.description,
unit=metric_record.metric.unit,
type=get_collector_metric_type(metric_record.metric),
name=metric_record.instrument.name,
description=metric_record.instrument.description,
unit=metric_record.instrument.unit,
type=get_collector_metric_type(metric_record.instrument),
label_keys=label_keys,
)

Expand Down Expand Up @@ -151,14 +151,14 @@ def get_collector_point(metric_record: MetricRecord) -> metrics_pb2.Point:
metric_record.aggregator.last_update_timestamp
)
)
if metric_record.metric.value_type == int:
if metric_record.instrument.value_type == int:
point.int64_value = metric_record.aggregator.checkpoint
elif metric_record.metric.value_type == float:
elif metric_record.instrument.value_type == float:
point.double_value = metric_record.aggregator.checkpoint
else:
raise TypeError(
"Unsupported metric type: {}".format(
metric_record.metric.value_type
metric_record.instrument.value_type
)
)
return point
Original file line number Diff line number Diff line change
Expand Up @@ -92,21 +92,21 @@ def test_get_collector_point(self):
"testName", "testDescription", "unit", float, ValueRecorder
)
result = metrics_exporter.get_collector_point(
MetricRecord(aggregator, self._key_labels, int_counter)
MetricRecord(int_counter, self._key_labels, aggregator)
)
self.assertIsInstance(result, metrics_pb2.Point)
self.assertIsInstance(result.timestamp, Timestamp)
self.assertEqual(result.int64_value, 0)
aggregator.update(123.5)
aggregator.take_checkpoint()
result = metrics_exporter.get_collector_point(
MetricRecord(aggregator, self._key_labels, float_counter)
MetricRecord(float_counter, self._key_labels, aggregator)
)
self.assertEqual(result.double_value, 123.5)
self.assertRaises(
TypeError,
metrics_exporter.get_collector_point(
MetricRecord(aggregator, self._key_labels, valuerecorder)
MetricRecord(valuerecorder, self._key_labels, aggregator)
),
)

Expand All @@ -122,7 +122,7 @@ def test_export(self):
"testname", "testdesc", "unit", int, Counter, ["environment"]
)
record = MetricRecord(
aggregate.CounterAggregator(), self._key_labels, test_metric
test_metric, self._key_labels, aggregate.CounterAggregator(),
)

result = collector_exporter.export([record])
Expand All @@ -147,7 +147,7 @@ def test_translate_to_collector(self):
aggregator = aggregate.CounterAggregator()
aggregator.update(123)
aggregator.take_checkpoint()
record = MetricRecord(aggregator, self._key_labels, test_metric)
record = MetricRecord(test_metric, self._key_labels, aggregator,)
output_metrics = metrics_exporter.translate_to_collector([record])
self.assertEqual(len(output_metrics), 1)
self.assertIsInstance(output_metrics[0], metrics_pb2.Metric)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,22 +152,22 @@ def _translate_to_prometheus(self, metric_record: MetricRecord):
metric_name = ""
if self._prefix != "":
metric_name = self._prefix + "_"
metric_name += self._sanitize(metric_record.metric.name)
metric_name += self._sanitize(metric_record.instrument.name)

if isinstance(metric_record.metric, Counter):
if isinstance(metric_record.instrument, Counter):
prometheus_metric = CounterMetricFamily(
name=metric_name,
documentation=metric_record.metric.description,
documentation=metric_record.instrument.description,
labels=label_keys,
)
prometheus_metric.add_metric(
labels=label_values, value=metric_record.aggregator.checkpoint
)
# TODO: Add support for histograms when supported in OT
elif isinstance(metric_record.metric, ValueRecorder):
elif isinstance(metric_record.instrument, ValueRecorder):
prometheus_metric = UnknownMetricFamily(
name=metric_name,
documentation=metric_record.metric.description,
documentation=metric_record.instrument.description,
labels=label_keys,
)
prometheus_metric.add_metric(
Expand All @@ -176,7 +176,7 @@ def _translate_to_prometheus(self, metric_record: MetricRecord):

else:
logger.warning(
"Unsupported metric type. %s", type(metric_record.metric)
"Unsupported metric type. %s", type(metric_record.instrument)
)
return prometheus_metric

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def test_shutdown(self):
def test_export(self):
with self._registry_register_patch:
record = MetricRecord(
CounterAggregator(), self._labels_key, self._test_metric
self._test_metric, self._labels_key, CounterAggregator(),
)
exporter = PrometheusMetricsExporter()
result = exporter.export([record])
Expand All @@ -90,7 +90,7 @@ def test_counter_to_prometheus(self):
aggregator = CounterAggregator()
aggregator.update(123)
aggregator.take_checkpoint()
record = MetricRecord(aggregator, key_labels, metric)
record = MetricRecord(metric, key_labels, aggregator)
collector = CustomCollector("testprefix")
collector.add_metrics_data([record])

Expand Down Expand Up @@ -118,7 +118,7 @@ def test_invalid_metric(self):
)
labels = {"environment": "staging"}
key_labels = metrics.get_labels_as_key(labels)
record = MetricRecord(None, key_labels, metric)
record = MetricRecord(metric, key_labels, None)
collector = CustomCollector("testprefix")
collector.add_metrics_data([record])
collector.collect()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import psutil

from opentelemetry import metrics
from opentelemetry.sdk.metrics import ValueObserver
from opentelemetry.sdk.metrics.export import MetricsExporter
from opentelemetry.sdk.metrics.export.controller import PushController

Expand Down Expand Up @@ -106,6 +107,7 @@ def __init__(
description="System memory",
unit="bytes",
value_type=int,
observer_type=ValueObserver,
)

self.meter.register_observer(
Expand All @@ -114,6 +116,7 @@ def __init__(
description="System CPU",
unit="seconds",
value_type=float,
observer_type=ValueObserver,
)

self.meter.register_observer(
Expand All @@ -122,6 +125,7 @@ def __init__(
description="System network bytes",
unit="bytes",
value_type=int,
observer_type=ValueObserver,
)

self.meter.register_observer(
Expand All @@ -130,6 +134,7 @@ def __init__(
description="Runtime memory",
unit="bytes",
value_type=int,
observer_type=ValueObserver,
)

self.meter.register_observer(
Expand All @@ -138,6 +143,7 @@ def __init__(
description="Runtime CPU",
unit="seconds",
value_type=float,
observer_type=ValueObserver,
)

self.meter.register_observer(
Expand All @@ -146,9 +152,10 @@ def __init__(
description="Runtime: gc objects",
unit="objects",
value_type=int,
observer_type=ValueObserver,
)

def _get_system_memory(self, observer: metrics.Observer) -> None:
def _get_system_memory(self, observer: metrics.ValueObserver) -> None:
"""Observer callback for memory available

Args:
Expand All @@ -161,7 +168,7 @@ def _get_system_memory(self, observer: metrics.Observer) -> None:
getattr(system_memory, metric), self._system_memory_labels
)

def _get_system_cpu(self, observer: metrics.Observer) -> None:
def _get_system_cpu(self, observer: metrics.ValueObserver) -> None:
"""Observer callback for system cpu

Args:
Expand All @@ -174,7 +181,7 @@ def _get_system_cpu(self, observer: metrics.Observer) -> None:
getattr(cpu_times, _type), self._system_cpu_labels
)

def _get_network_bytes(self, observer: metrics.Observer) -> None:
def _get_network_bytes(self, observer: metrics.ValueObserver) -> None:
"""Observer callback for network bytes

Args:
Expand All @@ -187,7 +194,7 @@ def _get_network_bytes(self, observer: metrics.Observer) -> None:
getattr(net_io, _type), self._network_bytes_labels
)

def _get_runtime_memory(self, observer: metrics.Observer) -> None:
def _get_runtime_memory(self, observer: metrics.ValueObserver) -> None:
"""Observer callback for runtime memory

Args:
Expand All @@ -200,7 +207,7 @@ def _get_runtime_memory(self, observer: metrics.Observer) -> None:
getattr(proc_memory, _type), self._runtime_memory_labels
)

def _get_runtime_cpu(self, observer: metrics.Observer) -> None:
def _get_runtime_cpu(self, observer: metrics.ValueObserver) -> None:
"""Observer callback for runtime CPU

Args:
Expand All @@ -213,7 +220,7 @@ def _get_runtime_cpu(self, observer: metrics.Observer) -> None:
getattr(proc_cpu, _type), self._runtime_cpu_labels
)

def _get_runtime_gc_count(self, observer: metrics.Observer) -> None:
def _get_runtime_gc_count(self, observer: metrics.ValueObserver) -> None:
"""Observer callback for garbage collection

Args:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def _assert_metrics(self, observer_name, system_metrics, expected):
):
if (
metric.labels in expected
and metric.metric.name == observer_name
and metric.instrument.name == observer_name
):
self.assertEqual(
metric.aggregator.checkpoint.last, expected[metric.labels],
Expand Down
2 changes: 2 additions & 0 deletions opentelemetry-api/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
([#751](https://github.com/open-telemetry/opentelemetry-python/pull/751))
- Rename Measure to ValueRecorder in metrics
([#761](https://github.com/open-telemetry/opentelemetry-python/pull/761))
- Rename Observer to ValueObserver
([#764](https://github.com/open-telemetry/opentelemetry-python/pull/764))

## 0.8b0

Expand Down
20 changes: 18 additions & 2 deletions opentelemetry-api/src/opentelemetry/metrics/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@ class Observer(abc.ABC):
"""An observer type metric instrument used to capture a current set of
values.


Observer instruments are asynchronous, a callback is invoked with the
observer instrument as argument allowing the user to capture multiple
values per collection interval.
Expand Down Expand Up @@ -190,6 +189,18 @@ def observe(self, value: ValueT, labels: Dict[str, str]) -> None:
"""


class ValueObserver(Observer):
"""No-op implementation of ``ValueObserver``."""

def observe(self, value: ValueT, labels: Dict[str, str]) -> None:
"""Captures ``value`` to the valueobserver.

Args:
value: The value to capture to this valueobserver metric.
labels: Labels associated to ``value``.
"""


class MeterProvider(abc.ABC):
@abc.abstractmethod
def get_meter(
Expand Down Expand Up @@ -232,7 +243,9 @@ def get_meter(
return DefaultMeter()


MetricT = TypeVar("MetricT", Counter, ValueRecorder, Observer)
MetricT = TypeVar("MetricT", Counter, ValueRecorder)
InstrumentT = TypeVar("InstrumentT", Counter, Observer, ValueRecorder)
ObserverT = TypeVar("ObserverT", bound=Observer)
ObserverCallbackT = Callable[[Observer], None]


Expand Down Expand Up @@ -297,6 +310,7 @@ def register_observer(
description: str,
unit: str,
value_type: Type[ValueT],
observer_type: Type[ObserverT],
label_keys: Sequence[str] = (),
enabled: bool = True,
) -> "Observer":
Expand All @@ -310,6 +324,7 @@ def register_observer(
unit: Unit of the metric values following the UCUM convention
(https://unitsofmeasure.org/ucum.html).
value_type: The type of values being recorded by the metric.
observer_type: The type of observer being registered.
label_keys: The keys for the labels with dynamic values.
enabled: Whether to report the metric by default.
Returns: A new ``Observer`` metric instrument.
Expand Down Expand Up @@ -354,6 +369,7 @@ def register_observer(
description: str,
unit: str,
value_type: Type[ValueT],
observer_type: Type[ObserverT],
label_keys: Sequence[str] = (),
enabled: bool = True,
) -> "Observer":
Expand Down
4 changes: 3 additions & 1 deletion opentelemetry-api/tests/test_implementation.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ def test_create_metric(self):
def test_register_observer(self):
meter = metrics.DefaultMeter()
callback = mock.Mock()
observer = meter.register_observer(callback, "", "", "", int, (), True)
observer = meter.register_observer(
callback, "", "", "", int, metrics.ValueObserver
)
self.assertIsInstance(observer, metrics.DefaultObserver)

def test_unregister_observer(self):
Expand Down
2 changes: 2 additions & 0 deletions opentelemetry-sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
([#761](https://github.com/open-telemetry/opentelemetry-python/pull/761))
- bugfix: byte type attributes are decoded before adding to attributes dict
([#775](https://github.com/open-telemetry/opentelemetry-python/pull/775))
- Rename Observer to ValueObserver
([#764](https://github.com/open-telemetry/opentelemetry-python/pull/764))

## 0.8b0

Expand Down
Loading