Skip to content

Commit d755375

Browse files
authored
api/sdk: Observer to ValueObserver (#764)
1 parent 20cf4cb commit d755375

File tree

17 files changed

+136
-86
lines changed

17 files changed

+136
-86
lines changed

docs/examples/basic_meter/observer.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import psutil
2020

2121
from opentelemetry import metrics
22-
from opentelemetry.sdk.metrics import MeterProvider
22+
from opentelemetry.sdk.metrics import MeterProvider, ValueObserver
2323
from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter
2424
from opentelemetry.sdk.metrics.export.batcher import UngroupedBatcher
2525
from opentelemetry.sdk.metrics.export.controller import PushController
@@ -43,6 +43,7 @@ def get_cpu_usage_callback(observer):
4343
description="per-cpu usage",
4444
unit="1",
4545
value_type=float,
46+
observer_type=ValueObserver,
4647
label_keys=("cpu_number",),
4748
)
4849

ext/opentelemetry-ext-opencensusexporter/src/opentelemetry/ext/opencensusexporter/metrics_exporter/__init__.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,10 @@ def translate_to_collector(
114114
)
115115

116116
metric_descriptor = metrics_pb2.MetricDescriptor(
117-
name=metric_record.metric.name,
118-
description=metric_record.metric.description,
119-
unit=metric_record.metric.unit,
120-
type=get_collector_metric_type(metric_record.metric),
117+
name=metric_record.instrument.name,
118+
description=metric_record.instrument.description,
119+
unit=metric_record.instrument.unit,
120+
type=get_collector_metric_type(metric_record.instrument),
121121
label_keys=label_keys,
122122
)
123123

@@ -151,14 +151,14 @@ def get_collector_point(metric_record: MetricRecord) -> metrics_pb2.Point:
151151
metric_record.aggregator.last_update_timestamp
152152
)
153153
)
154-
if metric_record.metric.value_type == int:
154+
if metric_record.instrument.value_type == int:
155155
point.int64_value = metric_record.aggregator.checkpoint
156-
elif metric_record.metric.value_type == float:
156+
elif metric_record.instrument.value_type == float:
157157
point.double_value = metric_record.aggregator.checkpoint
158158
else:
159159
raise TypeError(
160160
"Unsupported metric type: {}".format(
161-
metric_record.metric.value_type
161+
metric_record.instrument.value_type
162162
)
163163
)
164164
return point

ext/opentelemetry-ext-opencensusexporter/tests/test_otcollector_metrics_exporter.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -92,21 +92,21 @@ def test_get_collector_point(self):
9292
"testName", "testDescription", "unit", float, ValueRecorder
9393
)
9494
result = metrics_exporter.get_collector_point(
95-
MetricRecord(aggregator, self._key_labels, int_counter)
95+
MetricRecord(int_counter, self._key_labels, aggregator)
9696
)
9797
self.assertIsInstance(result, metrics_pb2.Point)
9898
self.assertIsInstance(result.timestamp, Timestamp)
9999
self.assertEqual(result.int64_value, 0)
100100
aggregator.update(123.5)
101101
aggregator.take_checkpoint()
102102
result = metrics_exporter.get_collector_point(
103-
MetricRecord(aggregator, self._key_labels, float_counter)
103+
MetricRecord(float_counter, self._key_labels, aggregator)
104104
)
105105
self.assertEqual(result.double_value, 123.5)
106106
self.assertRaises(
107107
TypeError,
108108
metrics_exporter.get_collector_point(
109-
MetricRecord(aggregator, self._key_labels, valuerecorder)
109+
MetricRecord(valuerecorder, self._key_labels, aggregator)
110110
),
111111
)
112112

@@ -122,7 +122,7 @@ def test_export(self):
122122
"testname", "testdesc", "unit", int, Counter, ["environment"]
123123
)
124124
record = MetricRecord(
125-
aggregate.CounterAggregator(), self._key_labels, test_metric
125+
test_metric, self._key_labels, aggregate.CounterAggregator(),
126126
)
127127

