Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fb1063c

Browse files
authored
Handle duplicate meters (open-telemetry#2373)
1 parent 8ff97ea commit fb1063c

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,15 @@ def __init__(
154154
shutdown_on_exit: bool = True,
155155
):
156156
self._lock = Lock()
157+
self._meter_lock = Lock()
157158
self._atexit_handler = None
158159

159160
self._measurement_consumer = SynchronousMeasurementConsumer()
160161

161162
if shutdown_on_exit:
162163
self._atexit_handler = register(self.shutdown)
163164

165+
self._meters = {}
164166
self._metric_readers = metric_readers
165167

166168
for metric_reader in self._metric_readers:
@@ -221,7 +223,11 @@ def get_meter(
221223
)
222224
return _DefaultMeter(name, version=version, schema_url=schema_url)
223225

224-
return Meter(
225-
InstrumentationInfo(name, version, schema_url),
226-
self._measurement_consumer,
227-
)
226+
info = InstrumentationInfo(name, version, schema_url)
227+
with self._meter_lock:
228+
if not self._meters.get(info):
229+
self._meters[info] = Meter(
230+
info,
231+
self._measurement_consumer,
232+
)
233+
return self._meters[info]

opentelemetry-sdk/tests/metrics/test_metrics.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,30 @@ def test_get_meter(self):
6464
self.assertEqual(meter._instrumentation_info.version, "version")
6565
self.assertEqual(meter._instrumentation_info.schema_url, "schema_url")
6666

67+
def test_get_meter_duplicate(self):
68+
"""
69+
Subsequent calls to `MeterProvider.get_meter` with the same arguments
70+
should return the same `Meter` instance.
71+
"""
72+
mp = MeterProvider()
73+
meter1 = mp.get_meter(
74+
"name",
75+
version="version",
76+
schema_url="schema_url",
77+
)
78+
meter2 = mp.get_meter(
79+
"name",
80+
version="version",
81+
schema_url="schema_url",
82+
)
83+
meter3 = mp.get_meter(
84+
"name2",
85+
version="version",
86+
schema_url="schema_url",
87+
)
88+
self.assertIs(meter1, meter2)
89+
self.assertIsNot(meter1, meter3)
90+
6791
def test_shutdown_subsequent_calls(self):
6892
"""
6993
No subsequent attempts to get a `Meter` are allowed after calling

0 commit comments

Comments
 (0)