diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a3dbd81ac5..f6692fa966e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#5119](https://github.com/open-telemetry/opentelemetry-python/pull/5119)) - `opentelemetry-sdk`: only load entrypoints for resource detectors if they are configured via `OTEL_EXPERIMENTAL_RESOURCE_DETECTORS` ([#5145](https://github.com/open-telemetry/opentelemetry-python/pull/5145)) +- `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)) - `opentelemetry-exporter-otlp-json-common`: add 'opentelemetry-exporter-otlp-json-common' package for OTLP JSON exporters ([#4996](https://github.com/open-telemetry/opentelemetry-python/pull/4996)) - `opentelemetry-exporter-otlp-proto-grpc`: make retryable gRPC error codes configurable for gRPC exporters diff --git a/opentelemetry-api/src/opentelemetry/context/__init__.py b/opentelemetry-api/src/opentelemetry/context/__init__.py index 6518f03835c..80174f66b5e 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -4,14 +4,14 @@ from __future__ import annotations import logging +import os 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__) @@ -22,37 +22,29 @@ 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 + # pylint: disable=import-outside-toplevel,no-name-in-module + from opentelemetry.util._importlib_metadata import ( # noqa: PLC0415 + 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()