128128
result = collector_exporter.export([record])
@@ -147,7 +147,7 @@ def test_translate_to_collector(self):
147147
aggregator = aggregate.CounterAggregator()
148148
aggregator.update(123)
149149
aggregator.take_checkpoint()
150-
record = MetricRecord(aggregator, self._key_labels, test_metric)
150+
record = MetricRecord(test_metric, self._key_labels, aggregator,)
151151
output_metrics = metrics_exporter.translate_to_collector([record])
152152
self.assertEqual(len(output_metrics), 1)
153153
self.assertIsInstance(output_metrics[0], metrics_pb2.Metric)

ext/opentelemetry-ext-prometheus/src/opentelemetry/ext/prometheus/__init__.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -152,22 +152,22 @@ def _translate_to_prometheus(self, metric_record: MetricRecord):
152152
metric_name = ""
153153
if self._prefix != "":
154154
metric_name = self._prefix + "_"
155-
metric_name += self._sanitize(metric_record.metric.name)
155+
metric_name += self._sanitize(metric_record.instrument.name)
156156

157-
if isinstance(metric_record.metric, Counter):
157+
if isinstance(metric_record.instrument, Counter):
158158
prometheus_metric = CounterMetricFamily(
159159
name=metric_name,
160-
documentation=metric_record.metric.description,
160+
documentation=metric_record.instrument.description,
161161
labels=label_keys,
162162
)
163163
prometheus_metric.add_metric(
164164
labels=label_values, value=metric_record.aggregator.checkpoint
165165
)
166166
# TODO: Add support for histograms when supported in OT
167-
elif isinstance(metric_record.metric, ValueRecorder):
167+
elif isinstance(metric_record.instrument, ValueRecorder):
168168
prometheus_metric = UnknownMetricFamily(
169169
name=metric_name,
170-
documentation=metric_record.metric.description,
170+
documentation=metric_record.instrument.description,
171171
labels=label_keys,
172172
)
173173
prometheus_metric.add_metric(
@@ -176,7 +176,7 @@ def _translate_to_prometheus(self, metric_record: MetricRecord):
176176

177177
else:
178178
logger.warning(
179-
"Unsupported metric type. %s", type(metric_record.metric)
179+
"Unsupported metric type. %s", type(metric_record.instrument)
180180
)
181181
return prometheus_metric
182182

ext/opentelemetry-ext-prometheus/tests/test_prometheus_exporter.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_shutdown(self):
6767
def test_export(self):
6868
with self._registry_register_patch:
6969
record = MetricRecord(
70-
CounterAggregator(), self._labels_key, self._test_metric
70+
self._test_metric, self._labels_key, CounterAggregator(),
7171
)
7272
exporter = PrometheusMetricsExporter()
7373
result = exporter.export([record])
@@ -90,7 +90,7 @@ def test_counter_to_prometheus(self):
9090
aggregator = CounterAggregator()
9191
aggregator.update(123)
9292
aggregator.take_checkpoint()
93-
record = MetricRecord(aggregator, key_labels, metric)
93+
record = MetricRecord(metric, key_labels, aggregator)
9494
collector = CustomCollector("testprefix")
9595
collector.add_metrics_data([record])
9696

@@ -118,7 +118,7 @@ def test_invalid_metric(self):
118118
)
119119
labels = {"environment": "staging"}
120120
key_labels = metrics.get_labels_as_key(labels)
121-
record = MetricRecord(None, key_labels, metric)
121+
record = MetricRecord(metric, key_labels, None)
122122
collector = CustomCollector("testprefix")
123123
collector.add_metrics_data([record])
124124
collector.collect()

ext/opentelemetry-ext-system-metrics/src/opentelemetry/ext/system_metrics/__init__.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import psutil
5959

6060
from opentelemetry import metrics
61+
from opentelemetry.sdk.metrics import ValueObserver
6162
from opentelemetry.sdk.metrics.export import MetricsExporter
6263
from opentelemetry.sdk.metrics.export.controller import PushController
6364

