|
15 | 15 | # pylint: disable=unused-import |
16 | 16 |
|
17 | 17 | from abc import ABC, abstractmethod |
| 18 | +from logging import getLogger |
18 | 19 | from threading import Lock |
19 | 20 | from time import time_ns |
20 | 21 | from typing import Iterable, List, Mapping, Optional |
|
31 | 32 | ) |
32 | 33 | from opentelemetry.sdk.metrics._internal.point import Metric |
33 | 34 |
|
| 35 | +_logger = getLogger(__name__) |
| 36 | + |
34 | 37 |
|
35 | 38 | class MeasurementConsumer(ABC): |
36 | 39 | @abstractmethod |
@@ -143,3 +146,41 @@ def collect( |
143 | 146 | result = self._reader_storages[metric_reader].collect() |
144 | 147 |
|
145 | 148 | return result |
| 149 | + |
| 150 | + def add_metric_reader( |
| 151 | + self, metric_reader: "opentelemetry.sdk.metrics.MetricReader" |
| 152 | + ) -> None: |
| 153 | + """Registers a new metric reader.""" |
| 154 | + with self._lock: |
| 155 | + if metric_reader in self._reader_storages: |
| 156 | + _logger.warning("'%s' already registered!", metric_reader) |
| 157 | + return False |
| 158 | + self._sdk_config.metric_readers += type( |
| 159 | + self._sdk_config.metric_readers |
| 160 | + )((metric_reader,)) |
| 161 | + self._reader_storages[metric_reader] = MetricReaderStorage( |
| 162 | + self._sdk_config, |
| 163 | + metric_reader._instrument_class_temporality, |
| 164 | + metric_reader._instrument_class_aggregation, |
| 165 | + ) |
| 166 | + metric_reader._set_collect_callback(self.collect) |
| 167 | + return True |
| 168 | + |
| 169 | + def remove_metric_reader( |
| 170 | + self, metric_reader: "opentelemetry.sdk.metrics.MetricReader" |
| 171 | + ) -> None: |
| 172 | + """Unregisters the given metric reader.""" |
| 173 | + with self._lock: |
| 174 | + if metric_reader not in self._reader_storages: |
| 175 | + _logger.warning("'%s' has not been registered!", metric_reader) |
| 176 | + self._reader_storages.pop(metric_reader, None) |
| 177 | + metric_reader._set_collect_callback(None) |
| 178 | + self._sdk_config.metric_readers = type( |
| 179 | + self._sdk_config.metric_readers |
| 180 | + )( |
| 181 | + ( |
| 182 | + reader |
| 183 | + for reader in self._sdk_config.metric_readers |
| 184 | + if reader is not metric_reader |
| 185 | + ) |
| 186 | + ) |
0 commit comments