File tree Expand file tree Collapse file tree 2 files changed +34
-4
lines changed
src/opentelemetry/sdk/_metrics Expand file tree Collapse file tree 2 files changed +34
-4
lines changed Original file line number Diff line number Diff line change @@ -154,13 +154,15 @@ def __init__(
154
154
shutdown_on_exit : bool = True ,
155
155
):
156
156
self ._lock = Lock ()
157
+ self ._meter_lock = Lock ()
157
158
self ._atexit_handler = None
158
159
159
160
self ._measurement_consumer = SynchronousMeasurementConsumer ()
160
161
161
162
if shutdown_on_exit :
162
163
self ._atexit_handler = register (self .shutdown )
163
164
165
+ self ._meters = {}
164
166
self ._metric_readers = metric_readers
165
167
166
168
for metric_reader in self ._metric_readers :
@@ -221,7 +223,11 @@ def get_meter(
221
223
)
222
224
return _DefaultMeter (name , version = version , schema_url = schema_url )
223
225
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 ]
Original file line number Diff line number Diff line change @@ -64,6 +64,30 @@ def test_get_meter(self):
64
64
self .assertEqual (meter ._instrumentation_info .version , "version" )
65
65
self .assertEqual (meter ._instrumentation_info .schema_url , "schema_url" )
66
66
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
+
67
91
def test_shutdown_subsequent_calls (self ):
68
92
"""
69
93
No subsequent attempts to get a `Meter` are allowed after calling
You can’t perform that action at this time.
0 commit comments