From e5c70a2a20590d782da4e282bf5d88fb63cf8a98 Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:52:31 -0700 Subject: [PATCH 1/4] api: conditionally load entrypoints for OTEL_PYTHON_CONTEXT This prevents unnecessarily importing the entry points library, reducing the memory footprint of loading the API by about a MB (27%): |Scenario | Memory before | Memory after | delta | | - | - | - | - | |Import API only | 5.43 MB | 4.49 MB | -940 KB | |API + get_tracer (no-op) | 5.05 MB | 4.10 MB | -950 KB | Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- .../src/opentelemetry/context/__init__.py | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/context/__init__.py b/opentelemetry-api/src/opentelemetry/context/__init__.py index 9287d5b401e..6f8862b5a49 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -15,15 +15,15 @@ from __future__ import annotations import logging +import os import typing from contextvars import Token -from os import environ from uuid import uuid4 # pylint: disable=wrong-import-position from opentelemetry.context.context import Context, _RuntimeContext # noqa +from opentelemetry.context.contextvars_context import ContextVarsRuntimeContext from opentelemetry.environment_variables import OTEL_PYTHON_CONTEXT -from opentelemetry.util._importlib_metadata import entry_points logger = logging.getLogger(__name__) @@ -34,37 +34,22 @@ def _load_runtime_context() -> _RuntimeContext: Returns: An instance of RuntimeContext. """ + configured_context = os.environ.get(OTEL_PYTHON_CONTEXT) + if not configured_context: + return ContextVarsRuntimeContext() - # FIXME use a better implementation of a configuration manager - # to avoid having to get configuration values straight from - # environment variables - default_context = "contextvars_context" - - configured_context = environ.get(OTEL_PYTHON_CONTEXT, default_context) # type: str + from opentelemetry.util._importlib_metadata import entry_points try: - return next( # type: ignore - iter( # type: ignore - entry_points( # type: ignore - group="opentelemetry_context", - name=configured_context, - ) - ) + return next( + iter(entry_points(group="opentelemetry_context", name=configured_context)) ).load()() except Exception: # pylint: disable=broad-exception-caught logger.exception( - "Failed to load context: %s, fallback to %s", + "Failed to load context: %s, falling back to contextvars_context", configured_context, - default_context, ) - return next( # type: ignore - iter( # type: ignore - entry_points( # type: ignore - group="opentelemetry_context", - name=default_context, - ) - ) - ).load()() + return ContextVarsRuntimeContext() _RUNTIME_CONTEXT = _load_runtime_context() From 4024ef7ac4d9d92da10311a0a072cc67baeb762b Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Mon, 27 Apr 2026 09:48:31 -0700 Subject: [PATCH 2/4] add ignore rule to import lint, update changelog Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- CHANGELOG.md | 1 + opentelemetry-api/src/opentelemetry/context/__init__.py | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 614f240d4ee..273ae7c0179 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#5120](https://github.com/open-telemetry/opentelemetry-python/pull/5120)) - Add WeaverLiveCheck test util ([#5088](https://github.com/open-telemetry/opentelemetry-python/pull/5088)) +- `opentelemetry-api`: conditionallly import entrypoints for `opentelemetry_context` only if the `OTEL_PYTHON_CONTEXT` env variable is defined, return `ContextVarsRuntimeContext` otherwise. ## Version 1.41.0/0.62b0 (2026-04-09) diff --git a/opentelemetry-api/src/opentelemetry/context/__init__.py b/opentelemetry-api/src/opentelemetry/context/__init__.py index 6f8862b5a49..8339c2caa35 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -38,6 +38,7 @@ def _load_runtime_context() -> _RuntimeContext: if not configured_context: return ContextVarsRuntimeContext() + # pylint: disable=import-outside-toplevel,no-name-in-module from opentelemetry.util._importlib_metadata import entry_points try: From 2861d762f44d76862243c577280dff4f1b52f3a7 Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:49:10 -0700 Subject: [PATCH 3/4] fix precommit Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- .../src/opentelemetry/context/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/context/__init__.py b/opentelemetry-api/src/opentelemetry/context/__init__.py index 8339c2caa35..f9eaeeb7536 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -39,11 +39,17 @@ def _load_runtime_context() -> _RuntimeContext: return ContextVarsRuntimeContext() # pylint: disable=import-outside-toplevel,no-name-in-module - from opentelemetry.util._importlib_metadata import entry_points + from opentelemetry.util._importlib_metadata import ( # noqa: PLC0415 + entry_points, + ) try: return next( - iter(entry_points(group="opentelemetry_context", name=configured_context)) + iter( + entry_points( + group="opentelemetry_context", name=configured_context + ) + ) ).load()() except Exception: # pylint: disable=broad-exception-caught logger.exception( From 460af4d239aff3afe474309825400c460c575224 Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Mon, 27 Apr 2026 13:00:00 -0700 Subject: [PATCH 4/4] clean up changelog Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 273ae7c0179..706ccfbfb77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#5120](https://github.com/open-telemetry/opentelemetry-python/pull/5120)) - Add WeaverLiveCheck test util ([#5088](https://github.com/open-telemetry/opentelemetry-python/pull/5088)) -- `opentelemetry-api`: conditionallly import entrypoints for `opentelemetry_context` only if the `OTEL_PYTHON_CONTEXT` env variable is defined, return `ContextVarsRuntimeContext` otherwise. +- `opentelemetry-api`: conditionallly import entrypoints for `opentelemetry_context` only if the `OTEL_PYTHON_CONTEXT` env variable is defined, return `ContextVarsRuntimeContext` otherwise + ([#5144](https://github.com/open-telemetry/opentelemetry-python/pull/5144)) ## Version 1.41.0/0.62b0 (2026-04-09)