@@ -106,6 +107,7 @@ def __init__(
106107
description="System memory",
107108
unit="bytes",
108109
value_type=int,
110+
observer_type=ValueObserver,
109111
)
110112

111113
self.meter.register_observer(
@@ -114,6 +116,7 @@ def __init__(
114116
description="System CPU",
115117
unit="seconds",
116118
value_type=float,
119+
observer_type=ValueObserver,
117120
)
118121

119122
self.meter.register_observer(
@@ -122,6 +125,7 @@ def __init__(
122125
description="System network bytes",
123126
unit="bytes",
124127
value_type=int,
128+
observer_type=ValueObserver,
125129
)
126130

127131
self.meter.register_observer(
@@ -130,6 +134,7 @@ def __init__(
130134
description="Runtime memory",
131135
unit="bytes",
132136
value_type=int,
137+
observer_type=ValueObserver,
133138
)
134139

135140
self.meter.register_observer(
@@ -138,6 +143,7 @@ def __init__(
138143
description="Runtime CPU",
139144
unit="seconds",
140145
value_type=float,
146+
observer_type=ValueObserver,
141147
)
142148

143149
self.meter.register_observer(
@@ -146,9 +152,10 @@ def __init__(
146152
description="Runtime: gc objects",
147153
unit="objects",
148154
value_type=int,
155+
observer_type=ValueObserver,
149156
)
150157

151-
def _get_system_memory(self, observer: metrics.Observer) -> None:
158+
def _get_system_memory(self, observer: metrics.ValueObserver) -> None:
152159
"""Observer callback for memory available
153160
154161
Args:
@@ -161,7 +168,7 @@ def _get_system_memory(self, observer: metrics.Observer) -> None:
161168
getattr(system_memory, metric), self._system_memory_labels
162169
)
163170

164-
def _get_system_cpu(self, observer: metrics.Observer) -> None:
171+
def _get_system_cpu(self, observer: metrics.ValueObserver) -> None:
165172
"""Observer callback for system cpu
166173
167174
Args:
@@ -174,7 +181,7 @@ def _get_system_cpu(self, observer: metrics.Observer) -> None:
174181
getattr(cpu_times, _type), self._system_cpu_labels
175182
)
176183

177-
def _get_network_bytes(self, observer: metrics.Observer) -> None:
184+
def _get_network_bytes(self, observer: metrics.ValueObserver) -> None:
178185
"""Observer callback for network bytes
179186
180187
Args:
@@ -187,7 +194,7 @@ def _get_network_bytes(self, observer: metrics.Observer) -> None:
187194
getattr(net_io, _type), self._network_bytes_labels
188195
)
189196

190-
def _get_runtime_memory(self, observer: metrics.Observer) -> None:
197+
def _get_runtime_memory(self, observer: metrics.ValueObserver) -> None:
191198
"""Observer callback for runtime memory
192199
193200
Args:
@@ -200,7 +207,7 @@ def _get_runtime_memory(self, observer: metrics.Observer) -> None:
200207
getattr(proc_memory, _type), self._runtime_memory_labels
201208
)
202209

203-
def _get_runtime_cpu(self, observer: metrics.Observer) -> None:
210+
def _get_runtime_cpu(self, observer: metrics.ValueObserver) -> None:
204211
"""Observer callback for runtime CPU
205212
206213
Args:
@@ -213,7 +220,7 @@ def _get_runtime_cpu(self, observer: metrics.Observer) -> None:
213220
getattr(proc_cpu, _type), self._runtime_cpu_labels
214221
)
215222

216-
def _get_runtime_gc_count(self, observer: metrics.Observer) -> None:
223+
def _get_runtime_gc_count(self, observer: metrics.ValueObserver) -> None:
217224
"""Observer callback for garbage collection
218225
219226
Args:

ext/opentelemetry-ext-system-metrics/tests/test_system_metrics.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def _assert_metrics(self, observer_name, system_metrics, expected):
5454
):
5555
if (
5656
metric.labels in expected
57-
and metric.metric.name == observer_name
57+
and metric.instrument.name == observer_name
5858
):
5959
self.assertEqual(
6060
metric.aggregator.checkpoint.last, expected[metric.labels],

opentelemetry-api/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
([#751](https://github.com/open-telemetry/opentelemetry-python/pull/751))
77
- Rename Measure to ValueRecorder in metrics
88
([#761](https://github.com/open-telemetry/opentelemetry-python/pull/761))
9+
- Rename Observer to ValueObserver
10+
([#764](https://github.com/open-telemetry/opentelemetry-python/pull/764))
911

1012
## 0.8b0
1113

opentelemetry-api/src/opentelemetry/metrics/__init__.py

+18-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ class Observer(abc.ABC):
162162
"""An observer type metric instrument used to capture a current set of
163163
values.
164164
165-
166165
Observer instruments are asynchronous, a callback is invoked with the
167166
observer instrument as argument allowing the user to capture multiple
168167
values per collection interval.
@@ -190,6 +189,18 @@ def observe(self, value: ValueT, labels: Dict[str, str]) -> None:
190189
"""
191190

192191

192+
class ValueObserver(Observer):
193+
"""No-op implementation of ``ValueObserver``."""
194+
195+
def observe(self, value: ValueT, labels: Dict[str, str]) -> None:
196+
"""Captures ``value`` to the valueobserver.
197+
198+
Args:
199+
value: The value to capture to this valueobserver metric.
200+
labels: Labels associated to ``value``.
201+
"""
202+
203+
193204
class MeterProvider(abc.ABC):
194205
@abc.abstractmethod
195206
def get_meter(
@@ -232,7 +243,9 @@ def get_meter(
232243
return DefaultMeter()
233244

234245

235-
MetricT = TypeVar("MetricT", Counter, ValueRecorder, Observer)
246+
MetricT = TypeVar("MetricT", Counter, ValueRecorder)
247+
InstrumentT = TypeVar("InstrumentT", Counter, Observer, ValueRecorder)
248+
ObserverT = TypeVar("ObserverT", bound=Observer)
236249
ObserverCallbackT = Callable[[Observer], None]
237250

238251

@@ -297,6 +310,7 @@ def register_observer(
297310
description: str,
298311
unit: str,
299312
value_type: Type[ValueT],
313+
observer_type: Type[ObserverT],
300314
label_keys: Sequence[str] = (),
301315
enabled: bool = True,
302316
) -> "Observer":
@@ -310,6 +324,7 @@ def register_observer(
310324
unit: Unit of the metric values following the UCUM convention
311325
(https://unitsofmeasure.org/ucum.html).
312326
value_type: The type of values being recorded by the metric.
327+
observer_type: The type of observer being registered.
313328
label_keys: The keys for the labels with dynamic values.
314329
enabled: Whether to report the metric by default.
315330
Returns: A new ``Observer`` metric instrument.
@@ -354,6 +369,7 @@ def register_observer(
354369
description: str,
355370
unit: str,
356371
value_type: Type[ValueT],
372+
observer_type: Type[ObserverT],
357373
label_keys: Sequence[str] = (),
358374
enabled: bool = True,
359375
) -> "Observer":

opentelemetry-api/tests/test_implementation.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ def test_create_metric(self):
8383
def test_register_observer(self):
8484
meter = metrics.DefaultMeter()
8585
callback = mock.Mock()
86-
observer = meter.register_observer(callback, "", "", "", int, (), True)
86+
observer = meter.register_observer(
87+
callback, "", "", "", int, metrics.ValueObserver
88+
)
8789
self.assertIsInstance(observer, metrics.DefaultObserver)
8890

8991
def test_unregister_observer(self):

opentelemetry-sdk/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
([#761](https://github.com/open-telemetry/opentelemetry-python/pull/761))
99
- bugfix: byte type attributes are decoded before adding to attributes dict
1010
([#775](https://github.com/open-telemetry/opentelemetry-python/pull/775))
11+
- Rename Observer to ValueObserver
12+
([#764](https://github.com/open-telemetry/opentelemetry-python/pull/764))
1113

1214
## 0.8b0
1315

0 commit comments

Comments
 (0)