|
28 | 28 | from threading import RLock
|
29 | 29 | from typing import Optional, cast
|
30 | 30 |
|
| 31 | +from opentelemetry.safe import BaseSafeClass |
31 | 32 | from opentelemetry.environment_variables import OTEL_PYTHON_METER_PROVIDER
|
32 | 33 | from opentelemetry.metrics.instrument import (
|
33 | 34 | Counter,
|
34 |
| - DefaultCounter, |
35 |
| - DefaultHistogram, |
36 |
| - DefaultObservableCounter, |
37 |
| - DefaultObservableGauge, |
38 |
| - DefaultObservableUpDownCounter, |
39 |
| - DefaultUpDownCounter, |
| 35 | + NoOpCounter, |
| 36 | + NoOpHistogram, |
| 37 | + NoOpObservableCounter, |
| 38 | + NoOpObservableGauge, |
| 39 | + NoOpObservableUpDownCounter, |
| 40 | + NoOpUpDownCounter, |
40 | 41 | Histogram,
|
41 | 42 | ObservableCounter,
|
42 | 43 | ObservableGauge,
|
@@ -64,110 +65,108 @@ def get_meter(
|
64 | 65 | _logger.warning("Invalid name: %s", name)
|
65 | 66 |
|
66 | 67 |
|
67 |
| -class _DefaultMeterProvider(MeterProvider): |
68 |
| - def get_meter( |
69 |
| - self, |
70 |
| - name, |
71 |
| - version=None, |
72 |
| - schema_url=None, |
73 |
| - ) -> "Meter": |
74 |
| - with self._lock: |
75 |
| - super().get_meter(name, version=version, schema_url=schema_url) |
76 |
| - # This is done in order to make it possible to store configuration |
77 |
| - # in the meter provider and make it automatically accessible for |
78 |
| - # any meter even after it changes. |
79 |
| - meter = _DefaultMeter(name, version=version, schema_url=schema_url) |
80 |
| - meter._meter_provider = self # pylint: disable=protected-access |
81 |
| - return meter |
82 |
| - |
83 |
| - |
84 |
| -class ProxyMeterProvider(MeterProvider): |
85 |
| - def get_meter( |
86 |
| - self, |
87 |
| - name, |
88 |
| - version=None, |
89 |
| - schema_url=None, |
90 |
| - ) -> "Meter": |
91 |
| - with self._lock: |
92 |
| - if _METER_PROVIDER: |
93 |
| - return _METER_PROVIDER.get_meter( |
94 |
| - name, version=version, schema_url=schema_url |
95 |
| - ) |
96 |
| - return ProxyMeter(name, version=version, schema_url=schema_url) |
97 |
| - |
98 |
| - |
99 | 68 | class Meter(ABC):
|
100 | 69 | def __init__(self, name, version=None, schema_url=None):
|
101 | 70 | super().__init__()
|
102 |
| - self._lock = RLock() |
103 |
| - self._name = name |
104 |
| - self._version = version |
105 |
| - self._schema_url = schema_url |
106 |
| - self._instrument_names = set() |
107 |
| - self._meter_provider = None |
108 | 71 |
|
109 |
| - @property |
110 |
| - def name(self): |
111 |
| - with self._lock: |
112 |
| - return self._name |
| 72 | + def _secure_instrument_name(self, name) -> bool: |
| 73 | + name = name.lower() |
113 | 74 |
|
114 |
| - @property |
115 |
| - def version(self): |
116 |
| - with self._lock: |
117 |
| - return self._version |
| 75 | + if name in self._instrument_names: |
| 76 | + warn(f"Instrument name {name} has been used already") |
| 77 | + return False |
118 | 78 |
|
119 |
| - @property |
120 |
| - def schema_url(self): |
121 |
| - with self._lock: |
122 |
| - return self._schema_url |
123 |
| - |
124 |
| - def _secure_instrument_name(self, name): |
125 |
| - with self._lock: |
126 |
| - name = name.lower() |
127 |
| - |
128 |
| - if name in self._instrument_names: |
129 |
| - _logger.error("Instrument name %s has been used already", name) |
130 |
| - |
131 |
| - else: |
132 |
| - self._instrument_names.add(name) |
| 79 | + else: |
| 80 | + self._instrument_names.add(name) |
| 81 | + return True |
133 | 82 |
|
134 | 83 | @abstractmethod
|
135 | 84 | def create_counter(self, name, unit="", description="") -> Counter:
|
136 |
| - with self._lock: |
137 |
| - self._secure_instrument_name(name) |
| 85 | + pass |
138 | 86 |
|
139 | 87 | @abstractmethod
|
140 | 88 | def create_up_down_counter(
|
141 | 89 | self, name, unit="", description=""
|
142 | 90 | ) -> UpDownCounter:
|
143 |
| - with self._lock: |
144 |
| - self._secure_instrument_name(name) |
| 91 | + pass |
145 | 92 |
|
146 | 93 | @abstractmethod
|
147 | 94 | def create_observable_counter(
|
148 | 95 | self, name, callback, unit="", description=""
|
149 | 96 | ) -> ObservableCounter:
|
150 |
| - with self._lock: |
151 |
| - self._secure_instrument_name(name) |
| 97 | + pass |
152 | 98 |
|
153 | 99 | @abstractmethod
|
154 | 100 | def create_histogram(self, name, unit="", description="") -> Histogram:
|
155 |
| - with self._lock: |
156 |
| - self._secure_instrument_name(name) |
| 101 | + pass |
157 | 102 |
|
158 | 103 | @abstractmethod
|
159 | 104 | def create_observable_gauge(
|
160 | 105 | self, name, callback, unit="", description=""
|
161 | 106 | ) -> ObservableGauge:
|
162 |
| - with self._lock: |
163 |
| - self._secure_instrument_name(name) |
| 107 | + pass |
164 | 108 |
|
165 | 109 | @abstractmethod
|
166 | 110 | def create_observable_up_down_counter(
|
167 | 111 | self, name, callback, unit="", description=""
|
168 | 112 | ) -> ObservableUpDownCounter:
|
| 113 | + pass |
| 114 | + |
| 115 | + |
| 116 | +class NoOpMeter(BaseSafeClass, Meter): |
| 117 | + def create_counter(self, name, unit="", description="") -> Counter: |
| 118 | + return NoOpCounter(_safe=True) |
| 119 | + |
| 120 | + def create_up_down_counter( |
| 121 | + self, name, unit="", description="" |
| 122 | + ) -> UpDownCounter: |
| 123 | + return NoOpUpDownCounter(_safe=True) |
| 124 | + |
| 125 | + def create_observable_counter( |
| 126 | + self, name, callback, unit="", description="" |
| 127 | + ) -> ObservableCounter: |
| 128 | + |
| 129 | + def create_histogram(self, name, unit="", description="") -> Histogram: |
| 130 | + |
| 131 | + def create_observable_gauge( |
| 132 | + self, name, callback, unit="", description="" |
| 133 | + ) -> ObservableGauge: |
| 134 | + |
| 135 | + def create_observable_up_down_counter( |
| 136 | + self, name, callback, unit="", description="" |
| 137 | + ) -> ObservableUpDownCounter: |
| 138 | + |
| 139 | + |
| 140 | +class NoOpMeterProvider(BaseSafeClass, MeterProvider): |
| 141 | + def get_meter( |
| 142 | + self, |
| 143 | + name, |
| 144 | + version=None, |
| 145 | + schema_url=None, |
| 146 | + ) -> "Meter": |
| 147 | + |
| 148 | + |
| 149 | + def _init(self, *args, **kwargs): |
| 150 | + pass |
| 151 | + |
| 152 | + def _get_default_arguments(self, *args, **kwargs): |
| 153 | + return (), {} |
| 154 | + |
| 155 | + |
| 156 | +class ProxyMeterProvider(MeterProvider): |
| 157 | + def get_meter( |
| 158 | + self, |
| 159 | + name, |
| 160 | + version=None, |
| 161 | + schema_url=None, |
| 162 | + ) -> "Meter": |
169 | 163 | with self._lock:
|
170 |
| - self._secure_instrument_name(name) |
| 164 | + if _METER_PROVIDER: |
| 165 | + return _METER_PROVIDER.get_meter( |
| 166 | + name, version=version, schema_url=schema_url |
| 167 | + ) |
| 168 | + return ProxyMeter(name, version=version, schema_url=schema_url) |
| 169 | + |
171 | 170 |
|
172 | 171 |
|
173 | 172 | class ProxyMeter(Meter):
|
@@ -226,71 +225,6 @@ def create_observable_up_down_counter(
|
226 | 225 | )
|
227 | 226 |
|
228 | 227 |
|
229 |
| -class _DefaultMeter(Meter): |
230 |
| - def create_counter(self, name, unit="", description="") -> Counter: |
231 |
| - with self._lock: |
232 |
| - super().create_counter(name, unit=unit, description=description) |
233 |
| - return DefaultCounter(name, unit=unit, description=description) |
234 |
| - |
235 |
| - def create_up_down_counter( |
236 |
| - self, name, unit="", description="" |
237 |
| - ) -> UpDownCounter: |
238 |
| - with self._lock: |
239 |
| - super().create_up_down_counter( |
240 |
| - name, unit=unit, description=description |
241 |
| - ) |
242 |
| - return DefaultUpDownCounter( |
243 |
| - name, unit=unit, description=description |
244 |
| - ) |
245 |
| - |
246 |
| - def create_observable_counter( |
247 |
| - self, name, callback, unit="", description="" |
248 |
| - ) -> ObservableCounter: |
249 |
| - with self._lock: |
250 |
| - super().create_observable_counter( |
251 |
| - name, callback, unit=unit, description=description |
252 |
| - ) |
253 |
| - return DefaultObservableCounter( |
254 |
| - name, |
255 |
| - callback, |
256 |
| - unit=unit, |
257 |
| - description=description, |
258 |
| - ) |
259 |
| - |
260 |
| - def create_histogram(self, name, unit="", description="") -> Histogram: |
261 |
| - with self._lock: |
262 |
| - super().create_histogram(name, unit=unit, description=description) |
263 |
| - return DefaultHistogram(name, unit=unit, description=description) |
264 |
| - |
265 |
| - def create_observable_gauge( |
266 |
| - self, name, callback, unit="", description="" |
267 |
| - ) -> ObservableGauge: |
268 |
| - with self._lock: |
269 |
| - super().create_observable_gauge( |
270 |
| - name, callback, unit=unit, description=description |
271 |
| - ) |
272 |
| - return DefaultObservableGauge( |
273 |
| - name, |
274 |
| - callback, |
275 |
| - unit=unit, |
276 |
| - description=description, |
277 |
| - ) |
278 |
| - |
279 |
| - def create_observable_up_down_counter( |
280 |
| - self, name, callback, unit="", description="" |
281 |
| - ) -> ObservableUpDownCounter: |
282 |
| - with self._lock: |
283 |
| - super().create_observable_up_down_counter( |
284 |
| - name, callback, unit=unit, description=description |
285 |
| - ) |
286 |
| - return DefaultObservableUpDownCounter( |
287 |
| - name, |
288 |
| - callback, |
289 |
| - unit=unit, |
290 |
| - description=description, |
291 |
| - ) |
292 |
| - |
293 |
| - |
294 | 228 | _METER_PROVIDER = None
|
295 | 229 | _PROXY_METER_PROVIDER = None
|
296 | 230 |
|
|
0 commit comments