From a9a79c3923d483535d1592f3597260657b86eebd Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Fri, 5 Sep 2025 17:30:35 +0200 Subject: [PATCH 1/4] Cache importlib_metadata.entry_points --- .../opentelemetry/util/_importlib_metadata.py | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index 2457630ba22..eae52b3dff4 100644 --- a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py +++ b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py @@ -12,18 +12,33 @@ # See the License for the specific language governing permissions and # limitations under the License. -# FIXME: Use importlib.metadata when support for 3.11 is dropped if the rest of -# the supported versions at that time have the same API. +from functools import lru_cache + from importlib_metadata import ( # type: ignore Distribution, EntryPoint, EntryPoints, PackageNotFoundError, distributions, - entry_points, requires, version, ) +from importlib_metadata import ( + entry_points as original_entry_points, +) + + +@lru_cache() +def _original_entry_points_cached(): + return original_entry_points() + + +def entry_points(**params): + """Replacement for importlib_metadata.entry_points that caches getting all the entry points. + + That part can be very slow, and OTel uses this function many times.""" + return _original_entry_points_cached().select(**params) + __all__ = [ "entry_points", From 00b460387d912a31f74028ea526e3e466e437b37 Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Fri, 5 Sep 2025 17:54:37 +0200 Subject: [PATCH 2/4] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c46cf395c8..dd0b0d470c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#4634](https://github.com/open-telemetry/opentelemetry-python/pull/4634)) - semantic-conventions: Bump to 1.37.0 ([#4731](https://github.com/open-telemetry/opentelemetry-python/pull/4731)) +- Performance: Cache `importlib_metadata.entry_points` + ([#4735](https://github.com/open-telemetry/opentelemetry-python/pull/4735)) ## Version 1.36.0/0.57b0 (2025-07-29) From 67ff9b06984a8092b67b72815e3862d4e46cf710 Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Mon, 8 Sep 2025 18:44:50 +0200 Subject: [PATCH 3/4] Update opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py --- .../src/opentelemetry/util/_importlib_metadata.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index eae52b3dff4..a9228444a75 100644 --- a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py +++ b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py @@ -14,6 +14,9 @@ from functools import lru_cache +# FIXME: Use importlib.metadata (not importlib_metadata) +# when support for 3.11 is dropped if the rest of +# the supported versions at that time have the same API. from importlib_metadata import ( # type: ignore Distribution, EntryPoint, From 85e5d6d55750ba1b3fa6a7f7cf2d1f25730d88fc Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Tue, 9 Sep 2025 10:32:59 +0200 Subject: [PATCH 4/4] lru_cache -> cache --- .../src/opentelemetry/util/_importlib_metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index a9228444a75..94b0e4db55d 100644 --- a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py +++ b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from functools import lru_cache +from functools import cache # FIXME: Use importlib.metadata (not importlib_metadata) # when support for 3.11 is dropped if the rest of @@ -31,7 +31,7 @@ ) -@lru_cache() +@cache def _original_entry_points_cached(): return original_entry_points()