We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Metric Reader function not being called
As reported by @aabmass :v:

There is a bug [here](https://github.com/open-telemetry/opentelemetry-python/blob/main/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py#L204). If a metric reader returns `False` in a shutdown, the next metric reader shutdown function won't be called.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py`
Content:
```
1 # Copyright The OpenTelemetry Authors
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #     http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 from atexit import register, unregister
16 from logging import getLogger
17 from threading import Lock
18 from typing import Optional, Sequence
19 
20 from opentelemetry._metrics import Meter as APIMeter
21 from opentelemetry._metrics import MeterProvider as APIMeterProvider
22 from opentelemetry._metrics import NoOpMeter
23 from opentelemetry._metrics.instrument import Counter as APICounter
24 from opentelemetry._metrics.instrument import Histogram as APIHistogram
25 from opentelemetry._metrics.instrument import (
26     ObservableCounter as APIObservableCounter,
27 )
28 from opentelemetry._metrics.instrument import (
29     ObservableGauge as APIObservableGauge,
30 )
31 from opentelemetry._metrics.instrument import (
32     ObservableUpDownCounter as APIObservableUpDownCounter,
33 )
34 from opentelemetry._metrics.instrument import UpDownCounter as APIUpDownCounter
35 from opentelemetry.sdk._metrics.instrument import (
36     Counter,
37     Histogram,
38     ObservableCounter,
39     ObservableGauge,
40     ObservableUpDownCounter,
41     UpDownCounter,
42 )
43 from opentelemetry.sdk._metrics.measurement_consumer import (
44     MeasurementConsumer,
45     SynchronousMeasurementConsumer,
46 )
47 from opentelemetry.sdk._metrics.metric_reader import MetricReader
48 from opentelemetry.sdk._metrics.sdk_configuration import SdkConfiguration
49 from opentelemetry.sdk.resources import Resource
50 from opentelemetry.sdk.util.instrumentation import InstrumentationInfo
51 
52 _logger = getLogger(__name__)
53 
54 
55 class Meter(APIMeter):
56     def __init__(
57         self,
58         instrumentation_info: InstrumentationInfo,
59         measurement_consumer: MeasurementConsumer,
60     ):
61         super().__init__(instrumentation_info)
62         self._instrumentation_info = instrumentation_info
63         self._measurement_consumer = measurement_consumer
64 
65     def create_counter(self, name, unit=None, description=None) -> APICounter:
66         return Counter(
67             name,
68             self._instrumentation_info,
69             self._measurement_consumer,
70             unit,
71             description,
72         )
73 
74     def create_up_down_counter(
75         self, name, unit=None, description=None
76     ) -> APIUpDownCounter:
77         return UpDownCounter(
78             name,
79             self._instrumentation_info,
80             self._measurement_consumer,
81             unit,
82             description,
83         )
84 
85     def create_observable_counter(
86         self, name, callback, unit=None, description=None
87     ) -> APIObservableCounter:
88 
89         instrument = ObservableCounter(
90             name,
91             self._instrumentation_info,
92             self._measurement_consumer,
93             callback,
94             unit,
95             description,
96         )
97 
98         self._measurement_consumer.register_asynchronous_instrument(instrument)
99 
100         return instrument
101 
102     def create_histogram(
103         self, name, unit=None, description=None
104     ) -> APIHistogram:
105         return Histogram(
106             name,
107             self._instrumentation_info,
108             self._measurement_consumer,
109             unit,
110             description,
111         )
112 
113     def create_observable_gauge(
114         self, name, callback, unit=None, description=None
115     ) -> APIObservableGauge:
116 
117         instrument = ObservableGauge(
118             name,
119             self._instrumentation_info,
120             self._measurement_consumer,
121             callback,
122             unit,
123             description,
124         )
125 
126         self._measurement_consumer.register_asynchronous_instrument(instrument)
127 
128         return instrument
129 
130     def create_observable_up_down_counter(
131         self, name, callback, unit=None, description=None
132     ) -> APIObservableUpDownCounter:
133 
134         instrument = ObservableUpDownCounter(
135             name,
136             self._instrumentation_info,
137             self._measurement_consumer,
138             callback,
139             unit,
140             description,
141         )
142 
143         self._measurement_consumer.register_asynchronous_instrument(instrument)
144 
145         return instrument
146 
147 
148 class MeterProvider(APIMeterProvider):
149     """See `opentelemetry._metrics.MeterProvider`."""
150 
151     def __init__(
152         self,
153         metric_readers: Sequence[MetricReader] = (),
154         resource: Resource = Resource.create({}),
155         shutdown_on_exit: bool = True,
156     ):
157         self._lock = Lock()
158         self._meter_lock = Lock()
159         self._atexit_handler = None
160         self._sdk_config = SdkConfiguration(
161             resource=resource, metric_readers=metric_readers
162         )
163         self._measurement_consumer = SynchronousMeasurementConsumer(
164             sdk_config=self._sdk_config
165         )
166 
167         if shutdown_on_exit:
168             self._atexit_handler = register(self.shutdown)
169 
170         self._meters = {}
171         self._metric_readers = metric_readers
172 
173         for metric_reader in self._sdk_config.metric_readers:
174             metric_reader._register_measurement_consumer(self)
175 
176         self._shutdown = False
177 
178     def force_flush(self) -> bool:
179 
180         # FIXME implement a timeout
181 
182         metric_reader_result = True
183 
184         for metric_reader in self._sdk_config.metric_readers:
185             metric_reader_result = (
186                 metric_reader_result and metric_reader.force_flush()
187             )
188 
189         if not metric_reader_result:
190             _logger.warning("Unable to force flush all metric readers")
191 
192         return metric_reader_result
193 
194     def shutdown(self):
195         # FIXME implement a timeout
196 
197         if self._shutdown:
198             _logger.warning("shutdown can only be called once")
199             return False
200 
201         result = True
202 
203         for metric_reader in self._sdk_config.metric_readers:
204             result = result and metric_reader.shutdown()
205 
206             if not result:
207                 _logger.warning("A MetricReader failed to shutdown")
208 
209         self._shutdown = True
210 
211         if self._atexit_handler is not None:
212             unregister(self._atexit_handler)
213             self._atexit_handler = None
214 
215         return result
216 
217     def get_meter(
218         self,
219         name: str,
220         version: Optional[str] = None,
221         schema_url: Optional[str] = None,
222     ) -> Meter:
223 
224         if self._shutdown:
225             _logger.warning(
226                 "A shutdown `MeterProvider` can not provide a `Meter`"
227             )
228             return NoOpMeter(name, version=version, schema_url=schema_url)
229 
230         info = InstrumentationInfo(name, version, schema_url)
231         with self._meter_lock:
232             if not self._meters.get(info):
233                 self._meters[info] = Meter(
234                     info,
235                     self._measurement_consumer,
236                 )
237             return self._meters[info]
238
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py
+++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py
@@ -198,13 +198,17 @@
             _logger.warning("shutdown can only be called once")
             return False
 
-        result = True
+        overall_result = True
 
         for metric_reader in self._sdk_config.metric_readers:
-            result = result and metric_reader.shutdown()
+            metric_reader_result = metric_reader.shutdown()
 
-            if not result:
-                _logger.warning("A MetricReader failed to shutdown")
+            if not metric_reader_result:
+                _logger.warning(
+                    "MetricReader {metric_reader} failed to shutdown"
+                )
+
+            overall_result = overall_result and metric_reader_result
 
         self._shutdown = True
 
@@ -212,7 +216,7 @@
             unregister(self._atexit_handler)
             self._atexit_handler = None
 
-        return result
+        return overall_result
 
     def get_meter(
         self,

{"golden_diff": "diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py\n--- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py\n+++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py\n@@ -198,13 +198,17 @@\n             _logger.warning(\"shutdown can only be called once\")\n             return False\n \n-        result = True\n+        overall_result = True\n \n         for metric_reader in self._sdk_config.metric_readers:\n-            result = result and metric_reader.shutdown()\n+            metric_reader_result = metric_reader.shutdown()\n \n-            if not result:\n-                _logger.warning(\"A MetricReader failed to shutdown\")\n+            if not metric_reader_result:\n+                _logger.warning(\n+                    \"MetricReader {metric_reader} failed to shutdown\"\n+                )\n+\n+            overall_result = overall_result and metric_reader_result\n \n         self._shutdown = True\n \n@@ -212,7 +216,7 @@\n             unregister(self._atexit_handler)\n             self._atexit_handler = None\n \n-        return result\n+        return overall_result\n \n     def get_meter(\n         self,\n", "issue": "Metric Reader function not being called\nAs reported by @aabmass :v:\r\n\r\nThere is a bug [here](https://github.com/open-telemetry/opentelemetry-python/blob/main/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py#L204). If a metric reader returns `False` in a shutdown, the next metric reader shutdown function won't be called.\n", "before_files": [{"content": "# Copyright The OpenTelemetry Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom atexit import register, unregister\nfrom logging import getLogger\nfrom threading import Lock\nfrom typing import Optional, Sequence\n\nfrom opentelemetry._metrics import Meter as APIMeter\nfrom opentelemetry._metrics import MeterProvider as APIMeterProvider\nfrom opentelemetry._metrics import NoOpMeter\nfrom opentelemetry._metrics.instrument import Counter as APICounter\nfrom opentelemetry._metrics.instrument import Histogram as APIHistogram\nfrom opentelemetry._metrics.instrument import (\n    ObservableCounter as APIObservableCounter,\n)\nfrom opentelemetry._metrics.instrument import (\n    ObservableGauge as APIObservableGauge,\n)\nfrom opentelemetry._metrics.instrument import (\n    ObservableUpDownCounter as APIObservableUpDownCounter,\n)\nfrom opentelemetry._metrics.instrument import UpDownCounter as APIUpDownCounter\nfrom opentelemetry.sdk._metrics.instrument import (\n    Counter,\n    Histogram,\n    ObservableCounter,\n    ObservableGauge,\n    ObservableUpDownCounter,\n    UpDownCounter,\n)\nfrom opentelemetry.sdk._metrics.measurement_consumer import (\n    MeasurementConsumer,\n    SynchronousMeasurementConsumer,\n)\nfrom opentelemetry.sdk._metrics.metric_reader import MetricReader\nfrom opentelemetry.sdk._metrics.sdk_configuration import SdkConfiguration\nfrom opentelemetry.sdk.resources import Resource\nfrom opentelemetry.sdk.util.instrumentation import InstrumentationInfo\n\n_logger = getLogger(__name__)\n\n\nclass Meter(APIMeter):\n    def __init__(\n        self,\n        instrumentation_info: InstrumentationInfo,\n        measurement_consumer: MeasurementConsumer,\n    ):\n        super().__init__(instrumentation_info)\n        self._instrumentation_info = instrumentation_info\n        self._measurement_consumer = measurement_consumer\n\n    def create_counter(self, name, unit=None, description=None) -> APICounter:\n        return Counter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            unit,\n            description,\n        )\n\n    def create_up_down_counter(\n        self, name, unit=None, description=None\n    ) -> APIUpDownCounter:\n        return UpDownCounter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            unit,\n            description,\n        )\n\n    def create_observable_counter(\n        self, name, callback, unit=None, description=None\n    ) -> APIObservableCounter:\n\n        instrument = ObservableCounter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            callback,\n            unit,\n            description,\n        )\n\n        self._measurement_consumer.register_asynchronous_instrument(instrument)\n\n        return instrument\n\n    def create_histogram(\n        self, name, unit=None, description=None\n    ) -> APIHistogram:\n        return Histogram(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            unit,\n            description,\n        )\n\n    def create_observable_gauge(\n        self, name, callback, unit=None, description=None\n    ) -> APIObservableGauge:\n\n        instrument = ObservableGauge(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            callback,\n            unit,\n            description,\n        )\n\n        self._measurement_consumer.register_asynchronous_instrument(instrument)\n\n        return instrument\n\n    def create_observable_up_down_counter(\n        self, name, callback, unit=None, description=None\n    ) -> APIObservableUpDownCounter:\n\n        instrument = ObservableUpDownCounter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            callback,\n            unit,\n            description,\n        )\n\n        self._measurement_consumer.register_asynchronous_instrument(instrument)\n\n        return instrument\n\n\nclass MeterProvider(APIMeterProvider):\n    \"\"\"See `opentelemetry._metrics.MeterProvider`.\"\"\"\n\n    def __init__(\n        self,\n        metric_readers: Sequence[MetricReader] = (),\n        resource: Resource = Resource.create({}),\n        shutdown_on_exit: bool = True,\n    ):\n        self._lock = Lock()\n        self._meter_lock = Lock()\n        self._atexit_handler = None\n        self._sdk_config = SdkConfiguration(\n            resource=resource, metric_readers=metric_readers\n        )\n        self._measurement_consumer = SynchronousMeasurementConsumer(\n            sdk_config=self._sdk_config\n        )\n\n        if shutdown_on_exit:\n            self._atexit_handler = register(self.shutdown)\n\n        self._meters = {}\n        self._metric_readers = metric_readers\n\n        for metric_reader in self._sdk_config.metric_readers:\n            metric_reader._register_measurement_consumer(self)\n\n        self._shutdown = False\n\n    def force_flush(self) -> bool:\n\n        # FIXME implement a timeout\n\n        metric_reader_result = True\n\n        for metric_reader in self._sdk_config.metric_readers:\n            metric_reader_result = (\n                metric_reader_result and metric_reader.force_flush()\n            )\n\n        if not metric_reader_result:\n            _logger.warning(\"Unable to force flush all metric readers\")\n\n        return metric_reader_result\n\n    def shutdown(self):\n        # FIXME implement a timeout\n\n        if self._shutdown:\n            _logger.warning(\"shutdown can only be called once\")\n            return False\n\n        result = True\n\n        for metric_reader in self._sdk_config.metric_readers:\n            result = result and metric_reader.shutdown()\n\n            if not result:\n                _logger.warning(\"A MetricReader failed to shutdown\")\n\n        self._shutdown = True\n\n        if self._atexit_handler is not None:\n            unregister(self._atexit_handler)\n            self._atexit_handler = None\n\n        return result\n\n    def get_meter(\n        self,\n        name: str,\n        version: Optional[str] = None,\n        schema_url: Optional[str] = None,\n    ) -> Meter:\n\n        if self._shutdown:\n            _logger.warning(\n                \"A shutdown `MeterProvider` can not provide a `Meter`\"\n            )\n            return NoOpMeter(name, version=version, schema_url=schema_url)\n\n        info = InstrumentationInfo(name, version, schema_url)\n        with self._meter_lock:\n            if not self._meters.get(info):\n                self._meters[info] = Meter(\n                    info,\n                    self._measurement_consumer,\n                )\n            return self._meters[info]\n", "path": "opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py"}], "after_files": [{"content": "# Copyright The OpenTelemetry Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom atexit import register, unregister\nfrom logging import getLogger\nfrom threading import Lock\nfrom typing import Optional, Sequence\n\nfrom opentelemetry._metrics import Meter as APIMeter\nfrom opentelemetry._metrics import MeterProvider as APIMeterProvider\nfrom opentelemetry._metrics import NoOpMeter\nfrom opentelemetry._metrics.instrument import Counter as APICounter\nfrom opentelemetry._metrics.instrument import Histogram as APIHistogram\nfrom opentelemetry._metrics.instrument import (\n    ObservableCounter as APIObservableCounter,\n)\nfrom opentelemetry._metrics.instrument import (\n    ObservableGauge as APIObservableGauge,\n)\nfrom opentelemetry._metrics.instrument import (\n    ObservableUpDownCounter as APIObservableUpDownCounter,\n)\nfrom opentelemetry._metrics.instrument import UpDownCounter as APIUpDownCounter\nfrom opentelemetry.sdk._metrics.instrument import (\n    Counter,\n    Histogram,\n    ObservableCounter,\n    ObservableGauge,\n    ObservableUpDownCounter,\n    UpDownCounter,\n)\nfrom opentelemetry.sdk._metrics.measurement_consumer import (\n    MeasurementConsumer,\n    SynchronousMeasurementConsumer,\n)\nfrom opentelemetry.sdk._metrics.metric_reader import MetricReader\nfrom opentelemetry.sdk._metrics.sdk_configuration import SdkConfiguration\nfrom opentelemetry.sdk.resources import Resource\nfrom opentelemetry.sdk.util.instrumentation import InstrumentationInfo\n\n_logger = getLogger(__name__)\n\n\nclass Meter(APIMeter):\n    def __init__(\n        self,\n        instrumentation_info: InstrumentationInfo,\n        measurement_consumer: MeasurementConsumer,\n    ):\n        super().__init__(instrumentation_info)\n        self._instrumentation_info = instrumentation_info\n        self._measurement_consumer = measurement_consumer\n\n    def create_counter(self, name, unit=None, description=None) -> APICounter:\n        return Counter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            unit,\n            description,\n        )\n\n    def create_up_down_counter(\n        self, name, unit=None, description=None\n    ) -> APIUpDownCounter:\n        return UpDownCounter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            unit,\n            description,\n        )\n\n    def create_observable_counter(\n        self, name, callback, unit=None, description=None\n    ) -> APIObservableCounter:\n\n        instrument = ObservableCounter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            callback,\n            unit,\n            description,\n        )\n\n        self._measurement_consumer.register_asynchronous_instrument(instrument)\n\n        return instrument\n\n    def create_histogram(\n        self, name, unit=None, description=None\n    ) -> APIHistogram:\n        return Histogram(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            unit,\n            description,\n        )\n\n    def create_observable_gauge(\n        self, name, callback, unit=None, description=None\n    ) -> APIObservableGauge:\n\n        instrument = ObservableGauge(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            callback,\n            unit,\n            description,\n        )\n\n        self._measurement_consumer.register_asynchronous_instrument(instrument)\n\n        return instrument\n\n    def create_observable_up_down_counter(\n        self, name, callback, unit=None, description=None\n    ) -> APIObservableUpDownCounter:\n\n        instrument = ObservableUpDownCounter(\n            name,\n            self._instrumentation_info,\n            self._measurement_consumer,\n            callback,\n            unit,\n            description,\n        )\n\n        self._measurement_consumer.register_asynchronous_instrument(instrument)\n\n        return instrument\n\n\nclass MeterProvider(APIMeterProvider):\n    \"\"\"See `opentelemetry._metrics.MeterProvider`.\"\"\"\n\n    def __init__(\n        self,\n        metric_readers: Sequence[MetricReader] = (),\n        resource: Resource = Resource.create({}),\n        shutdown_on_exit: bool = True,\n    ):\n        self._lock = Lock()\n        self._meter_lock = Lock()\n        self._atexit_handler = None\n        self._sdk_config = SdkConfiguration(\n            resource=resource, metric_readers=metric_readers\n        )\n        self._measurement_consumer = SynchronousMeasurementConsumer(\n            sdk_config=self._sdk_config\n        )\n\n        if shutdown_on_exit:\n            self._atexit_handler = register(self.shutdown)\n\n        self._meters = {}\n        self._metric_readers = metric_readers\n\n        for metric_reader in self._sdk_config.metric_readers:\n            metric_reader._register_measurement_consumer(self)\n\n        self._shutdown = False\n\n    def force_flush(self) -> bool:\n\n        # FIXME implement a timeout\n\n        metric_reader_result = True\n\n        for metric_reader in self._sdk_config.metric_readers:\n            metric_reader_result = (\n                metric_reader_result and metric_reader.force_flush()\n            )\n\n        if not metric_reader_result:\n            _logger.warning(\"Unable to force flush all metric readers\")\n\n        return metric_reader_result\n\n    def shutdown(self):\n        # FIXME implement a timeout\n\n        if self._shutdown:\n            _logger.warning(\"shutdown can only be called once\")\n            return False\n\n        overall_result = True\n\n        for metric_reader in self._sdk_config.metric_readers:\n            metric_reader_result = metric_reader.shutdown()\n\n            if not metric_reader_result:\n                _logger.warning(\n                    \"MetricReader {metric_reader} failed to shutdown\"\n                )\n\n            overall_result = overall_result and metric_reader_result\n\n        self._shutdown = True\n\n        if self._atexit_handler is not None:\n            unregister(self._atexit_handler)\n            self._atexit_handler = None\n\n        return overall_result\n\n    def get_meter(\n        self,\n        name: str,\n        version: Optional[str] = None,\n        schema_url: Optional[str] = None,\n    ) -> Meter:\n\n        if self._shutdown:\n            _logger.warning(\n                \"A shutdown `MeterProvider` can not provide a `Meter`\"\n            )\n            return NoOpMeter(name, version=version, schema_url=schema_url)\n\n        info = InstrumentationInfo(name, version, schema_url)\n        with self._meter_lock:\n            if not self._meters.get(info):\n                self._meters[info] = Meter(\n                    info,\n                    self._measurement_consumer,\n                )\n            return self._meters[info]\n", "path": "opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py"}]}