diff --git a/.changelog/5238.fixed b/.changelog/5238.fixed new file mode 100644 index 0000000000..2d3a207e3d --- /dev/null +++ b/.changelog/5238.fixed @@ -0,0 +1 @@ +Avoid import-time deprecation warnings on Python 3.10 and 3.11. diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index be779f1137..2f9d76c1b6 100644 --- a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py +++ b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py @@ -11,6 +11,7 @@ - https://github.com/open-telemetry/opentelemetry-python/pull/5203 """ +import warnings from functools import cache from importlib.metadata import ( Distribution, @@ -29,7 +30,13 @@ def _as_entry_points(eps: Any) -> EntryPoints: if isinstance(eps, EntryPoints): return eps # Handle Python 3.10 SelectableGroups (dict-like) - return EntryPoints(ep for group_eps in eps.values() for ep in group_eps) + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + message=r"SelectableGroups dict interface is deprecated\. Use select\.", + category=DeprecationWarning, + ) + return EntryPoints(ep for group_eps in eps.values() for ep in group_eps) @cache diff --git a/opentelemetry-api/tests/util/test__importlib_metadata.py b/opentelemetry-api/tests/util/test__importlib_metadata.py index f7e5152467..1b195935fc 100644 --- a/opentelemetry-api/tests/util/test__importlib_metadata.py +++ b/opentelemetry-api/tests/util/test__importlib_metadata.py @@ -1,6 +1,8 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +import importlib.metadata +import warnings from unittest import TestCase from opentelemetry.metrics import MeterProvider @@ -117,3 +119,23 @@ def test_as_entry_points_selectable_groups_compat(self): self.assertIsInstance(normalized, EntryPoints) self.assertEqual(len(normalized), 2) self.assertEqual(list(normalized), [ep1, ep2]) + + def test_as_entry_points_selectable_groups_without_warning(self): + selectable_groups_class = getattr( + importlib.metadata, "SelectableGroups", None + ) + if selectable_groups_class is None: + self.skipTest("SelectableGroups is not available") + + ep1 = EntryPoint(name="foo", value="bar:baz", group="gp") + ep2 = EntryPoint(name="foo2", value="bar2:baz2", group="gp2") + selectable_groups = selectable_groups_class( + {"gp": [ep1], "gp2": [ep2]} + ) + + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + normalized = _as_entry_points(selectable_groups) + + self.assertIsInstance(normalized, EntryPoints) + self.assertCountEqual(normalized, [ep1, ep2])