Skip to content

Commit 40c1b5a

Browse files
committed
Updates to ensure consistent updates to all metrics readers
1 parent 023dcf8 commit 40c1b5a

3 files changed

Lines changed: 23 additions & 21 deletions

File tree

opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,12 +584,27 @@ def get_meter(
584584
def add_metric_reader(
585585
self, metric_reader: "opentelemetry.sdk.metrics.export.MetricReader"
586586
) -> None:
587-
with self._lock:
587+
with self._all_metric_readers_lock:
588+
if metric_reader in self._all_metric_readers:
589+
raise ValueError(
590+
f"MetricReader {metric_reader} has been registered already!"
591+
)
588592
self._measurement_consumer.add_metric_reader(metric_reader)
593+
metric_reader._set_collect_callback(
594+
self._measurement_consumer.collect
595+
)
596+
self._all_metric_readers.add(metric_reader)
589597

590598
def remove_metric_reader(
591599
self,
592600
metric_reader: "opentelemetry.sdk.metrics.export.MetricReader",
593601
) -> None:
594-
with self._lock:
602+
with self._all_metric_readers_lock:
603+
if metric_reader not in self._all_metric_readers:
604+
raise ValueError(
605+
f"MetricReader {metric_reader} has not been registered!"
606+
)
595607
self._measurement_consumer.remove_metric_reader(metric_reader)
608+
metric_reader._set_collect_callback(None)
609+
metric_reader.shutdown()
610+
self._all_metric_readers.remove(metric_reader)

opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
# pylint: disable=unused-import
1616

1717
from abc import ABC, abstractmethod
18-
from logging import getLogger
1918
from threading import Lock
2019
from time import time_ns
2120
from typing import Iterable, List, Mapping, Optional
@@ -32,8 +31,6 @@
3231
)
3332
from opentelemetry.sdk.metrics._internal.point import Metric
3433

35-
_logger = getLogger(__name__)
36-
3734

3835
class MeasurementConsumer(ABC):
3936
@abstractmethod
@@ -152,8 +149,6 @@ def add_metric_reader(
152149
) -> None:
153150
"""Registers a new metric reader."""
154151
with self._lock:
155-
if metric_reader in self._reader_storages:
156-
_logger.warning("'%s' already registered!", metric_reader)
157152
self._sdk_config.metric_readers += type(
158153
self._sdk_config.metric_readers
159154
)((metric_reader,))
@@ -162,17 +157,13 @@ def add_metric_reader(
162157
metric_reader._instrument_class_temporality,
163158
metric_reader._instrument_class_aggregation,
164159
)
165-
metric_reader._set_collect_callback(self.collect)
166160

167161
def remove_metric_reader(
168162
self, metric_reader: "opentelemetry.sdk.metrics.MetricReader"
169163
) -> None:
170164
"""Unregisters the given metric reader."""
171165
with self._lock:
172-
if metric_reader not in self._reader_storages:
173-
_logger.warning("'%s' has not been registered!", metric_reader)
174166
self._reader_storages.pop(metric_reader, None)
175-
metric_reader._set_collect_callback(None)
176167
self._sdk_config.metric_readers = type(
177168
self._sdk_config.metric_readers
178169
)(

opentelemetry-sdk/tests/metrics/test_metrics.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -442,23 +442,19 @@ def test_addition_of_metric_reader(self):
442442
counter.add(1)
443443
self.assertIsNotNone(reader.get_metrics_data())
444444

445-
with self.assertLogs(
446-
"opentelemetry.sdk.metrics._internal.measurement_consumer",
447-
WARNING,
448-
) as logger:
445+
with self.assertRaises(ValueError) as cm:
449446
meter_provider.add_metric_reader(reader)
450-
self.assertIn("already registered!", logger.output[0])
447+
self.assertIn(
448+
"has been registered already!", str(cm.exception)
449+
)
451450

452451
meter_provider.remove_metric_reader(reader)
453452
counter.add(1)
454453
self.assertIsNone(reader.get_metrics_data())
455454

456-
with self.assertLogs(
457-
"opentelemetry.sdk.metrics._internal.measurement_consumer",
458-
WARNING,
459-
) as logger:
455+
with self.assertRaises(ValueError) as cm:
460456
meter_provider.remove_metric_reader(reader)
461-
self.assertIn("has not been registered!", logger.output[0])
457+
self.assertIn("has not been registered!", str(cm.exception))
462458

463459

464460
class TestMeter(TestCase):

0 commit comments

Comments
 (0)