From 949fd693e8c77656eac84866c4795215c2a537d3 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Thu, 25 Jun 2026 18:35:53 +0100 Subject: [PATCH 01/14] extract declarative configuration into opentelemetry-sdk-configuration package Per the Python SIG on 2026-06-25 (tracked in #5355), declarative configuration moves out of opentelemetry-sdk into a new standalone package. The SDK stays slim and stable; declarative-config-specific code lives in opentelemetry-sdk-configuration which can iterate and version independently with an experimental marker. Layout: opentelemetry-sdk-configuration/ pyproject.toml new package manifest README.rst experimental marker, install hint src/opentelemetry/sdk/configuration/ the public namespace __init__.py public API: configure_sdk, load_config_file, OpenTelemetryConfiguration, ConfigurationError _exceptions.py, _common.py, _conversion.py, _sdk.py, _resource.py, _propagator.py, _tracer_provider.py, _meter_provider.py, _logger_provider.py, models.py, schema.json file/__init__.py, file/_loader.py, file/_env_substitution.py version/__init__.py 0.1.0.dev codegen/dataclass.jinja2 moved from opentelemetry-sdk/codegen tests/ all moved from opentelemetry-sdk/tests/_configuration test-requirements.txt opentelemetry-sdk keeps only what activates the declarative path: - OTEL_CONFIG_FILE env var constant in opentelemetry.sdk.environment_variables - _OTelSDKConfigurator._configure detects the env var and lazy-imports opentelemetry.sdk.configuration. The SDK has no runtime dep on the new package; lambda / no-config users pay zero import cost. - When OTEL_CONFIG_FILE is set but the new package isn't installed, raise a clear RuntimeError with a pip-install hint instead of a bare ImportError. Top-level updates: - pyproject.toml: codegen input/output paths and additional-imports point at the new package. ruff per-file-ignore for test_models.py updated. file-configuration extras moved off opentelemetry-sdk. - tox.ini: adds test-/lint- envs for opentelemetry-sdk-configuration; coverage env switches from opentelemetry-sdk[file-configuration] to the standalone configuration package. Tests: - 309 tests in opentelemetry-sdk-configuration/tests pass. - 789 tests in opentelemetry-sdk/tests pass (incl. rewritten test_configurator_file_routing.py which now patches the new module paths and covers the missing-package RuntimeError). Closes #5355 --- .changelog/5355.changed | 1 + opentelemetry-sdk-configuration/README.rst | 58 +++++++++++++++ .../codegen/README.md | 6 +- .../codegen/dataclass.jinja2 | 0 .../pyproject.toml | 54 ++++++++++++++ .../sdk/configuration}/README.md | 10 +-- .../sdk/configuration/__init__.py | 70 +++++++++++++++++++ .../sdk/configuration}/_common.py | 2 +- .../sdk/configuration}/_conversion.py | 0 .../sdk/configuration}/_exceptions.py | 0 .../sdk/configuration}/_logger_provider.py | 32 ++++----- .../sdk/configuration}/_meter_provider.py | 32 ++++----- .../sdk/configuration}/_propagator.py | 6 +- .../sdk/configuration}/_resource.py | 6 +- .../opentelemetry/sdk/configuration}/_sdk.py | 14 ++-- .../sdk/configuration}/_tracer_provider.py | 26 +++---- .../sdk/configuration}/file/__init__.py | 20 +++--- .../configuration}/file/_env_substitution.py | 0 .../sdk/configuration}/file/_loader.py | 10 +-- .../sdk/configuration}/models.py | 2 +- .../sdk/configuration}/schema.json | 0 .../sdk/configuration/version/__init__.py | 4 ++ .../test-requirements.txt | 21 ++++++ .../tests}/__init__.py | 0 .../tests}/file/__init__.py | 0 .../file/data/config_with_env_vars.yaml | 0 .../tests}/file/data/invalid_yaml.yaml | 0 .../tests}/file/data/minimal_config.json | 0 .../tests}/file/data/minimal_config.yaml | 0 .../tests}/file/test_env_substitution.py | 2 +- .../tests}/file/test_loader.py | 16 ++--- .../tests}/test_common.py | 20 +++--- .../tests}/test_conversion.py | 6 +- .../tests}/test_logger_provider.py | 42 +++++------ .../tests}/test_meter_provider.py | 52 +++++++------- .../tests}/test_models.py | 2 +- .../tests}/test_propagator.py | 36 +++++----- .../tests}/test_resource.py | 20 +++--- .../tests}/test_sdk.py | 48 ++++++------- .../tests}/test_tracer_provider.py | 52 +++++++------- opentelemetry-sdk/pyproject.toml | 6 -- .../sdk/_configuration/__init__.py | 27 ++++--- opentelemetry-sdk/test-requirements.txt | 4 -- .../test_configurator_file_routing.py | 24 ++++--- pyproject.toml | 10 +-- tox.ini | 12 +++- 46 files changed, 488 insertions(+), 265 deletions(-) create mode 100644 .changelog/5355.changed create mode 100644 opentelemetry-sdk-configuration/README.rst rename {opentelemetry-sdk => opentelemetry-sdk-configuration}/codegen/README.md (70%) rename {opentelemetry-sdk => opentelemetry-sdk-configuration}/codegen/dataclass.jinja2 (100%) create mode 100644 opentelemetry-sdk-configuration/pyproject.toml rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/README.md (51%) create mode 100644 opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_common.py (98%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_conversion.py (100%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_exceptions.py (100%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_logger_provider.py (94%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_meter_provider.py (95%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_propagator.py (95%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_resource.py (97%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_sdk.py (79%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/_tracer_provider.py (95%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/file/__init__.py (60%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/file/_env_substitution.py (100%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/file/_loader.py (95%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/models.py (99%) rename {opentelemetry-sdk/src/opentelemetry/sdk/_configuration => opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration}/schema.json (100%) create mode 100644 opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/version/__init__.py create mode 100644 opentelemetry-sdk-configuration/test-requirements.txt rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/__init__.py (100%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/file/__init__.py (100%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/file/data/config_with_env_vars.yaml (100%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/file/data/invalid_yaml.yaml (100%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/file/data/minimal_config.json (100%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/file/data/minimal_config.yaml (100%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/file/test_env_substitution.py (99%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/file/test_loader.py (96%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_common.py (95%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_conversion.py (94%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_logger_provider.py (94%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_meter_provider.py (95%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_models.py (75%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_propagator.py (89%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_resource.py (97%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_sdk.py (69%) rename {opentelemetry-sdk/tests/_configuration => opentelemetry-sdk-configuration/tests}/test_tracer_provider.py (94%) diff --git a/.changelog/5355.changed b/.changelog/5355.changed new file mode 100644 index 00000000000..ef26210fc56 --- /dev/null +++ b/.changelog/5355.changed @@ -0,0 +1 @@ +`opentelemetry-sdk`: extract declarative configuration into a new `opentelemetry-sdk-configuration` package. The implementation (schema, models, loader, `configure_sdk`, per-signal factories) moves out of `opentelemetry.sdk._configuration` into the public `opentelemetry.sdk.configuration` namespace shipped by the new package. The SDK keeps the `OTEL_CONFIG_FILE` env var and the activation hook in `_OTelSDKConfigurator._configure`, which now lazy-imports `opentelemetry.sdk.configuration` only when the env var is set. The SDK has no runtime dependency on the new package; users who don't use declarative config pay no import cost. Setting `OTEL_CONFIG_FILE` without the new package installed now raises a clear `RuntimeError` with a pip-install hint. The new package is published experimentally and versions independently of the SDK. diff --git a/opentelemetry-sdk-configuration/README.rst b/opentelemetry-sdk-configuration/README.rst new file mode 100644 index 00000000000..97591e2c0c1 --- /dev/null +++ b/opentelemetry-sdk-configuration/README.rst @@ -0,0 +1,58 @@ +OpenTelemetry Python SDK Declarative Configuration +=================================================== + +|pypi| + +.. |pypi| image:: https://badge.fury.io/py/opentelemetry-sdk-configuration.svg + :target: https://pypi.org/project/opentelemetry-sdk-configuration/ + +.. warning:: + + This package is **experimental**. The API surface, type names, and behaviour + may change between minor versions. Pin a specific version in production. + +This package implements the `OpenTelemetry declarative configuration +specification `_ for +the Python SDK. It parses a YAML or JSON configuration file (or +programmatically-constructed configuration model) into typed dataclasses and +applies the result to the global SDK providers. + +The standard activation path is the ``OTEL_CONFIG_FILE`` environment variable, +which the SDK's configurator picks up automatically. Set the variable and run +your app under ``opentelemetry-instrument``; no code change is required. + +For programmatic use: + +.. code-block:: python + + from opentelemetry.sdk.configuration import configure_sdk, load_config_file + + config = load_config_file("otel-config.yaml") + configure_sdk(config) + +Loading from a file requires the optional ``[file-configuration]`` extras +(``pyyaml`` and ``jsonschema``). ``configure_sdk`` itself has no extra +dependencies; callers that build an ``OpenTelemetryConfiguration`` directly can +use it without installing the extras. + +Installation +------------ + +:: + + pip install opentelemetry-sdk-configuration + +To load a file: + +:: + + pip install "opentelemetry-sdk-configuration[file-configuration]" + +References +---------- + +* `OpenTelemetry declarative configuration specification + `_ +* `Language support status matrix + `_ +* `OpenTelemetry Project `_ diff --git a/opentelemetry-sdk/codegen/README.md b/opentelemetry-sdk-configuration/codegen/README.md similarity index 70% rename from opentelemetry-sdk/codegen/README.md rename to opentelemetry-sdk-configuration/codegen/README.md index b79210a576e..e8d35373057 100644 --- a/opentelemetry-sdk/codegen/README.md +++ b/opentelemetry-sdk-configuration/codegen/README.md @@ -6,8 +6,8 @@ Custom [datamodel-code-generator](https://github.com/koxudaxi/datamodel-code-gen Extends the default dataclass template to support `additionalProperties` from the JSON Schema. Schema types that allow additional properties (e.g. `Sampler`, `SpanExporter`, `TextMapPropagator`) get: -- `@_additional_properties` decorator — captures user-defined constructor kwargs -- `additional_properties: ClassVar[dict[str, Any]]` annotation — satisfies type checkers without creating a dataclass field +- `@_additional_properties` decorator: captures user-defined constructor kwargs +- `additional_properties: ClassVar[dict[str, Any]]` annotation: satisfies type checkers without creating a dataclass field This enables plugin/custom component names to flow through typed dataclasses without a post-processing step. @@ -21,4 +21,4 @@ tox -e generate-config-from-jsonschema The template directory is configured in `pyproject.toml` under `[tool.datamodel-codegen]`. -See `opentelemetry-sdk/src/opentelemetry/sdk/_configuration/README.md` for the full schema update workflow. +See `opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md` for the full schema update workflow. diff --git a/opentelemetry-sdk/codegen/dataclass.jinja2 b/opentelemetry-sdk-configuration/codegen/dataclass.jinja2 similarity index 100% rename from opentelemetry-sdk/codegen/dataclass.jinja2 rename to opentelemetry-sdk-configuration/codegen/dataclass.jinja2 diff --git a/opentelemetry-sdk-configuration/pyproject.toml b/opentelemetry-sdk-configuration/pyproject.toml new file mode 100644 index 00000000000..0180d759754 --- /dev/null +++ b/opentelemetry-sdk-configuration/pyproject.toml @@ -0,0 +1,54 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "opentelemetry-sdk-configuration" +dynamic = ["version"] +description = "OpenTelemetry Python SDK Declarative Configuration (experimental)" +readme = "README.rst" +license = "Apache-2.0" +requires-python = ">=3.10" +authors = [ + { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, +] +classifiers = [ + "Development Status :: 3 - Alpha", + "Framework :: OpenTelemetry", + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Typing :: Typed", +] +dependencies = [ + "opentelemetry-api == 1.44.0.dev", + "opentelemetry-sdk == 1.44.0.dev", + "typing-extensions >= 4.5.0", +] + +[project.optional-dependencies] +file-configuration = [ + "pyyaml >= 6.0", + "jsonschema >= 4.0", +] + +[project.urls] +Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-sdk-configuration" +Repository = "https://github.com/open-telemetry/opentelemetry-python" + +[tool.hatch.version] +path = "src/opentelemetry/sdk/configuration/version/__init__.py" + +[tool.hatch.build.targets.sdist] +include = [ + "/src", + "/tests", +] + +[tool.hatch.build.targets.wheel] +packages = ["src/opentelemetry"] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/README.md b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md similarity index 51% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/README.md rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md index e7cf918eea7..e92c086f4f9 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/README.md +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md @@ -1,18 +1,18 @@ -# SDK File Configuration +# SDK Declarative Configuration This package implements [OpenTelemetry file-based configuration](https://opentelemetry.io/docs/specs/otel/configuration). ## Files -- `schema.json` — vendored copy of the [OpenTelemetry configuration JSON schema](https://github.com/open-telemetry/opentelemetry-configuration) -- `models.py` — Python dataclasses generated from `schema.json` by [datamodel-code-generator](https://github.com/koxudaxi/datamodel-code-generator), using a custom template from `opentelemetry-sdk/codegen/` (see that directory's README for details) +- `schema.json`: vendored copy of the [OpenTelemetry configuration JSON schema](https://github.com/open-telemetry/opentelemetry-configuration) +- `models.py`: Python dataclasses generated from `schema.json` by [datamodel-code-generator](https://github.com/koxudaxi/datamodel-code-generator), using a custom template from `opentelemetry-sdk-configuration/codegen/` (see that directory's README for details) ## Updating the schema 1. Download the new schema from the [opentelemetry-configuration releases](https://github.com/open-telemetry/opentelemetry-configuration/releases): ```sh - curl -o opentelemetry-sdk/src/opentelemetry/sdk/_configuration/schema.json \ + curl -o opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json \ https://raw.githubusercontent.com/open-telemetry/opentelemetry-configuration/refs/tags/vX.Y.Z/opentelemetry_configuration.json ``` @@ -25,5 +25,5 @@ This package implements [OpenTelemetry file-based configuration](https://opentel 3. Update any version string references in tests and source: ```sh - grep -r "OLD_VERSION" opentelemetry-sdk/ + grep -r "OLD_VERSION" opentelemetry-sdk-configuration/ ``` diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py new file mode 100644 index 00000000000..959cf17cb1f --- /dev/null +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py @@ -0,0 +1,70 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +"""OpenTelemetry SDK Declarative Configuration. + +This package implements the OpenTelemetry declarative configuration +specification for the Python SDK. Load a YAML or JSON configuration file +(or build a configuration model programmatically) and apply it to the +process-global SDK providers. + +The standard activation path is the ``OTEL_CONFIG_FILE`` environment +variable, which the SDK's configurator picks up automatically. For +programmatic use: + +>>> from opentelemetry.sdk.configuration import ( +... load_config_file, configure_sdk, +... ) +>>> config = load_config_file("otel-config.yaml") +>>> configure_sdk(config) + +Construct a configuration programmatically and apply it: + +>>> from opentelemetry.sdk.configuration import ( +... OpenTelemetryConfiguration, configure_sdk, +... ) +>>> configure_sdk(OpenTelemetryConfiguration(file_format="1.0-rc.1")) + +Loading from a file requires the optional ``[file-configuration]`` extras +(``pyyaml`` and ``jsonschema``). ``configure_sdk`` itself has no extra +dependencies: callers that construct an ``OpenTelemetryConfiguration`` +directly can use it without installing the extras. + +This package is **experimental**. The API surface, type names, and +behaviour may change between minor versions. +""" + +from __future__ import annotations + +import os + +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration._sdk import configure_sdk +from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration + + +def load_config_file( + file_path: str | os.PathLike[str], +) -> OpenTelemetryConfiguration: + """Load and parse an OpenTelemetry configuration file. + + Thin wrapper that defers importing the file loader until first call so + the optional ``[file-configuration]`` extras (``pyyaml``, ``jsonschema``) + are not required just to import this module. See + :func:`opentelemetry.sdk.configuration.file._loader.load_config_file` + for the full behaviour and error contract. + """ + # pylint: disable=import-outside-toplevel + from opentelemetry.sdk.configuration.file._loader import ( # noqa: PLC0415 + load_config_file as _load_config_file, + ) + + return _load_config_file(file_path) + + +__all__ = [ + "ConfigurationError", + "OpenTelemetryConfiguration", + "configure_sdk", + "load_config_file", +] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_common.py similarity index 98% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_common.py index 65729cbb8e3..ba136d5f0a8 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_common.py @@ -9,7 +9,7 @@ from collections.abc import Callable from typing import Any, Protocol -from opentelemetry.sdk._configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration._exceptions import ConfigurationError from opentelemetry.util._importlib_metadata import entry_points _logger = logging.getLogger(__name__) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_conversion.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_conversion.py similarity index 100% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_conversion.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_conversion.py diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_exceptions.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_exceptions.py similarity index 100% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_exceptions.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_exceptions.py diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_logger_provider.py similarity index 94% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_logger_provider.py index d3ed82caf3c..93bd29db3ad 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_logger_provider.py @@ -6,40 +6,40 @@ import logging from opentelemetry._logs import set_logger_provider -from opentelemetry.sdk._configuration._common import ( +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs._internal.export import ( + BatchLogRecordProcessor, + ConsoleLogRecordExporter, + LogRecordExporter, + SimpleLogRecordProcessor, +) +from opentelemetry.sdk.configuration._common import ( _map_compression, _parse_headers, load_entry_point, ) -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration.models import ( BatchLogRecordProcessor as BatchLogRecordProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( LoggerProvider as LoggerProviderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( LogRecordExporter as LogRecordExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( LogRecordProcessor as LogRecordProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SimpleLogRecordProcessor as SimpleLogRecordProcessorConfig, ) -from opentelemetry.sdk._logs import LoggerProvider -from opentelemetry.sdk._logs._internal.export import ( - BatchLogRecordProcessor, - ConsoleLogRecordExporter, - LogRecordExporter, - SimpleLogRecordProcessor, -) from opentelemetry.sdk.resources import Resource _logger = logging.getLogger(__name__) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_meter_provider.py similarity index 95% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_meter_provider.py index 1b8bd911de2..b6c3b6c632e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_meter_provider.py @@ -6,54 +6,54 @@ import logging from opentelemetry import metrics -from opentelemetry.sdk._configuration._common import ( +from opentelemetry.sdk.configuration._common import ( _map_compression, _parse_headers, load_entry_point, ) -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration.models import ( Aggregation as AggregationConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ConsoleMetricExporter as ConsoleMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExemplarFilter as ExemplarFilterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalPrometheusMetricExporter as PrometheusMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, InstrumentType, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( MeterProvider as MeterProviderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( MetricReader as MetricReaderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpGrpcMetricExporter as OtlpGrpcMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpHttpMetricExporter as OtlpHttpMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PeriodicMetricReader as PeriodicMetricReaderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PullMetricExporter as PullMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PullMetricReader as PullMetricReaderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PushMetricExporter as PushMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( View as ViewConfig, ) from opentelemetry.sdk.metrics import ( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_propagator.py similarity index 95% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_propagator.py index 8008cf77c42..9c161ce9703 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_propagator.py @@ -7,11 +7,11 @@ from opentelemetry.propagate import set_global_textmap from opentelemetry.propagators.composite import CompositePropagator from opentelemetry.propagators.textmap import TextMapPropagator -from opentelemetry.sdk._configuration._common import load_entry_point -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._common import load_entry_point +from opentelemetry.sdk.configuration.models import ( Propagator as PropagatorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( TextMapPropagator as TextMapPropagatorConfig, ) from opentelemetry.trace.propagation.tracecontext import ( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_resource.py similarity index 97% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_resource.py index 15e842ee318..b747778ef76 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_resource.py @@ -11,14 +11,14 @@ from typing import Any from urllib import parse -from opentelemetry.sdk._configuration._common import load_entry_point -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._common import load_entry_point +from opentelemetry.sdk.configuration.models import ( AttributeNameValue, AttributeType, ExperimentalResourceDetector, IncludeExclude, ) -from opentelemetry.sdk._configuration.models import Resource as ResourceConfig +from opentelemetry.sdk.configuration.models import Resource as ResourceConfig from opentelemetry.sdk.resources import ( _DEFAULT_RESOURCE, OTEL_SERVICE_NAME, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_sdk.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_sdk.py similarity index 79% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_sdk.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_sdk.py index efa26aa9360..6c637078db8 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_sdk.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_sdk.py @@ -12,18 +12,18 @@ import logging -from opentelemetry.sdk._configuration._logger_provider import ( +from opentelemetry.sdk.configuration._logger_provider import ( configure_logger_provider, ) -from opentelemetry.sdk._configuration._meter_provider import ( +from opentelemetry.sdk.configuration._meter_provider import ( configure_meter_provider, ) -from opentelemetry.sdk._configuration._propagator import configure_propagator -from opentelemetry.sdk._configuration._resource import create_resource -from opentelemetry.sdk._configuration._tracer_provider import ( +from opentelemetry.sdk.configuration._propagator import configure_propagator +from opentelemetry.sdk.configuration._resource import create_resource +from opentelemetry.sdk.configuration._tracer_provider import ( configure_tracer_provider, ) -from opentelemetry.sdk._configuration.models import OpenTelemetryConfiguration +from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration _logger = logging.getLogger(__name__) @@ -45,7 +45,7 @@ def configure_sdk(config: OpenTelemetryConfiguration) -> None: ``load_config_file``). Example: - >>> from opentelemetry.sdk._configuration.file import ( + >>> from opentelemetry.sdk.configuration.file import ( ... load_config_file, configure_sdk, ... ) >>> config = load_config_file("otel-config.yaml") diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_tracer_provider.py similarity index 95% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_tracer_provider.py index 25f5db9c3a3..0e1298670dc 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_tracer_provider.py @@ -6,43 +6,43 @@ import logging from opentelemetry import trace -from opentelemetry.sdk._configuration._common import ( +from opentelemetry.sdk.configuration._common import ( _map_compression, _parse_headers, load_entry_point, ) -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableRuleBasedSampler as RuleBasedSamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableRuleBasedSamplerRule as RuleBasedSamplerRuleConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableSampler as ComposableSamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ParentBasedSampler as ParentBasedSamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( Sampler as SamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanExporter as SpanExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanLimits as SpanLimitsConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.resources import Resource diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/__init__.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/__init__.py similarity index 60% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/__init__.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/__init__.py index 49b09ba46b0..498821328df 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/__init__.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/__init__.py @@ -7,36 +7,36 @@ using declarative configuration files (YAML or JSON). Example: - >>> from opentelemetry.sdk._configuration.file import load_config_file + >>> from opentelemetry.sdk.configuration.file import load_config_file >>> config = load_config_file("otel-config.yaml") >>> print(config.file_format) '1.0' """ -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration._logger_provider import ( +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration._logger_provider import ( configure_logger_provider, create_logger_provider, ) -from opentelemetry.sdk._configuration._meter_provider import ( +from opentelemetry.sdk.configuration._meter_provider import ( configure_meter_provider, create_meter_provider, ) -from opentelemetry.sdk._configuration._propagator import ( +from opentelemetry.sdk.configuration._propagator import ( configure_propagator, create_propagator, ) -from opentelemetry.sdk._configuration._resource import create_resource -from opentelemetry.sdk._configuration._sdk import configure_sdk -from opentelemetry.sdk._configuration._tracer_provider import ( +from opentelemetry.sdk.configuration._resource import create_resource +from opentelemetry.sdk.configuration._sdk import configure_sdk +from opentelemetry.sdk.configuration._tracer_provider import ( configure_tracer_provider, create_tracer_provider, ) -from opentelemetry.sdk._configuration.file._env_substitution import ( +from opentelemetry.sdk.configuration.file._env_substitution import ( EnvSubstitutionError, substitute_env_vars, ) -from opentelemetry.sdk._configuration.file._loader import load_config_file +from opentelemetry.sdk.configuration.file._loader import load_config_file __all__ = [ "load_config_file", diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_env_substitution.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_env_substitution.py similarity index 100% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_env_substitution.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_env_substitution.py diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py similarity index 95% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py index 475ecac3225..ce3a91fdfc8 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py @@ -10,12 +10,12 @@ from pathlib import Path from typing import Any -from opentelemetry.sdk._configuration._conversion import _dict_to_dataclass -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration.file._env_substitution import ( +from opentelemetry.sdk.configuration._conversion import _dict_to_dataclass +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration.file._env_substitution import ( substitute_env_vars, ) -from opentelemetry.sdk._configuration.models import OpenTelemetryConfiguration +from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration try: import yaml @@ -47,7 +47,7 @@ def _get_schema() -> dict: if not _schema_cache: schema_path = ( - importlib.resources.files("opentelemetry.sdk._configuration") + importlib.resources.files("opentelemetry.sdk.configuration") / "schema.json" ) _schema_cache.append( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/models.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py similarity index 99% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/models.py rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py index 1c97e3536ab..bfecf96d72d 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/models.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py @@ -8,7 +8,7 @@ from enum import Enum from typing import Any, ClassVar, TypeAlias -from opentelemetry.sdk._configuration._common import _additional_properties +from opentelemetry.sdk.configuration._common import _additional_properties AlwaysOffSampler: TypeAlias = dict[str, Any] | None diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/schema.json b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json similarity index 100% rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/schema.json rename to opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/version/__init__.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/version/__init__.py new file mode 100644 index 00000000000..98ec6d01b8a --- /dev/null +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/version/__init__.py @@ -0,0 +1,4 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +__version__ = "0.1.0.dev" diff --git a/opentelemetry-sdk-configuration/test-requirements.txt b/opentelemetry-sdk-configuration/test-requirements.txt new file mode 100644 index 00000000000..9c6b9a24d51 --- /dev/null +++ b/opentelemetry-sdk-configuration/test-requirements.txt @@ -0,0 +1,21 @@ +asgiref==3.7.2 +flaky==3.7.0 +iniconfig==2.0.0 +packaging==24.0 +pluggy==1.6.0 +psutil==7.2.2 +py-cpuinfo==9.0.0 +pytest==7.4.4 +jsonschema==4.25.1 +rpds-py==0.23.1; python_version == "3.10" +rpds-py==0.30.0; python_version >= "3.11" +pyyaml==6.0.3 +tomli==2.0.1 +typing_extensions==4.12.0 +wrapt==1.16.0 +zipp==3.19.2 +-e opentelemetry-api +-e tests/opentelemetry-test-utils +-e opentelemetry-semantic-conventions +-e opentelemetry-sdk +-e opentelemetry-sdk-configuration diff --git a/opentelemetry-sdk/tests/_configuration/__init__.py b/opentelemetry-sdk-configuration/tests/__init__.py similarity index 100% rename from opentelemetry-sdk/tests/_configuration/__init__.py rename to opentelemetry-sdk-configuration/tests/__init__.py diff --git a/opentelemetry-sdk/tests/_configuration/file/__init__.py b/opentelemetry-sdk-configuration/tests/file/__init__.py similarity index 100% rename from opentelemetry-sdk/tests/_configuration/file/__init__.py rename to opentelemetry-sdk-configuration/tests/file/__init__.py diff --git a/opentelemetry-sdk/tests/_configuration/file/data/config_with_env_vars.yaml b/opentelemetry-sdk-configuration/tests/file/data/config_with_env_vars.yaml similarity index 100% rename from opentelemetry-sdk/tests/_configuration/file/data/config_with_env_vars.yaml rename to opentelemetry-sdk-configuration/tests/file/data/config_with_env_vars.yaml diff --git a/opentelemetry-sdk/tests/_configuration/file/data/invalid_yaml.yaml b/opentelemetry-sdk-configuration/tests/file/data/invalid_yaml.yaml similarity index 100% rename from opentelemetry-sdk/tests/_configuration/file/data/invalid_yaml.yaml rename to opentelemetry-sdk-configuration/tests/file/data/invalid_yaml.yaml diff --git a/opentelemetry-sdk/tests/_configuration/file/data/minimal_config.json b/opentelemetry-sdk-configuration/tests/file/data/minimal_config.json similarity index 100% rename from opentelemetry-sdk/tests/_configuration/file/data/minimal_config.json rename to opentelemetry-sdk-configuration/tests/file/data/minimal_config.json diff --git a/opentelemetry-sdk/tests/_configuration/file/data/minimal_config.yaml b/opentelemetry-sdk-configuration/tests/file/data/minimal_config.yaml similarity index 100% rename from opentelemetry-sdk/tests/_configuration/file/data/minimal_config.yaml rename to opentelemetry-sdk-configuration/tests/file/data/minimal_config.yaml diff --git a/opentelemetry-sdk/tests/_configuration/file/test_env_substitution.py b/opentelemetry-sdk-configuration/tests/file/test_env_substitution.py similarity index 99% rename from opentelemetry-sdk/tests/_configuration/file/test_env_substitution.py rename to opentelemetry-sdk-configuration/tests/file/test_env_substitution.py index b9f71f387c3..bbcdfd4f34b 100644 --- a/opentelemetry-sdk/tests/_configuration/file/test_env_substitution.py +++ b/opentelemetry-sdk-configuration/tests/file/test_env_substitution.py @@ -7,7 +7,7 @@ import yaml -from opentelemetry.sdk._configuration.file import ( +from opentelemetry.sdk.configuration.file import ( EnvSubstitutionError, substitute_env_vars, ) diff --git a/opentelemetry-sdk/tests/_configuration/file/test_loader.py b/opentelemetry-sdk-configuration/tests/file/test_loader.py similarity index 96% rename from opentelemetry-sdk/tests/_configuration/file/test_loader.py rename to opentelemetry-sdk-configuration/tests/file/test_loader.py index ecb485c6a56..646fa3059b4 100644 --- a/opentelemetry-sdk/tests/_configuration/file/test_loader.py +++ b/opentelemetry-sdk-configuration/tests/file/test_loader.py @@ -7,24 +7,24 @@ from pathlib import Path from unittest.mock import patch -from opentelemetry.sdk._configuration._tracer_provider import ( +from opentelemetry.sdk.configuration._tracer_provider import ( create_tracer_provider, ) -from opentelemetry.sdk._configuration.file import ( +from opentelemetry.sdk.configuration.file import ( ConfigurationError, load_config_file, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( BatchSpanProcessor as BatchSpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import OpenTelemetryConfiguration -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration +from opentelemetry.sdk.configuration.models import ( ParentBasedSampler as ParentBasedSamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.trace import TracerProvider as SdkTracerProvider @@ -348,7 +348,7 @@ def test_pre_release_meta_tag_is_accepted(self): def test_newer_minor_is_accepted_with_warning(self): with self.assertLogs( - "opentelemetry.sdk._configuration.file._loader", level="WARNING" + "opentelemetry.sdk.configuration.file._loader", level="WARNING" ) as logs: config = self._load("1.1") self.assertEqual(config.file_format, "1.1") diff --git a/opentelemetry-sdk/tests/_configuration/test_common.py b/opentelemetry-sdk-configuration/tests/test_common.py similarity index 95% rename from opentelemetry-sdk/tests/_configuration/test_common.py rename to opentelemetry-sdk-configuration/tests/test_common.py index 46469f15d2b..c5d373fb2ac 100644 --- a/opentelemetry-sdk/tests/_configuration/test_common.py +++ b/opentelemetry-sdk-configuration/tests/test_common.py @@ -8,15 +8,15 @@ from typing import Any, ClassVar from unittest.mock import MagicMock, patch -from opentelemetry.sdk._configuration._common import ( +from opentelemetry.sdk.configuration._common import ( _additional_properties, _map_compression, _parse_headers, _resolve_component, load_entry_point, ) -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration.models import ( ExperimentalResourceDetector, LogRecordExporter, PushMetricExporter, @@ -95,7 +95,7 @@ def test_returns_loaded_class(self): mock_ep = MagicMock() mock_ep.load.return_value = mock_class with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): result = load_entry_point("some_group", "some_name") @@ -103,7 +103,7 @@ def test_returns_loaded_class(self): def test_raises_when_not_found(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError) as ctx: @@ -115,7 +115,7 @@ def test_wraps_load_exception_in_configuration_error(self): mock_ep = MagicMock() mock_ep.load.side_effect = ImportError("bad import") with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): with self.assertRaises(ConfigurationError) as ctx: @@ -130,7 +130,7 @@ def test_instantiation_error_not_wrapped(self): mock_ep = MagicMock() mock_ep.load.return_value = mock_class with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): cls = load_entry_point("some_group", "some_name") @@ -318,7 +318,7 @@ def test_resolves_plugin_via_entry_point(self): mock_instance = MagicMock() mock_class = MagicMock(return_value=mock_instance) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -333,7 +333,7 @@ def test_plugin_with_empty_config(self): mock_instance = MagicMock() mock_class = MagicMock(return_value=mock_instance) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -352,7 +352,7 @@ def test_no_component_raises_configuration_error(self): def test_plugin_not_found_raises_configuration_error(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): # pylint: disable=unexpected-keyword-arg diff --git a/opentelemetry-sdk/tests/_configuration/test_conversion.py b/opentelemetry-sdk-configuration/tests/test_conversion.py similarity index 94% rename from opentelemetry-sdk/tests/_configuration/test_conversion.py rename to opentelemetry-sdk-configuration/tests/test_conversion.py index c6cc082e1e3..5de38362d13 100644 --- a/opentelemetry-sdk/tests/_configuration/test_conversion.py +++ b/opentelemetry-sdk-configuration/tests/test_conversion.py @@ -8,9 +8,9 @@ from dataclasses import dataclass from typing import Any, ClassVar -from opentelemetry.sdk._configuration._common import _additional_properties -from opentelemetry.sdk._configuration._conversion import _dict_to_dataclass -from opentelemetry.sdk._configuration.models import ExemplarFilter +from opentelemetry.sdk.configuration._common import _additional_properties +from opentelemetry.sdk.configuration._conversion import _dict_to_dataclass +from opentelemetry.sdk.configuration.models import ExemplarFilter @dataclass diff --git a/opentelemetry-sdk/tests/_configuration/test_logger_provider.py b/opentelemetry-sdk-configuration/tests/test_logger_provider.py similarity index 94% rename from opentelemetry-sdk/tests/_configuration/test_logger_provider.py rename to opentelemetry-sdk-configuration/tests/test_logger_provider.py index 3e2185327da..4a3c65f611d 100644 --- a/opentelemetry-sdk/tests/_configuration/test_logger_provider.py +++ b/opentelemetry-sdk-configuration/tests/test_logger_provider.py @@ -9,7 +9,13 @@ from unittest.mock import MagicMock, patch from opentelemetry._logs import get_logger_provider -from opentelemetry.sdk._configuration._logger_provider import ( +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs._internal.export import ( + BatchLogRecordProcessor, + ConsoleLogRecordExporter, + SimpleLogRecordProcessor, +) +from opentelemetry.sdk.configuration._logger_provider import ( _DEFAULT_EXPORT_TIMEOUT_MILLIS, _DEFAULT_MAX_EXPORT_BATCH_SIZE, _DEFAULT_MAX_QUEUE_SIZE, @@ -21,40 +27,34 @@ configure_logger_provider, create_logger_provider, ) -from opentelemetry.sdk._configuration.file._loader import ConfigurationError -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.file._loader import ConfigurationError +from opentelemetry.sdk.configuration.models import ( BatchLogRecordProcessor as BatchLogRecordProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( LoggerProvider as LoggerProviderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( LogRecordExporter as LogRecordExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( LogRecordLimits as LogRecordLimitsConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( LogRecordProcessor as LogRecordProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( NameStringValuePair, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SimpleLogRecordProcessor as SimpleLogRecordProcessorConfig, ) -from opentelemetry.sdk._logs import LoggerProvider -from opentelemetry.sdk._logs._internal.export import ( - BatchLogRecordProcessor, - ConsoleLogRecordExporter, - SimpleLogRecordProcessor, -) from opentelemetry.sdk.resources import Resource @@ -226,7 +226,7 @@ def test_plugin_log_exporter_loaded_via_entry_point(self): mock_exporter = MagicMock() mock_class = MagicMock(return_value=mock_exporter) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -237,7 +237,7 @@ def test_plugin_log_exporter_loaded_via_entry_point(self): def test_unknown_log_exporter_raises_configuration_error(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): @@ -390,7 +390,7 @@ def test_limits_logs_warning(self): limits=LogRecordLimitsConfig(attribute_count_limit=64), ) with self.assertLogs( - "opentelemetry.sdk._configuration._logger_provider", + "opentelemetry.sdk.configuration._logger_provider", level="WARNING", ) as cm: create_logger_provider(config) @@ -403,7 +403,7 @@ def test_limits_logs_warning(self): def test_no_limits_no_warning(): config = LoggerProviderConfig(processors=[]) with patch( - "opentelemetry.sdk._configuration._logger_provider._logger" + "opentelemetry.sdk.configuration._logger_provider._logger" ) as mock_logger: create_logger_provider(config) mock_logger.warning.assert_not_called() diff --git a/opentelemetry-sdk/tests/_configuration/test_meter_provider.py b/opentelemetry-sdk-configuration/tests/test_meter_provider.py similarity index 95% rename from opentelemetry-sdk/tests/_configuration/test_meter_provider.py rename to opentelemetry-sdk-configuration/tests/test_meter_provider.py index 566329cf146..a4f2a18ff25 100644 --- a/opentelemetry-sdk/tests/_configuration/test_meter_provider.py +++ b/opentelemetry-sdk-configuration/tests/test_meter_provider.py @@ -9,30 +9,30 @@ import unittest from unittest.mock import MagicMock, patch -from opentelemetry.sdk._configuration._meter_provider import ( +from opentelemetry.sdk.configuration._meter_provider import ( configure_meter_provider, create_meter_provider, ) -from opentelemetry.sdk._configuration.file._loader import ConfigurationError -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.file._loader import ConfigurationError +from opentelemetry.sdk.configuration.models import ( Aggregation as AggregationConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( Base2ExponentialBucketHistogramAggregation as Base2Config, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ConsoleMetricExporter as ConsoleMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExemplarFilter as ExemplarFilterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalPrometheusMetricExporter as PrometheusMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExplicitBucketHistogramAggregation as ExplicitBucketConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, IncludeExclude, @@ -40,31 +40,31 @@ ViewSelector, ViewStream, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( MeterProvider as MeterProviderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( MetricReader as MetricReaderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpGrpcMetricExporter as OtlpGrpcMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpHttpMetricExporter as OtlpHttpMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PeriodicMetricReader as PeriodicMetricReaderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PullMetricExporter as PullMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PullMetricReader as PullMetricReaderConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( PushMetricExporter as PushMetricExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( View as ViewConfig, ) from opentelemetry.sdk.metrics import ( @@ -156,7 +156,7 @@ def test_configure_none_does_not_set_global(self): def test_configure_with_config_sets_global(self): config = MeterProviderConfig(readers=[]) with patch( - "opentelemetry.sdk._configuration._meter_provider.metrics.set_meter_provider" + "opentelemetry.sdk.configuration._meter_provider.metrics.set_meter_provider" ) as mock_set: configure_meter_provider(config) mock_set.assert_called_once() @@ -411,7 +411,7 @@ def test_pull_plugin_loads_via_entry_point(self): return_value=[MagicMock(**{"load.return_value": mock_class})] ) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", mock_entry_points, ): config = MeterProviderConfig( @@ -436,7 +436,7 @@ def test_pull_plugin_loads_via_entry_point(self): def test_pull_plugin_not_found_raises(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): config = MeterProviderConfig( @@ -474,7 +474,7 @@ def test_pull_producers_warns(self): ] ) with self.assertLogs( - "opentelemetry.sdk._configuration._meter_provider", + "opentelemetry.sdk.configuration._meter_provider", level="WARNING", ) as cm: create_meter_provider(config) @@ -500,7 +500,7 @@ def test_pull_cardinality_limits_warns(self): ] ) with self.assertLogs( - "opentelemetry.sdk._configuration._meter_provider", + "opentelemetry.sdk.configuration._meter_provider", level="WARNING", ) as cm: create_meter_provider(config) @@ -534,7 +534,7 @@ def test_plugin_metric_exporter_loaded_via_entry_point(self): mock_exporter = MagicMock() mock_class = MagicMock(return_value=mock_exporter) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -546,7 +546,7 @@ def test_plugin_metric_exporter_loaded_via_entry_point(self): def test_unknown_metric_exporter_raises_configuration_error(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): # pylint: disable=unexpected-keyword-arg @@ -781,7 +781,7 @@ def test_stream_attribute_keys_excluded_logs_warning(self): stream_kwargs={"attribute_keys": IncludeExclude(excluded=["key1"])} ) with self.assertLogs( - "opentelemetry.sdk._configuration._meter_provider", level="WARNING" + "opentelemetry.sdk.configuration._meter_provider", level="WARNING" ) as log: create_meter_provider(config) self.assertTrue(any("excluded" in msg for msg in log.output)) diff --git a/opentelemetry-sdk/tests/_configuration/test_models.py b/opentelemetry-sdk-configuration/tests/test_models.py similarity index 75% rename from opentelemetry-sdk/tests/_configuration/test_models.py rename to opentelemetry-sdk-configuration/tests/test_models.py index 2daa8d71995..a0a7d0f3a76 100644 --- a/opentelemetry-sdk/tests/_configuration/test_models.py +++ b/opentelemetry-sdk-configuration/tests/test_models.py @@ -7,6 +7,6 @@ class TestModelsImport(unittest.TestCase): def test_models_import(self): # pylint: disable=no-self-use """Verify generated models import successfully across all Python versions""" - from opentelemetry.sdk._configuration import ( # pylint: disable=import-outside-toplevel,unused-import + from opentelemetry.sdk.configuration import ( # pylint: disable=import-outside-toplevel,unused-import models, # noqa: F401 # type: ignore ) diff --git a/opentelemetry-sdk/tests/_configuration/test_propagator.py b/opentelemetry-sdk-configuration/tests/test_propagator.py similarity index 89% rename from opentelemetry-sdk/tests/_configuration/test_propagator.py rename to opentelemetry-sdk-configuration/tests/test_propagator.py index a14e1315f00..fdeee25f7c6 100644 --- a/opentelemetry-sdk/tests/_configuration/test_propagator.py +++ b/opentelemetry-sdk-configuration/tests/test_propagator.py @@ -11,15 +11,15 @@ from opentelemetry.baggage.propagation import W3CBaggagePropagator from opentelemetry.environment_variables import OTEL_PROPAGATORS from opentelemetry.propagators.composite import CompositePropagator -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration._propagator import ( +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration._propagator import ( configure_propagator, create_propagator, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( Propagator as PropagatorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( TextMapPropagator as TextMapPropagatorConfig, ) from opentelemetry.trace.propagation.tracecontext import ( @@ -78,7 +78,7 @@ def test_b3_via_entry_point(self): mock_ep.load.return_value = lambda: mock_propagator with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -95,7 +95,7 @@ def test_b3multi_via_entry_point(self): mock_ep.load.return_value = lambda: mock_propagator with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -107,7 +107,7 @@ def test_b3multi_via_entry_point(self): def test_b3_not_installed_raises_configuration_error(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): config = PropagatorConfig( @@ -124,7 +124,7 @@ def test_composite_list_tracecontext(self): mock_ep.load.return_value = lambda: mock_tc with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): result = create_propagator(config) @@ -147,7 +147,7 @@ def fake_entry_points(group, name): return [] with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", side_effect=fake_entry_points, ): config = PropagatorConfig(composite_list="tracecontext,baggage") @@ -171,7 +171,7 @@ def test_composite_list_whitespace_around_names(self): mock_ep.load.return_value = lambda: mock_tc with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig(composite_list=" tracecontext ") @@ -184,7 +184,7 @@ def test_entry_point_load_exception_raises_configuration_error(self): mock_ep.load.side_effect = RuntimeError("package broken") with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig(composite_list="broken-prop") @@ -199,7 +199,7 @@ def test_deduplication_across_composite_and_composite_list(self): mock_ep.load.return_value = lambda: mock_tc with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -218,7 +218,7 @@ def test_deduplication_across_composite_and_composite_list(self): def test_unknown_composite_list_propagator_raises(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): config = PropagatorConfig(composite_list="nonexistent") @@ -231,7 +231,7 @@ def test_plugin_propagator_via_entry_point(self): mock_ep.load.return_value = lambda: mock_propagator with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -247,7 +247,7 @@ def test_plugin_propagator_via_entry_point(self): def test_unknown_composite_propagator_raises(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): config = PropagatorConfig( @@ -263,7 +263,7 @@ def test_unknown_composite_propagator_raises(self): class TestConfigurePropagator(unittest.TestCase): def test_configure_propagator_calls_set_global_textmap(self): with patch( - "opentelemetry.sdk._configuration._propagator.set_global_textmap" + "opentelemetry.sdk.configuration._propagator.set_global_textmap" ) as mock_set: configure_propagator(None) mock_set.assert_called_once() @@ -275,7 +275,7 @@ def test_configure_propagator_with_config(self): composite=[TextMapPropagatorConfig(tracecontext={})] ) with patch( - "opentelemetry.sdk._configuration._propagator.set_global_textmap" + "opentelemetry.sdk.configuration._propagator.set_global_textmap" ) as mock_set: configure_propagator(config) mock_set.assert_called_once() @@ -290,7 +290,7 @@ def test_otel_propagators_env_var_ignored(self): composite=[TextMapPropagatorConfig(tracecontext={})] ) with patch( - "opentelemetry.sdk._configuration._propagator.set_global_textmap" + "opentelemetry.sdk.configuration._propagator.set_global_textmap" ) as mock_set: configure_propagator(config) propagator = mock_set.call_args[0][0] diff --git a/opentelemetry-sdk/tests/_configuration/test_resource.py b/opentelemetry-sdk-configuration/tests/test_resource.py similarity index 97% rename from opentelemetry-sdk/tests/_configuration/test_resource.py rename to opentelemetry-sdk-configuration/tests/test_resource.py index ac323bcbde3..9948d0ca676 100644 --- a/opentelemetry-sdk/tests/_configuration/test_resource.py +++ b/opentelemetry-sdk-configuration/tests/test_resource.py @@ -7,16 +7,16 @@ import unittest from unittest.mock import MagicMock, patch -from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration._resource import create_resource -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.sdk.configuration._resource import create_resource +from opentelemetry.sdk.configuration.models import ( AttributeNameValue, AttributeType, ExperimentalResourceDetection, ExperimentalResourceDetector, IncludeExclude, ) -from opentelemetry.sdk._configuration.models import Resource as ResourceConfig +from opentelemetry.sdk.configuration.models import Resource as ResourceConfig from opentelemetry.sdk.resources import ( CONTAINER_ID, HOST_ARCH, @@ -289,7 +289,7 @@ def test_attributes_list_url_decoded(self): def test_attributes_list_invalid_pair_skipped(self): with self.assertLogs( - "opentelemetry.sdk._configuration._resource", level="WARNING" + "opentelemetry.sdk.configuration._resource", level="WARNING" ) as cm: config = ResourceConfig(attributes_list="no-equals,foo=bar") resource = create_resource(config) @@ -471,7 +471,7 @@ def test_container_detector_not_run_when_detectors_list_empty(self): def test_container_detector_raises_when_package_missing(self): """ConfigurationError is raised when the contrib entry point is not found.""" with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): @@ -486,7 +486,7 @@ def test_container_detector_uses_contrib_when_available(self): mock_ep.load.return_value = mock_detector with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): resource = create_resource(self._config_with_container()) @@ -510,7 +510,7 @@ def test_explicit_attributes_override_container_detector(self): ), ) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): resource = create_resource(config) @@ -600,7 +600,7 @@ def test_plugin_detector_loaded_via_entry_point(self): ) ) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[mock_ep], ): resource = create_resource(config) @@ -615,7 +615,7 @@ def test_unknown_detector_raises_configuration_error(self): ) ) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): diff --git a/opentelemetry-sdk/tests/_configuration/test_sdk.py b/opentelemetry-sdk-configuration/tests/test_sdk.py similarity index 69% rename from opentelemetry-sdk/tests/_configuration/test_sdk.py rename to opentelemetry-sdk-configuration/tests/test_sdk.py index b223ad344c5..aea4f6e1a92 100644 --- a/opentelemetry-sdk/tests/_configuration/test_sdk.py +++ b/opentelemetry-sdk-configuration/tests/test_sdk.py @@ -7,26 +7,26 @@ import unittest from unittest.mock import patch -from opentelemetry.sdk._configuration._sdk import configure_sdk -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration._sdk import configure_sdk +from opentelemetry.sdk.configuration.models import ( OpenTelemetryConfiguration, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( Propagator as PropagatorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( Resource as ResourceConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SimpleSpanProcessor as SimpleSpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanExporter as SpanExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.trace import TracerProvider as SdkTracerProvider @@ -39,11 +39,11 @@ def _config(**kwargs) -> OpenTelemetryConfiguration: class TestConfigureSdk(unittest.TestCase): - @patch("opentelemetry.sdk._configuration._sdk.configure_propagator") - @patch("opentelemetry.sdk._configuration._sdk.configure_logger_provider") - @patch("opentelemetry.sdk._configuration._sdk.configure_meter_provider") - @patch("opentelemetry.sdk._configuration._sdk.configure_tracer_provider") - @patch("opentelemetry.sdk._configuration._sdk.create_resource") + @patch("opentelemetry.sdk.configuration._sdk.configure_propagator") + @patch("opentelemetry.sdk.configuration._sdk.configure_logger_provider") + @patch("opentelemetry.sdk.configuration._sdk.configure_meter_provider") + @patch("opentelemetry.sdk.configuration._sdk.configure_tracer_provider") + @patch("opentelemetry.sdk.configuration._sdk.create_resource") # pylint: disable=no-self-use def test_calls_each_signal_with_resource( self, @@ -73,11 +73,11 @@ def test_calls_each_signal_with_resource( mock_logger.assert_called_once_with(None, sentinel_resource) mock_propagator.assert_called_once_with(propagator_cfg) - @patch("opentelemetry.sdk._configuration._sdk.configure_propagator") - @patch("opentelemetry.sdk._configuration._sdk.configure_logger_provider") - @patch("opentelemetry.sdk._configuration._sdk.configure_meter_provider") - @patch("opentelemetry.sdk._configuration._sdk.configure_tracer_provider") - @patch("opentelemetry.sdk._configuration._sdk.create_resource") + @patch("opentelemetry.sdk.configuration._sdk.configure_propagator") + @patch("opentelemetry.sdk.configuration._sdk.configure_logger_provider") + @patch("opentelemetry.sdk.configuration._sdk.configure_meter_provider") + @patch("opentelemetry.sdk.configuration._sdk.configure_tracer_provider") + @patch("opentelemetry.sdk.configuration._sdk.create_resource") # pylint: disable=no-self-use def test_disabled_skips_everything( self, @@ -100,11 +100,11 @@ def test_disabled_skips_everything( mock_logger.assert_not_called() mock_propagator.assert_not_called() - @patch("opentelemetry.sdk._configuration._sdk.configure_propagator") - @patch("opentelemetry.sdk._configuration._sdk.configure_logger_provider") - @patch("opentelemetry.sdk._configuration._sdk.configure_meter_provider") - @patch("opentelemetry.sdk._configuration._sdk.configure_tracer_provider") - @patch("opentelemetry.sdk._configuration._sdk.create_resource") + @patch("opentelemetry.sdk.configuration._sdk.configure_propagator") + @patch("opentelemetry.sdk.configuration._sdk.configure_logger_provider") + @patch("opentelemetry.sdk.configuration._sdk.configure_meter_provider") + @patch("opentelemetry.sdk.configuration._sdk.configure_tracer_provider") + @patch("opentelemetry.sdk.configuration._sdk.create_resource") def test_absent_sections_pass_none( self, mock_create_resource, # noqa: ARG002 @@ -126,7 +126,7 @@ class TestConfigureSdkIntegration(unittest.TestCase): """End-to-end: build a real OpenTelemetryConfiguration and apply it.""" @patch( - "opentelemetry.sdk._configuration._tracer_provider.trace.set_tracer_provider" + "opentelemetry.sdk.configuration._tracer_provider.trace.set_tracer_provider" ) def test_applies_tracer_provider_globally(self, mock_set_tracer): config = _config( diff --git a/opentelemetry-sdk/tests/_configuration/test_tracer_provider.py b/opentelemetry-sdk-configuration/tests/test_tracer_provider.py similarity index 94% rename from opentelemetry-sdk/tests/_configuration/test_tracer_provider.py rename to opentelemetry-sdk-configuration/tests/test_tracer_provider.py index 544e80f7856..7a7fc9e8569 100644 --- a/opentelemetry-sdk/tests/_configuration/test_tracer_provider.py +++ b/opentelemetry-sdk-configuration/tests/test_tracer_provider.py @@ -10,66 +10,66 @@ from unittest.mock import MagicMock, patch from opentelemetry import trace as trace_api -from opentelemetry.sdk._configuration._tracer_provider import ( +from opentelemetry.sdk.configuration._tracer_provider import ( configure_tracer_provider, create_tracer_provider, ) -from opentelemetry.sdk._configuration.file._loader import ConfigurationError -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.file._loader import ConfigurationError +from opentelemetry.sdk.configuration.models import ( BatchSpanProcessor as BatchSpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableProbabilitySampler as ComposableProbabilityConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableRuleBasedSampler as RuleBasedSamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableRuleBasedSamplerRule as RuleBasedSamplerRuleConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableRuleBasedSamplerRuleAttributePatterns as RuleAttributePatternsConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableRuleBasedSamplerRuleAttributeValues as RuleAttributeValuesConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalComposableSampler as ComposableSamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ExperimentalSpanParent as SpanParentConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( ParentBasedSampler as ParentBasedSamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( Sampler as SamplerConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SimpleSpanProcessor as SimpleSpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanExporter as SpanExporterConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanKind as SpanKindConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanLimits as SpanLimitsConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( TraceIdRatioBasedSampler as TraceIdRatioBasedConfig, ) -from opentelemetry.sdk._configuration.models import ( +from opentelemetry.sdk.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.resources import Resource @@ -138,7 +138,7 @@ def test_configure_none_does_not_set_global(self): def test_configure_with_config_sets_global(self): config = TracerProviderConfig(processors=[]) with patch( - "opentelemetry.sdk._configuration._tracer_provider.trace.set_tracer_provider" + "opentelemetry.sdk.configuration._tracer_provider.trace.set_tracer_provider" ) as mock_set: configure_tracer_provider(config) mock_set.assert_called_once() @@ -246,7 +246,7 @@ def test_user_defined_sampler_loaded_via_entry_point(self): mock_sampler = MagicMock(spec=Sampler) mock_class = MagicMock(return_value=mock_sampler) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -255,7 +255,7 @@ def test_user_defined_sampler_loaded_via_entry_point(self): def test_user_defined_sampler_not_found_raises_configuration_error(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): @@ -691,7 +691,7 @@ def test_plugin_span_exporter_loaded_via_entry_point(self): mock_exporter = MagicMock() mock_class = MagicMock(return_value=mock_exporter) with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): config = self._make_batch_config( @@ -705,7 +705,7 @@ def test_plugin_span_exporter_loaded_via_entry_point(self): def test_unknown_span_exporter_raises_configuration_error(self): with patch( - "opentelemetry.sdk._configuration._common.entry_points", + "opentelemetry.sdk.configuration._common.entry_points", return_value=[], ): config = self._make_batch_config( diff --git a/opentelemetry-sdk/pyproject.toml b/opentelemetry-sdk/pyproject.toml index 6be7fbd93fd..ef94331c482 100644 --- a/opentelemetry-sdk/pyproject.toml +++ b/opentelemetry-sdk/pyproject.toml @@ -31,12 +31,6 @@ dependencies = [ "typing-extensions >= 4.5.0", ] -[project.optional-dependencies] -file-configuration = [ - "pyyaml >= 6.0", - "jsonschema >= 4.0", -] - [project.entry-points.opentelemetry_environment_variables] sdk = "opentelemetry.sdk.environment_variables" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 46d1ca7ddfc..bd04db1107b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -722,16 +722,23 @@ class _OTelSDKConfigurator(_BaseConfigurator): def _configure(self, **kwargs): if config_file := environ.get(OTEL_CONFIG_FILE): - # Imported lazily so that the SDK does not require the optional - # file-configuration extras (pyyaml, jsonschema) unless a config - # file is actually requested. - # pylint: disable=import-outside-toplevel - from opentelemetry.sdk._configuration._sdk import ( # noqa: PLC0415 - configure_sdk, - ) - from opentelemetry.sdk._configuration.file._loader import ( # noqa: PLC0415 - load_config_file, - ) + # Declarative configuration lives in the separate + # ``opentelemetry-sdk-configuration`` package. Import lazily so the + # SDK has no runtime dependency on it; users who don't set + # ``OTEL_CONFIG_FILE`` never pay the import cost. + try: + # pylint: disable=import-outside-toplevel + from opentelemetry.sdk.configuration import ( # noqa: PLC0415 + configure_sdk, + load_config_file, + ) + except ImportError as exc: + raise RuntimeError( + f"{OTEL_CONFIG_FILE} is set but " + "opentelemetry-sdk-configuration is not installed. " + "Install it with: pip install " + "'opentelemetry-sdk-configuration[file-configuration]'" + ) from exc if kwargs: _logger.warning( diff --git a/opentelemetry-sdk/test-requirements.txt b/opentelemetry-sdk/test-requirements.txt index e4e793335a4..71fe3720554 100644 --- a/opentelemetry-sdk/test-requirements.txt +++ b/opentelemetry-sdk/test-requirements.txt @@ -6,10 +6,6 @@ pluggy==1.6.0 psutil==7.2.2 py-cpuinfo==9.0.0 pytest==7.4.4 -jsonschema==4.25.1 -rpds-py==0.23.1; python_version == "3.10" -rpds-py==0.30.0; python_version >= "3.11" -pyyaml==6.0.3 tomli==2.0.1 typing_extensions==4.12.0 wrapt==1.16.0 diff --git a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py index 89b2098217b..f598e232ec9 100644 --- a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py +++ b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py @@ -8,7 +8,6 @@ from unittest.mock import patch from opentelemetry.sdk._configuration import _OTelSDKConfigurator -from opentelemetry.sdk._configuration._exceptions import ConfigurationError from opentelemetry.sdk.environment_variables import OTEL_CONFIG_FILE @@ -28,8 +27,8 @@ def test_env_var_unset_runs_env_var_path(self, mock_init_components): ) @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) - @patch("opentelemetry.sdk._configuration._sdk.configure_sdk") - @patch("opentelemetry.sdk._configuration.file._loader.load_config_file") + @patch("opentelemetry.sdk.configuration.configure_sdk") + @patch("opentelemetry.sdk.configuration.load_config_file") @patch("opentelemetry.sdk._configuration._initialize_components") def test_env_var_set_routes_to_declarative_path( self, mock_init_components, mock_load, mock_configure_sdk @@ -43,16 +42,25 @@ def test_env_var_set_routes_to_declarative_path( mock_configure_sdk.assert_called_once_with(sentinel_config) mock_init_components.assert_not_called() - @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/does/not/exist.yaml"}) + @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) + @patch.dict( + "sys.modules", {"opentelemetry.sdk.configuration": None}, clear=False + ) @patch("opentelemetry.sdk._configuration._initialize_components") - def test_env_var_set_missing_file_propagates(self, mock_init_components): - with self.assertRaises(ConfigurationError): + def test_env_var_set_but_package_missing_raises(self, mock_init_components): + # When opentelemetry-sdk-configuration is not installed but the env + # var is set, surface a clear RuntimeError instead of a bare + # ImportError so users know which package to install. + with self.assertRaises(RuntimeError) as ctx: _OTelSDKConfigurator()._configure() + self.assertIn( + "opentelemetry-sdk-configuration", str(ctx.exception) + ) mock_init_components.assert_not_called() @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) - @patch("opentelemetry.sdk._configuration._sdk.configure_sdk") - @patch("opentelemetry.sdk._configuration.file._loader.load_config_file") + @patch("opentelemetry.sdk.configuration.configure_sdk") + @patch("opentelemetry.sdk.configuration.load_config_file") def test_env_var_set_with_kwargs_warns_and_ignores( self, mock_load, mock_configure_sdk ): diff --git a/pyproject.toml b/pyproject.toml index 95c826e01b6..5d02a3df939 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,7 @@ ignore = [ [tool.ruff.lint.per-file-ignores] "docs/**/*.*" = ["PLE"] -"opentelemetry-sdk/tests/_configuration/test_models.py" = ["E402", "PLC0415"] +"opentelemetry-sdk-configuration/tests/test_models.py" = ["E402", "PLC0415"] "shim/opentelemetry-opentracing-shim/tests/*" = ["TID252"] [tool.ruff.lint.isort] @@ -158,9 +158,9 @@ strict = [ ] [tool.datamodel-codegen] -input = "opentelemetry-sdk/src/opentelemetry/sdk/_configuration/schema.json" +input = "opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json" input-file-type = "jsonschema" -output = "opentelemetry-sdk/src/opentelemetry/sdk/_configuration/models.py" +output = "opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py" output-model-type = "dataclasses.dataclass" field-constraints = true formatters = ["ruff-format", "ruff-check"] @@ -169,8 +169,8 @@ use-schema-description = true use-title-as-name = true use-union-operator = true target-python-version = "3.10" -custom-template-dir = "opentelemetry-sdk/codegen" -additional-imports = "typing.ClassVar,opentelemetry.sdk._configuration._common._additional_properties" +custom-template-dir = "opentelemetry-sdk-configuration/codegen" +additional-imports = "typing.ClassVar,opentelemetry.sdk.configuration._common._additional_properties" [tool.towncrier] directory = ".changelog" diff --git a/tox.ini b/tox.ini index 5476de0cde1..f184c4ffc16 100644 --- a/tox.ini +++ b/tox.ini @@ -29,6 +29,10 @@ envlist = lint-opentelemetry-sdk benchmark-opentelemetry-sdk + py3{10,11,12,13,14,14t}-test-opentelemetry-sdk-configuration + pypy3-test-opentelemetry-sdk-configuration + lint-opentelemetry-sdk-configuration + py3{10,11,12,13,14,14t}-test-opentelemetry-semantic-conventions pypy3-test-opentelemetry-semantic-conventions lint-opentelemetry-semantic-conventions @@ -134,6 +138,8 @@ deps = sdk: -r {toxinidir}/opentelemetry-sdk/test-requirements.txt benchmark-opentelemetry-sdk: -r {toxinidir}/opentelemetry-sdk/benchmark-requirements.txt + sdk-configuration: -r {toxinidir}/opentelemetry-sdk-configuration/test-requirements.txt + semantic-conventions: -r {toxinidir}/opentelemetry-semantic-conventions/test-requirements.txt test-utils: -r {toxinidir}/tests/opentelemetry-test-utils/test-requirements.txt @@ -225,6 +231,9 @@ commands = lint-opentelemetry-sdk: pylint {toxinidir}/opentelemetry-sdk benchmark-opentelemetry-sdk: pytest {toxinidir}/opentelemetry-sdk/benchmarks --benchmark-json={toxinidir}/opentelemetry-sdk/sdk-benchmark.json {posargs} + test-opentelemetry-sdk-configuration: pytest {toxinidir}/opentelemetry-sdk-configuration/tests {posargs} + lint-opentelemetry-sdk-configuration: pylint {toxinidir}/opentelemetry-sdk-configuration + test-opentelemetry-proto-gen: pytest {toxinidir}/opentelemetry-proto/tests {posargs} lint-opentelemetry-proto-gen: pylint {toxinidir}/opentelemetry-proto @@ -419,7 +428,8 @@ deps = types-PyYAML -e {toxinidir}/opentelemetry-api -e {toxinidir}/opentelemetry-semantic-conventions - -e {toxinidir}/opentelemetry-sdk[file-configuration] + -e {toxinidir}/opentelemetry-sdk + -e {toxinidir}/opentelemetry-sdk-configuration[file-configuration] -e {toxinidir}/tests/opentelemetry-test-utils -e {toxinidir}/exporter/opentelemetry-exporter-http-transport -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common From d7ba5dafc6f961fa4484d305a9d82af00d7cc6e9 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Thu, 25 Jun 2026 19:09:06 +0100 Subject: [PATCH 02/14] rename changelog fragment to PR #5356 --- .changelog/{5355.changed => 5356.changed} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .changelog/{5355.changed => 5356.changed} (100%) diff --git a/.changelog/5355.changed b/.changelog/5356.changed similarity index 100% rename from .changelog/5355.changed rename to .changelog/5356.changed From 3c90d9c4a5655d4dbbfa044443d03aa583b24d94 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Thu, 25 Jun 2026 19:22:43 +0100 Subject: [PATCH 03/14] register opentelemetry-sdk-configuration in uv workspace --- pyproject.toml | 3 +++ uv.lock | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5d02a3df939..a904fdf02c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,6 +5,7 @@ requires-python = ">=3.10" dependencies = [ "opentelemetry-api", "opentelemetry-sdk", + "opentelemetry-sdk-configuration", "opentelemetry-semantic-conventions", "opentelemetry-proto", "opentelemetry-proto-json", @@ -30,6 +31,7 @@ required-version = ">=0.6.0" [tool.uv.sources] opentelemetry-api = { workspace = true} opentelemetry-sdk = { workspace = true } +opentelemetry-sdk-configuration = { workspace = true } opentelemetry-proto = { workspace = true } opentelemetry-proto-json = { workspace = true } opentelemetry-semantic-conventions = { workspace = true } @@ -50,6 +52,7 @@ opentelemetry-codegen-json = { workspace = true } members = [ "opentelemetry-api", "opentelemetry-sdk", + "opentelemetry-sdk-configuration", "opentelemetry-semantic-conventions", "opentelemetry-proto", "opentelemetry-proto-json", diff --git a/uv.lock b/uv.lock index ec806543d86..af37536452d 100644 --- a/uv.lock +++ b/uv.lock @@ -26,6 +26,7 @@ members = [ "opentelemetry-proto-json", "opentelemetry-python", "opentelemetry-sdk", + "opentelemetry-sdk-configuration", "opentelemetry-semantic-conventions", "opentelemetry-test-utils", ] @@ -1071,6 +1072,7 @@ dependencies = [ { name = "opentelemetry-proto" }, { name = "opentelemetry-proto-json" }, { name = "opentelemetry-sdk" }, + { name = "opentelemetry-sdk-configuration" }, { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-test-utils" }, ] @@ -1101,6 +1103,7 @@ requires-dist = [ { name = "opentelemetry-proto", editable = "opentelemetry-proto" }, { name = "opentelemetry-proto-json", editable = "opentelemetry-proto-json" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, + { name = "opentelemetry-sdk-configuration", editable = "opentelemetry-sdk-configuration" }, { name = "opentelemetry-semantic-conventions", editable = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-test-utils", editable = "tests/opentelemetry-test-utils" }, ] @@ -1124,6 +1127,22 @@ dependencies = [ { name = "typing-extensions" }, ] +[package.metadata] +requires-dist = [ + { name = "opentelemetry-api", editable = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions", editable = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions", specifier = ">=4.5.0" }, +] + +[[package]] +name = "opentelemetry-sdk-configuration" +source = { editable = "opentelemetry-sdk-configuration" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-sdk" }, + { name = "typing-extensions" }, +] + [package.optional-dependencies] file-configuration = [ { name = "jsonschema" }, @@ -1134,7 +1153,7 @@ file-configuration = [ requires-dist = [ { name = "jsonschema", marker = "extra == 'file-configuration'", specifier = ">=4.0" }, { name = "opentelemetry-api", editable = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions", editable = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, { name = "pyyaml", marker = "extra == 'file-configuration'", specifier = ">=6.0" }, { name = "typing-extensions", specifier = ">=4.5.0" }, ] From 4f62d78d406d0d42441079f9f96845f72c1ac32b Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Thu, 25 Jun 2026 20:16:56 +0100 Subject: [PATCH 04/14] fix CI: regenerate workflows, mock new pkg in routing tests, silence lint/typecheck on lazy import, fix link-check placeholder --- .github/workflows/lint.yml | 19 ++ .github/workflows/test.yml | 280 ++++++++++++++++++ .../opentelemetry/sdk/configuration/README.md | 5 +- .../sdk/_configuration/__init__.py | 4 +- .../sdk/trace/export/__init__.py | 2 +- .../test_configurator_file_routing.py | 69 +++-- 6 files changed, 348 insertions(+), 31 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 27033640dc1..3e50fb53d68 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -119,6 +119,25 @@ jobs: - name: Run tests run: tox -e lint-opentelemetry-sdk + lint-opentelemetry-sdk-configuration: + name: opentelemetry-sdk-configuration + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14 + uses: actions/setup-python@v5 + with: + python-version: "3.14" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e lint-opentelemetry-sdk-configuration + lint-opentelemetry-semantic-conventions: name: opentelemetry-semantic-conventions runs-on: ubuntu-latest diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d562b9d8745..97bba503eb2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -923,6 +923,139 @@ jobs: - name: Run tests run: tox -e pypy3-test-opentelemetry-sdk -- -ra + py310-test-opentelemetry-sdk-configuration_ubuntu-latest: + name: opentelemetry-sdk-configuration 3.10 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py310-test-opentelemetry-sdk-configuration -- -ra + + py311-test-opentelemetry-sdk-configuration_ubuntu-latest: + name: opentelemetry-sdk-configuration 3.11 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py311-test-opentelemetry-sdk-configuration -- -ra + + py312-test-opentelemetry-sdk-configuration_ubuntu-latest: + name: opentelemetry-sdk-configuration 3.12 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py312-test-opentelemetry-sdk-configuration -- -ra + + py313-test-opentelemetry-sdk-configuration_ubuntu-latest: + name: opentelemetry-sdk-configuration 3.13 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.13 + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py313-test-opentelemetry-sdk-configuration -- -ra + + py314-test-opentelemetry-sdk-configuration_ubuntu-latest: + name: opentelemetry-sdk-configuration 3.14 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14 + uses: actions/setup-python@v5 + with: + python-version: "3.14" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py314-test-opentelemetry-sdk-configuration -- -ra + + py314t-test-opentelemetry-sdk-configuration_ubuntu-latest: + name: opentelemetry-sdk-configuration 3.14t Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14t + uses: actions/setup-python@v5 + with: + python-version: "3.14t" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py314t-test-opentelemetry-sdk-configuration -- -ra + + pypy3-test-opentelemetry-sdk-configuration_ubuntu-latest: + name: opentelemetry-sdk-configuration pypy-3.10 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python pypy-3.10 + uses: actions/setup-python@v5 + with: + python-version: "pypy-3.10" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e pypy3-test-opentelemetry-sdk-configuration -- -ra + py310-test-opentelemetry-semantic-conventions_ubuntu-latest: name: opentelemetry-semantic-conventions 3.10 Ubuntu runs-on: ubuntu-latest @@ -4489,6 +4622,153 @@ jobs: - name: Run tests run: tox -e pypy3-test-opentelemetry-sdk -- -ra + py310-test-opentelemetry-sdk-configuration_windows-latest: + name: opentelemetry-sdk-configuration 3.10 Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - name: Configure git to support long filenames + run: git config --system core.longpaths true + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py310-test-opentelemetry-sdk-configuration -- -ra + + py311-test-opentelemetry-sdk-configuration_windows-latest: + name: opentelemetry-sdk-configuration 3.11 Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - name: Configure git to support long filenames + run: git config --system core.longpaths true + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py311-test-opentelemetry-sdk-configuration -- -ra + + py312-test-opentelemetry-sdk-configuration_windows-latest: + name: opentelemetry-sdk-configuration 3.12 Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - name: Configure git to support long filenames + run: git config --system core.longpaths true + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py312-test-opentelemetry-sdk-configuration -- -ra + + py313-test-opentelemetry-sdk-configuration_windows-latest: + name: opentelemetry-sdk-configuration 3.13 Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - name: Configure git to support long filenames + run: git config --system core.longpaths true + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.13 + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py313-test-opentelemetry-sdk-configuration -- -ra + + py314-test-opentelemetry-sdk-configuration_windows-latest: + name: opentelemetry-sdk-configuration 3.14 Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - name: Configure git to support long filenames + run: git config --system core.longpaths true + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14 + uses: actions/setup-python@v5 + with: + python-version: "3.14" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py314-test-opentelemetry-sdk-configuration -- -ra + + py314t-test-opentelemetry-sdk-configuration_windows-latest: + name: opentelemetry-sdk-configuration 3.14t Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - name: Configure git to support long filenames + run: git config --system core.longpaths true + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14t + uses: actions/setup-python@v5 + with: + python-version: "3.14t" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py314t-test-opentelemetry-sdk-configuration -- -ra + + pypy3-test-opentelemetry-sdk-configuration_windows-latest: + name: opentelemetry-sdk-configuration pypy-3.10 Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - name: Configure git to support long filenames + run: git config --system core.longpaths true + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python pypy-3.10 + uses: actions/setup-python@v5 + with: + python-version: "pypy-3.10" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e pypy3-test-opentelemetry-sdk-configuration -- -ra + py310-test-opentelemetry-semantic-conventions_windows-latest: name: opentelemetry-semantic-conventions 3.10 Windows runs-on: windows-latest diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md index e92c086f4f9..46ff5e7893a 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md @@ -9,11 +9,12 @@ This package implements [OpenTelemetry file-based configuration](https://opentel ## Updating the schema -1. Download the new schema from the [opentelemetry-configuration releases](https://github.com/open-telemetry/opentelemetry-configuration/releases): +1. Pick the desired tag from the [opentelemetry-configuration releases](https://github.com/open-telemetry/opentelemetry-configuration/releases) and download the schema: ```sh + TAG=v1.1.0 curl -o opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json \ - https://raw.githubusercontent.com/open-telemetry/opentelemetry-configuration/refs/tags/vX.Y.Z/opentelemetry_configuration.json + "https://raw.githubusercontent.com/open-telemetry/opentelemetry-configuration/refs/tags/${TAG}/opentelemetry_configuration.json" ``` 2. Regenerate `models.py`: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index bd04db1107b..faaf3b03f69 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -727,8 +727,8 @@ def _configure(self, **kwargs): # SDK has no runtime dependency on it; users who don't set # ``OTEL_CONFIG_FILE`` never pay the import cost. try: - # pylint: disable=import-outside-toplevel - from opentelemetry.sdk.configuration import ( # noqa: PLC0415 + # pylint: disable=import-outside-toplevel,no-name-in-module + from opentelemetry.sdk.configuration import ( # type: ignore[import-not-found] # noqa: PLC0415 configure_sdk, load_config_file, ) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py index 067fb3ded32..ad8f57840a0 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -333,7 +333,7 @@ def __init__( out: typing.IO = sys.stdout, formatter: collections.abc.Callable[ [ReadableSpan], str - ] = lambda span: (span.to_json() + linesep), + ] = lambda span: span.to_json() + linesep, ): self.out = out self.formatter = formatter diff --git a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py index f598e232ec9..68e73bc68b2 100644 --- a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py +++ b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py @@ -4,13 +4,28 @@ # Tests access private members of SDK classes to assert correct configuration. # pylint: disable=protected-access,no-self-use +import types import unittest -from unittest.mock import patch +from unittest.mock import MagicMock, patch from opentelemetry.sdk._configuration import _OTelSDKConfigurator from opentelemetry.sdk.environment_variables import OTEL_CONFIG_FILE +def _fake_configuration_module(): + """Build a stub `opentelemetry.sdk.configuration` module. + + The SDK lazy-imports this package at runtime when OTEL_CONFIG_FILE is set, + but the SDK's test env does not depend on opentelemetry-sdk-configuration. + Injecting a stub into sys.modules lets these tests exercise the routing + without installing the downstream package. + """ + module = types.ModuleType("opentelemetry.sdk.configuration") + module.configure_sdk = MagicMock() + module.load_config_file = MagicMock() + return module + + class TestConfiguratorFileRouting(unittest.TestCase): def tearDown(self): # _BaseConfigurator caches instances via a singleton; reset so sibling @@ -27,19 +42,21 @@ def test_env_var_unset_runs_env_var_path(self, mock_init_components): ) @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) - @patch("opentelemetry.sdk.configuration.configure_sdk") - @patch("opentelemetry.sdk.configuration.load_config_file") @patch("opentelemetry.sdk._configuration._initialize_components") def test_env_var_set_routes_to_declarative_path( - self, mock_init_components, mock_load, mock_configure_sdk + self, mock_init_components ): + fake = _fake_configuration_module() sentinel_config = object() - mock_load.return_value = sentinel_config + fake.load_config_file.return_value = sentinel_config - _OTelSDKConfigurator()._configure() + with patch.dict( + "sys.modules", {"opentelemetry.sdk.configuration": fake} + ): + _OTelSDKConfigurator()._configure() - mock_load.assert_called_once_with("/tmp/otel.yaml") - mock_configure_sdk.assert_called_once_with(sentinel_config) + fake.load_config_file.assert_called_once_with("/tmp/otel.yaml") + fake.configure_sdk.assert_called_once_with(sentinel_config) mock_init_components.assert_not_called() @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) @@ -47,31 +64,31 @@ def test_env_var_set_routes_to_declarative_path( "sys.modules", {"opentelemetry.sdk.configuration": None}, clear=False ) @patch("opentelemetry.sdk._configuration._initialize_components") - def test_env_var_set_but_package_missing_raises(self, mock_init_components): + def test_env_var_set_but_package_missing_raises( + self, mock_init_components + ): # When opentelemetry-sdk-configuration is not installed but the env # var is set, surface a clear RuntimeError instead of a bare # ImportError so users know which package to install. with self.assertRaises(RuntimeError) as ctx: _OTelSDKConfigurator()._configure() - self.assertIn( - "opentelemetry-sdk-configuration", str(ctx.exception) - ) + self.assertIn("opentelemetry-sdk-configuration", str(ctx.exception)) mock_init_components.assert_not_called() @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) - @patch("opentelemetry.sdk.configuration.configure_sdk") - @patch("opentelemetry.sdk.configuration.load_config_file") - def test_env_var_set_with_kwargs_warns_and_ignores( - self, mock_load, mock_configure_sdk - ): - mock_load.return_value = object() - - with self.assertLogs( - "opentelemetry.sdk._configuration", level="WARNING" - ) as captured: - _OTelSDKConfigurator()._configure( - sampler="X", auto_instrumentation_version="Y" - ) + def test_env_var_set_with_kwargs_warns_and_ignores(self): + fake = _fake_configuration_module() + fake.load_config_file.return_value = object() + + with patch.dict( + "sys.modules", {"opentelemetry.sdk.configuration": fake} + ): + with self.assertLogs( + "opentelemetry.sdk._configuration", level="WARNING" + ) as captured: + _OTelSDKConfigurator()._configure( + sampler="X", auto_instrumentation_version="Y" + ) self.assertTrue( any( @@ -80,7 +97,7 @@ def test_env_var_set_with_kwargs_warns_and_ignores( ), f"Expected warning about ignored kwargs, got: {captured.output}", ) - mock_configure_sdk.assert_called_once() + fake.configure_sdk.assert_called_once() @patch.dict("os.environ", {}, clear=True) @patch("opentelemetry.sdk._configuration._initialize_components") From 9eba9f6ed03e15c04defcc5737e865f790b96eff Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Thu, 25 Jun 2026 21:28:10 +0100 Subject: [PATCH 05/14] fix CI: per-package pylintrc for sdk-configuration, drop bad link from schema README --- opentelemetry-sdk-configuration/.pylintrc | 40 +++++++++++++++++++ .../opentelemetry/sdk/configuration/README.md | 8 +--- tox.ini | 2 +- 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 opentelemetry-sdk-configuration/.pylintrc diff --git a/opentelemetry-sdk-configuration/.pylintrc b/opentelemetry-sdk-configuration/.pylintrc new file mode 100644 index 00000000000..35a27210ba7 --- /dev/null +++ b/opentelemetry-sdk-configuration/.pylintrc @@ -0,0 +1,40 @@ +# Pylint config for opentelemetry-sdk-configuration. Extends the repo root +# `.pylintrc` (which pylint discovers by walking upward from each file) and +# adds disables that only apply to this package. +# +# `opentelemetry-sdk-configuration` extends the `opentelemetry.sdk.*` +# namespace owned by `opentelemetry-sdk`. At runtime PEP 420 namespace +# package merging makes `opentelemetry.sdk.configuration.*` resolvable, but +# astroid (pylint's resolver) does not follow editable-install namespace +# extensions across separate distributions, so it reports false positive +# `import-error` / `no-name-in-module` on every import that crosses the +# package boundary. These two messages are silenced for this package only. + +[MASTER] +# Skip the codegen'd models.py (datamodel-code-generator output). +ignore-patterns=^models\.py$ +# Run with multiple processes. +jobs=0 +# Match the global pylintrc's no-self-use extension. +load-plugins=pylint.extensions.no_self_use + +[MESSAGES CONTROL] +disable=missing-docstring, + fixme, + too-few-public-methods, + too-many-instance-attributes, + too-many-arguments, + too-many-positional-arguments, + duplicate-code, + ungrouped-imports, + wrong-import-order, + line-too-long, + exec-used, + super-with-arguments, + isinstance-second-argument-not-valid-type, + raise-missing-from, + unused-argument, + redefined-builtin, + cyclic-import, + import-error, + no-name-in-module, diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md index 46ff5e7893a..d4f92a3dadb 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md @@ -9,13 +9,7 @@ This package implements [OpenTelemetry file-based configuration](https://opentel ## Updating the schema -1. Pick the desired tag from the [opentelemetry-configuration releases](https://github.com/open-telemetry/opentelemetry-configuration/releases) and download the schema: - - ```sh - TAG=v1.1.0 - curl -o opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json \ - "https://raw.githubusercontent.com/open-telemetry/opentelemetry-configuration/refs/tags/${TAG}/opentelemetry_configuration.json" - ``` +1. Pick the desired release tag from the [opentelemetry-configuration releases](https://github.com/open-telemetry/opentelemetry-configuration/releases) and overwrite `opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json` with the `opentelemetry_configuration.json` published on that release. 2. Regenerate `models.py`: diff --git a/tox.ini b/tox.ini index f184c4ffc16..35657e55b99 100644 --- a/tox.ini +++ b/tox.ini @@ -232,7 +232,7 @@ commands = benchmark-opentelemetry-sdk: pytest {toxinidir}/opentelemetry-sdk/benchmarks --benchmark-json={toxinidir}/opentelemetry-sdk/sdk-benchmark.json {posargs} test-opentelemetry-sdk-configuration: pytest {toxinidir}/opentelemetry-sdk-configuration/tests {posargs} - lint-opentelemetry-sdk-configuration: pylint {toxinidir}/opentelemetry-sdk-configuration + lint-opentelemetry-sdk-configuration: pylint --rcfile={toxinidir}/opentelemetry-sdk-configuration/.pylintrc {toxinidir}/opentelemetry-sdk-configuration test-opentelemetry-proto-gen: pytest {toxinidir}/opentelemetry-proto/tests {posargs} lint-opentelemetry-proto-gen: pylint {toxinidir}/opentelemetry-proto From 3cde0320f450e8cff1cb639945c71f98cf83fc2c Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Thu, 25 Jun 2026 21:41:05 +0100 Subject: [PATCH 06/14] drop file-configuration extras: pyyaml and jsonschema are now required deps --- docs/examples/declarative-config/README.rst | 7 ++--- docs/sdk/configuration.rst | 5 ++-- opentelemetry-sdk-configuration/README.rst | 11 ------- .../pyproject.toml | 4 --- .../sdk/configuration/__init__.py | 30 +------------------ .../sdk/configuration/file/_loader.py | 19 ++---------- .../sdk/_configuration/__init__.py | 3 +- tox.ini | 2 +- uv.lock | 13 +++----- 9 files changed, 15 insertions(+), 79 deletions(-) diff --git a/docs/examples/declarative-config/README.rst b/docs/examples/declarative-config/README.rst index ec3b828b829..90f6efa018f 100644 --- a/docs/examples/declarative-config/README.rst +++ b/docs/examples/declarative-config/README.rst @@ -15,13 +15,12 @@ variables or hand-written provider setup. The source files of this example are available :scm_web:`here `. -Install the SDK with the ``file-configuration`` extra (it pulls in ``pyyaml`` -and ``jsonschema``), the auto-instrumentation entry point, and the OTLP/HTTP -exporter: +Install the declarative-config package, the auto-instrumentation entry point, +and the OTLP/HTTP exporter: .. code-block:: sh - pip install "opentelemetry-sdk[file-configuration]" \ + pip install opentelemetry-sdk-configuration \ opentelemetry-distro \ opentelemetry-exporter-otlp-proto-http diff --git a/docs/sdk/configuration.rst b/docs/sdk/configuration.rst index 40af342e418..ee5d8917146 100644 --- a/docs/sdk/configuration.rst +++ b/docs/sdk/configuration.rst @@ -21,12 +21,11 @@ configuration schema, and applies it globally. Installing ---------- -File configuration relies on optional dependencies (``pyyaml`` and -``jsonschema``). Install them with the ``file-configuration`` extra: +Declarative configuration lives in a separate, experimental package: .. code-block:: sh - pip install "opentelemetry-sdk[file-configuration]" + pip install opentelemetry-sdk-configuration Enabling with an environment variable ------------------------------------- diff --git a/opentelemetry-sdk-configuration/README.rst b/opentelemetry-sdk-configuration/README.rst index 97591e2c0c1..d6a73c2f774 100644 --- a/opentelemetry-sdk-configuration/README.rst +++ b/opentelemetry-sdk-configuration/README.rst @@ -30,11 +30,6 @@ For programmatic use: config = load_config_file("otel-config.yaml") configure_sdk(config) -Loading from a file requires the optional ``[file-configuration]`` extras -(``pyyaml`` and ``jsonschema``). ``configure_sdk`` itself has no extra -dependencies; callers that build an ``OpenTelemetryConfiguration`` directly can -use it without installing the extras. - Installation ------------ @@ -42,12 +37,6 @@ Installation pip install opentelemetry-sdk-configuration -To load a file: - -:: - - pip install "opentelemetry-sdk-configuration[file-configuration]" - References ---------- diff --git a/opentelemetry-sdk-configuration/pyproject.toml b/opentelemetry-sdk-configuration/pyproject.toml index 0180d759754..bd70ed27e7b 100644 --- a/opentelemetry-sdk-configuration/pyproject.toml +++ b/opentelemetry-sdk-configuration/pyproject.toml @@ -29,10 +29,6 @@ dependencies = [ "opentelemetry-api == 1.44.0.dev", "opentelemetry-sdk == 1.44.0.dev", "typing-extensions >= 4.5.0", -] - -[project.optional-dependencies] -file-configuration = [ "pyyaml >= 6.0", "jsonschema >= 4.0", ] diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py index 959cf17cb1f..2dad25a1a92 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py @@ -25,43 +25,15 @@ ... ) >>> configure_sdk(OpenTelemetryConfiguration(file_format="1.0-rc.1")) -Loading from a file requires the optional ``[file-configuration]`` extras -(``pyyaml`` and ``jsonschema``). ``configure_sdk`` itself has no extra -dependencies: callers that construct an ``OpenTelemetryConfiguration`` -directly can use it without installing the extras. - This package is **experimental**. The API surface, type names, and behaviour may change between minor versions. """ -from __future__ import annotations - -import os - from opentelemetry.sdk.configuration._exceptions import ConfigurationError from opentelemetry.sdk.configuration._sdk import configure_sdk +from opentelemetry.sdk.configuration.file._loader import load_config_file from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration - -def load_config_file( - file_path: str | os.PathLike[str], -) -> OpenTelemetryConfiguration: - """Load and parse an OpenTelemetry configuration file. - - Thin wrapper that defers importing the file loader until first call so - the optional ``[file-configuration]`` extras (``pyyaml``, ``jsonschema``) - are not required just to import this module. See - :func:`opentelemetry.sdk.configuration.file._loader.load_config_file` - for the full behaviour and error contract. - """ - # pylint: disable=import-outside-toplevel - from opentelemetry.sdk.configuration.file._loader import ( # noqa: PLC0415 - load_config_file as _load_config_file, - ) - - return _load_config_file(file_path) - - __all__ = [ "ConfigurationError", "OpenTelemetryConfiguration", diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py index ce3a91fdfc8..9806a87f58f 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py +++ b/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py @@ -10,6 +10,9 @@ from pathlib import Path from typing import Any +import jsonschema +import yaml + from opentelemetry.sdk.configuration._conversion import _dict_to_dataclass from opentelemetry.sdk.configuration._exceptions import ConfigurationError from opentelemetry.sdk.configuration.file._env_substitution import ( @@ -17,22 +20,6 @@ ) from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration -try: - import yaml -except ImportError as exc: - raise ImportError( - "File configuration requires pyyaml. " - "Install with: pip install opentelemetry-sdk[file-configuration]" - ) from exc - -try: - import jsonschema -except ImportError as exc: - raise ImportError( - "File configuration requires jsonschema. " - "Install with: pip install opentelemetry-sdk[file-configuration]" - ) from exc - # Schema version vendored in schema.json. ``file_format`` values are accepted # per the configuration spec's versioning rules: the major version must match, # and a minor version newer than the one this SDK targets is accepted with a diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index faaf3b03f69..d9eb5cdbc0d 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -736,8 +736,7 @@ def _configure(self, **kwargs): raise RuntimeError( f"{OTEL_CONFIG_FILE} is set but " "opentelemetry-sdk-configuration is not installed. " - "Install it with: pip install " - "'opentelemetry-sdk-configuration[file-configuration]'" + "Install it with: pip install opentelemetry-sdk-configuration" ) from exc if kwargs: diff --git a/tox.ini b/tox.ini index 35657e55b99..bb6dda5d4fb 100644 --- a/tox.ini +++ b/tox.ini @@ -429,7 +429,7 @@ deps = -e {toxinidir}/opentelemetry-api -e {toxinidir}/opentelemetry-semantic-conventions -e {toxinidir}/opentelemetry-sdk - -e {toxinidir}/opentelemetry-sdk-configuration[file-configuration] + -e {toxinidir}/opentelemetry-sdk-configuration -e {toxinidir}/tests/opentelemetry-test-utils -e {toxinidir}/exporter/opentelemetry-exporter-http-transport -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common diff --git a/uv.lock b/uv.lock index af37536452d..b5b7a35df15 100644 --- a/uv.lock +++ b/uv.lock @@ -1138,26 +1138,21 @@ requires-dist = [ name = "opentelemetry-sdk-configuration" source = { editable = "opentelemetry-sdk-configuration" } dependencies = [ + { name = "jsonschema" }, { name = "opentelemetry-api" }, { name = "opentelemetry-sdk" }, - { name = "typing-extensions" }, -] - -[package.optional-dependencies] -file-configuration = [ - { name = "jsonschema" }, { name = "pyyaml" }, + { name = "typing-extensions" }, ] [package.metadata] requires-dist = [ - { name = "jsonschema", marker = "extra == 'file-configuration'", specifier = ">=4.0" }, + { name = "jsonschema", specifier = ">=4.0" }, { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, - { name = "pyyaml", marker = "extra == 'file-configuration'", specifier = ">=6.0" }, + { name = "pyyaml", specifier = ">=6.0" }, { name = "typing-extensions", specifier = ">=4.5.0" }, ] -provides-extras = ["file-configuration"] [[package]] name = "opentelemetry-semantic-conventions" From 1b4f949b77cc4542dc632d29238c7dedd311950b Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Thu, 25 Jun 2026 21:44:31 +0100 Subject: [PATCH 07/14] tighten 5356 changelog entry --- .changelog/5356.changed | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changelog/5356.changed b/.changelog/5356.changed index ef26210fc56..f0168f1a062 100644 --- a/.changelog/5356.changed +++ b/.changelog/5356.changed @@ -1 +1 @@ -`opentelemetry-sdk`: extract declarative configuration into a new `opentelemetry-sdk-configuration` package. The implementation (schema, models, loader, `configure_sdk`, per-signal factories) moves out of `opentelemetry.sdk._configuration` into the public `opentelemetry.sdk.configuration` namespace shipped by the new package. The SDK keeps the `OTEL_CONFIG_FILE` env var and the activation hook in `_OTelSDKConfigurator._configure`, which now lazy-imports `opentelemetry.sdk.configuration` only when the env var is set. The SDK has no runtime dependency on the new package; users who don't use declarative config pay no import cost. Setting `OTEL_CONFIG_FILE` without the new package installed now raises a clear `RuntimeError` with a pip-install hint. The new package is published experimentally and versions independently of the SDK. +Declarative configuration moves from `opentelemetry.sdk._configuration` into the new public `opentelemetry-sdk-configuration` package (`opentelemetry.sdk.configuration` namespace), published experimentally and versioned independently of the SDK. From 76413715342c8865a450c495c4ea55d43296b15e Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Fri, 26 Jun 2026 11:33:51 +0100 Subject: [PATCH 08/14] drop opentelemetry/sdk/__init__.pyi to make opentelemetry.sdk a proper namespace package; revert lint/typecheck workarounds --- opentelemetry-sdk-configuration/.pylintrc | 40 ------------------- .../src/opentelemetry/sdk/__init__.pyi | 18 --------- .../sdk/_configuration/__init__.py | 4 +- tox.ini | 2 +- 4 files changed, 3 insertions(+), 61 deletions(-) delete mode 100644 opentelemetry-sdk-configuration/.pylintrc delete mode 100644 opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi diff --git a/opentelemetry-sdk-configuration/.pylintrc b/opentelemetry-sdk-configuration/.pylintrc deleted file mode 100644 index 35a27210ba7..00000000000 --- a/opentelemetry-sdk-configuration/.pylintrc +++ /dev/null @@ -1,40 +0,0 @@ -# Pylint config for opentelemetry-sdk-configuration. Extends the repo root -# `.pylintrc` (which pylint discovers by walking upward from each file) and -# adds disables that only apply to this package. -# -# `opentelemetry-sdk-configuration` extends the `opentelemetry.sdk.*` -# namespace owned by `opentelemetry-sdk`. At runtime PEP 420 namespace -# package merging makes `opentelemetry.sdk.configuration.*` resolvable, but -# astroid (pylint's resolver) does not follow editable-install namespace -# extensions across separate distributions, so it reports false positive -# `import-error` / `no-name-in-module` on every import that crosses the -# package boundary. These two messages are silenced for this package only. - -[MASTER] -# Skip the codegen'd models.py (datamodel-code-generator output). -ignore-patterns=^models\.py$ -# Run with multiple processes. -jobs=0 -# Match the global pylintrc's no-self-use extension. -load-plugins=pylint.extensions.no_self_use - -[MESSAGES CONTROL] -disable=missing-docstring, - fixme, - too-few-public-methods, - too-many-instance-attributes, - too-many-arguments, - too-many-positional-arguments, - duplicate-code, - ungrouped-imports, - wrong-import-order, - line-too-long, - exec-used, - super-with-arguments, - isinstance-second-argument-not-valid-type, - raise-missing-from, - unused-argument, - redefined-builtin, - cyclic-import, - import-error, - no-name-in-module, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi b/opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi deleted file mode 100644 index e57edc0f58b..00000000000 --- a/opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -The OpenTelemetry SDK package is an implementation of the OpenTelemetry -API -""" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index d9eb5cdbc0d..13e183c3a83 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -727,8 +727,8 @@ def _configure(self, **kwargs): # SDK has no runtime dependency on it; users who don't set # ``OTEL_CONFIG_FILE`` never pay the import cost. try: - # pylint: disable=import-outside-toplevel,no-name-in-module - from opentelemetry.sdk.configuration import ( # type: ignore[import-not-found] # noqa: PLC0415 + # pylint: disable=import-outside-toplevel + from opentelemetry.sdk.configuration import ( # noqa: PLC0415 configure_sdk, load_config_file, ) diff --git a/tox.ini b/tox.ini index bb6dda5d4fb..8aa7f304bd0 100644 --- a/tox.ini +++ b/tox.ini @@ -232,7 +232,7 @@ commands = benchmark-opentelemetry-sdk: pytest {toxinidir}/opentelemetry-sdk/benchmarks --benchmark-json={toxinidir}/opentelemetry-sdk/sdk-benchmark.json {posargs} test-opentelemetry-sdk-configuration: pytest {toxinidir}/opentelemetry-sdk-configuration/tests {posargs} - lint-opentelemetry-sdk-configuration: pylint --rcfile={toxinidir}/opentelemetry-sdk-configuration/.pylintrc {toxinidir}/opentelemetry-sdk-configuration + lint-opentelemetry-sdk-configuration: pylint {toxinidir}/opentelemetry-sdk-configuration test-opentelemetry-proto-gen: pytest {toxinidir}/opentelemetry-proto/tests {posargs} lint-opentelemetry-proto-gen: pylint {toxinidir}/opentelemetry-proto From ac255fec048765f401314558c4a11ef8937ed11f Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Fri, 26 Jun 2026 12:26:01 +0100 Subject: [PATCH 09/14] =?UTF-8?q?rename=20opentelemetry-sdk-configuration?= =?UTF-8?q?=20=E2=86=92=20opentelemetry-configuration=20(module=20path=20o?= =?UTF-8?q?pentelemetry.configuration);=20restore=20sdk=20=5F=5Finit=5F=5F?= =?UTF-8?q?.pyi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changelog/5356.changed | 2 +- .github/workflows/lint.yml | 6 +- .github/workflows/test.yml | 84 +++++++++---------- docs/examples/declarative-config/README.rst | 2 +- docs/sdk/configuration.rst | 2 +- .../README.rst | 8 +- .../codegen/README.md | 2 +- .../codegen/dataclass.jinja2 | 0 .../pyproject.toml | 8 +- .../opentelemetry}/configuration/README.md | 6 +- .../opentelemetry}/configuration/__init__.py | 12 +-- .../opentelemetry}/configuration/_common.py | 2 +- .../configuration/_conversion.py | 0 .../configuration/_exceptions.py | 0 .../configuration/_logger_provider.py | 20 ++--- .../configuration/_meter_provider.py | 34 ++++---- .../configuration/_propagator.py | 6 +- .../opentelemetry}/configuration/_resource.py | 6 +- .../src/opentelemetry}/configuration/_sdk.py | 14 ++-- .../configuration/_tracer_provider.py | 28 +++---- .../configuration/file/__init__.py | 20 ++--- .../configuration/file/_env_substitution.py | 0 .../configuration/file/_loader.py | 10 +-- .../opentelemetry}/configuration/models.py | 2 +- .../opentelemetry}/configuration/schema.json | 0 .../configuration/version/__init__.py | 0 .../test-requirements.txt | 2 +- .../tests/__init__.py | 0 .../tests/file/__init__.py | 0 .../tests/file/data/config_with_env_vars.yaml | 0 .../tests/file/data/invalid_yaml.yaml | 0 .../tests/file/data/minimal_config.json | 0 .../tests/file/data/minimal_config.yaml | 0 .../tests/file/test_env_substitution.py | 2 +- .../tests/file/test_loader.py | 16 ++-- .../tests/test_common.py | 20 ++--- .../tests/test_conversion.py | 6 +- .../tests/test_logger_provider.py | 32 +++---- .../tests/test_meter_provider.py | 54 ++++++------ .../tests/test_models.py | 2 +- .../tests/test_propagator.py | 36 ++++---- .../tests/test_resource.py | 20 ++--- .../tests/test_sdk.py | 48 +++++------ .../tests/test_tracer_provider.py | 54 ++++++------ .../src/opentelemetry/sdk/__init__.pyi | 18 ++++ .../sdk/_configuration/__init__.py | 8 +- .../test_configurator_file_routing.py | 16 ++-- pyproject.toml | 16 ++-- tox.ini | 14 ++-- uv.lock | 46 +++++----- 50 files changed, 351 insertions(+), 333 deletions(-) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/README.rst (82%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/codegen/README.md (88%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/codegen/dataclass.jinja2 (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/pyproject.toml (83%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/README.md (71%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/__init__.py (73%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_common.py (99%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_conversion.py (100%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_exceptions.py (100%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_logger_provider.py (94%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_meter_provider.py (95%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_propagator.py (95%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_resource.py (97%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_sdk.py (79%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/_tracer_provider.py (95%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/file/__init__.py (60%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/file/_env_substitution.py (100%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/file/_loader.py (95%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/models.py (99%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/schema.json (100%) rename {opentelemetry-sdk-configuration/src/opentelemetry/sdk => opentelemetry-configuration/src/opentelemetry}/configuration/version/__init__.py (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/test-requirements.txt (92%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/__init__.py (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/file/__init__.py (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/file/data/config_with_env_vars.yaml (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/file/data/invalid_yaml.yaml (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/file/data/minimal_config.json (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/file/data/minimal_config.yaml (100%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/file/test_env_substitution.py (99%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/file/test_loader.py (96%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_common.py (96%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_conversion.py (94%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_logger_provider.py (94%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_meter_provider.py (95%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_models.py (75%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_propagator.py (89%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_resource.py (97%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_sdk.py (69%) rename {opentelemetry-sdk-configuration => opentelemetry-configuration}/tests/test_tracer_provider.py (94%) create mode 100644 opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi diff --git a/.changelog/5356.changed b/.changelog/5356.changed index a0e26d6e5b0..8c011228192 100644 --- a/.changelog/5356.changed +++ b/.changelog/5356.changed @@ -1 +1 @@ -`opentelemetry-sdk-configuration`: declarative configuration moves from `opentelemetry.sdk._configuration` into the new public `opentelemetry-sdk-configuration` package (`opentelemetry.sdk.configuration` namespace), published experimentally and versioned independently of the SDK. +`opentelemetry-configuration`: declarative configuration moves from `opentelemetry.sdk._configuration` into the new public `opentelemetry-configuration` package (`opentelemetry.configuration` namespace), published experimentally and versioned independently of the SDK. diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3e50fb53d68..f5ee709b14e 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -119,8 +119,8 @@ jobs: - name: Run tests run: tox -e lint-opentelemetry-sdk - lint-opentelemetry-sdk-configuration: - name: opentelemetry-sdk-configuration + lint-opentelemetry-configuration: + name: opentelemetry-configuration runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -136,7 +136,7 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e lint-opentelemetry-sdk-configuration + run: tox -e lint-opentelemetry-configuration lint-opentelemetry-semantic-conventions: name: opentelemetry-semantic-conventions diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 97bba503eb2..1b0657ab7d4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -923,8 +923,8 @@ jobs: - name: Run tests run: tox -e pypy3-test-opentelemetry-sdk -- -ra - py310-test-opentelemetry-sdk-configuration_ubuntu-latest: - name: opentelemetry-sdk-configuration 3.10 Ubuntu + py310-test-opentelemetry-configuration_ubuntu-latest: + name: opentelemetry-configuration 3.10 Ubuntu runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -940,10 +940,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py310-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py310-test-opentelemetry-configuration -- -ra - py311-test-opentelemetry-sdk-configuration_ubuntu-latest: - name: opentelemetry-sdk-configuration 3.11 Ubuntu + py311-test-opentelemetry-configuration_ubuntu-latest: + name: opentelemetry-configuration 3.11 Ubuntu runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -959,10 +959,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py311-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py311-test-opentelemetry-configuration -- -ra - py312-test-opentelemetry-sdk-configuration_ubuntu-latest: - name: opentelemetry-sdk-configuration 3.12 Ubuntu + py312-test-opentelemetry-configuration_ubuntu-latest: + name: opentelemetry-configuration 3.12 Ubuntu runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -978,10 +978,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py312-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py312-test-opentelemetry-configuration -- -ra - py313-test-opentelemetry-sdk-configuration_ubuntu-latest: - name: opentelemetry-sdk-configuration 3.13 Ubuntu + py313-test-opentelemetry-configuration_ubuntu-latest: + name: opentelemetry-configuration 3.13 Ubuntu runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -997,10 +997,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py313-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py313-test-opentelemetry-configuration -- -ra - py314-test-opentelemetry-sdk-configuration_ubuntu-latest: - name: opentelemetry-sdk-configuration 3.14 Ubuntu + py314-test-opentelemetry-configuration_ubuntu-latest: + name: opentelemetry-configuration 3.14 Ubuntu runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -1016,10 +1016,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py314-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py314-test-opentelemetry-configuration -- -ra - py314t-test-opentelemetry-sdk-configuration_ubuntu-latest: - name: opentelemetry-sdk-configuration 3.14t Ubuntu + py314t-test-opentelemetry-configuration_ubuntu-latest: + name: opentelemetry-configuration 3.14t Ubuntu runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -1035,10 +1035,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py314t-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py314t-test-opentelemetry-configuration -- -ra - pypy3-test-opentelemetry-sdk-configuration_ubuntu-latest: - name: opentelemetry-sdk-configuration pypy-3.10 Ubuntu + pypy3-test-opentelemetry-configuration_ubuntu-latest: + name: opentelemetry-configuration pypy-3.10 Ubuntu runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -1054,7 +1054,7 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e pypy3-test-opentelemetry-sdk-configuration -- -ra + run: tox -e pypy3-test-opentelemetry-configuration -- -ra py310-test-opentelemetry-semantic-conventions_ubuntu-latest: name: opentelemetry-semantic-conventions 3.10 Ubuntu @@ -4622,8 +4622,8 @@ jobs: - name: Run tests run: tox -e pypy3-test-opentelemetry-sdk -- -ra - py310-test-opentelemetry-sdk-configuration_windows-latest: - name: opentelemetry-sdk-configuration 3.10 Windows + py310-test-opentelemetry-configuration_windows-latest: + name: opentelemetry-configuration 3.10 Windows runs-on: windows-latest timeout-minutes: 30 steps: @@ -4641,10 +4641,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py310-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py310-test-opentelemetry-configuration -- -ra - py311-test-opentelemetry-sdk-configuration_windows-latest: - name: opentelemetry-sdk-configuration 3.11 Windows + py311-test-opentelemetry-configuration_windows-latest: + name: opentelemetry-configuration 3.11 Windows runs-on: windows-latest timeout-minutes: 30 steps: @@ -4662,10 +4662,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py311-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py311-test-opentelemetry-configuration -- -ra - py312-test-opentelemetry-sdk-configuration_windows-latest: - name: opentelemetry-sdk-configuration 3.12 Windows + py312-test-opentelemetry-configuration_windows-latest: + name: opentelemetry-configuration 3.12 Windows runs-on: windows-latest timeout-minutes: 30 steps: @@ -4683,10 +4683,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py312-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py312-test-opentelemetry-configuration -- -ra - py313-test-opentelemetry-sdk-configuration_windows-latest: - name: opentelemetry-sdk-configuration 3.13 Windows + py313-test-opentelemetry-configuration_windows-latest: + name: opentelemetry-configuration 3.13 Windows runs-on: windows-latest timeout-minutes: 30 steps: @@ -4704,10 +4704,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py313-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py313-test-opentelemetry-configuration -- -ra - py314-test-opentelemetry-sdk-configuration_windows-latest: - name: opentelemetry-sdk-configuration 3.14 Windows + py314-test-opentelemetry-configuration_windows-latest: + name: opentelemetry-configuration 3.14 Windows runs-on: windows-latest timeout-minutes: 30 steps: @@ -4725,10 +4725,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py314-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py314-test-opentelemetry-configuration -- -ra - py314t-test-opentelemetry-sdk-configuration_windows-latest: - name: opentelemetry-sdk-configuration 3.14t Windows + py314t-test-opentelemetry-configuration_windows-latest: + name: opentelemetry-configuration 3.14t Windows runs-on: windows-latest timeout-minutes: 30 steps: @@ -4746,10 +4746,10 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e py314t-test-opentelemetry-sdk-configuration -- -ra + run: tox -e py314t-test-opentelemetry-configuration -- -ra - pypy3-test-opentelemetry-sdk-configuration_windows-latest: - name: opentelemetry-sdk-configuration pypy-3.10 Windows + pypy3-test-opentelemetry-configuration_windows-latest: + name: opentelemetry-configuration pypy-3.10 Windows runs-on: windows-latest timeout-minutes: 30 steps: @@ -4767,7 +4767,7 @@ jobs: run: pip install tox-uv - name: Run tests - run: tox -e pypy3-test-opentelemetry-sdk-configuration -- -ra + run: tox -e pypy3-test-opentelemetry-configuration -- -ra py310-test-opentelemetry-semantic-conventions_windows-latest: name: opentelemetry-semantic-conventions 3.10 Windows diff --git a/docs/examples/declarative-config/README.rst b/docs/examples/declarative-config/README.rst index 90f6efa018f..fe327f1a9b3 100644 --- a/docs/examples/declarative-config/README.rst +++ b/docs/examples/declarative-config/README.rst @@ -20,7 +20,7 @@ and the OTLP/HTTP exporter: .. code-block:: sh - pip install opentelemetry-sdk-configuration \ + pip install opentelemetry-configuration \ opentelemetry-distro \ opentelemetry-exporter-otlp-proto-http diff --git a/docs/sdk/configuration.rst b/docs/sdk/configuration.rst index ee5d8917146..851691ce3eb 100644 --- a/docs/sdk/configuration.rst +++ b/docs/sdk/configuration.rst @@ -25,7 +25,7 @@ Declarative configuration lives in a separate, experimental package: .. code-block:: sh - pip install opentelemetry-sdk-configuration + pip install opentelemetry-configuration Enabling with an environment variable ------------------------------------- diff --git a/opentelemetry-sdk-configuration/README.rst b/opentelemetry-configuration/README.rst similarity index 82% rename from opentelemetry-sdk-configuration/README.rst rename to opentelemetry-configuration/README.rst index d6a73c2f774..f571a4af9f4 100644 --- a/opentelemetry-sdk-configuration/README.rst +++ b/opentelemetry-configuration/README.rst @@ -3,8 +3,8 @@ OpenTelemetry Python SDK Declarative Configuration |pypi| -.. |pypi| image:: https://badge.fury.io/py/opentelemetry-sdk-configuration.svg - :target: https://pypi.org/project/opentelemetry-sdk-configuration/ +.. |pypi| image:: https://badge.fury.io/py/opentelemetry-configuration.svg + :target: https://pypi.org/project/opentelemetry-configuration/ .. warning:: @@ -25,7 +25,7 @@ For programmatic use: .. code-block:: python - from opentelemetry.sdk.configuration import configure_sdk, load_config_file + from opentelemetry.configuration import configure_sdk, load_config_file config = load_config_file("otel-config.yaml") configure_sdk(config) @@ -35,7 +35,7 @@ Installation :: - pip install opentelemetry-sdk-configuration + pip install opentelemetry-configuration References ---------- diff --git a/opentelemetry-sdk-configuration/codegen/README.md b/opentelemetry-configuration/codegen/README.md similarity index 88% rename from opentelemetry-sdk-configuration/codegen/README.md rename to opentelemetry-configuration/codegen/README.md index e8d35373057..73b008a2633 100644 --- a/opentelemetry-sdk-configuration/codegen/README.md +++ b/opentelemetry-configuration/codegen/README.md @@ -21,4 +21,4 @@ tox -e generate-config-from-jsonschema The template directory is configured in `pyproject.toml` under `[tool.datamodel-codegen]`. -See `opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md` for the full schema update workflow. +See `opentelemetry-configuration/src/opentelemetry/configuration/README.md` for the full schema update workflow. diff --git a/opentelemetry-sdk-configuration/codegen/dataclass.jinja2 b/opentelemetry-configuration/codegen/dataclass.jinja2 similarity index 100% rename from opentelemetry-sdk-configuration/codegen/dataclass.jinja2 rename to opentelemetry-configuration/codegen/dataclass.jinja2 diff --git a/opentelemetry-sdk-configuration/pyproject.toml b/opentelemetry-configuration/pyproject.toml similarity index 83% rename from opentelemetry-sdk-configuration/pyproject.toml rename to opentelemetry-configuration/pyproject.toml index bd70ed27e7b..04555c50718 100644 --- a/opentelemetry-sdk-configuration/pyproject.toml +++ b/opentelemetry-configuration/pyproject.toml @@ -3,9 +3,9 @@ requires = ["hatchling"] build-backend = "hatchling.build" [project] -name = "opentelemetry-sdk-configuration" +name = "opentelemetry-configuration" dynamic = ["version"] -description = "OpenTelemetry Python SDK Declarative Configuration (experimental)" +description = "OpenTelemetry Python Declarative Configuration (experimental)" readme = "README.rst" license = "Apache-2.0" requires-python = ">=3.10" @@ -34,11 +34,11 @@ dependencies = [ ] [project.urls] -Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-sdk-configuration" +Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-configuration" Repository = "https://github.com/open-telemetry/opentelemetry-python" [tool.hatch.version] -path = "src/opentelemetry/sdk/configuration/version/__init__.py" +path = "src/opentelemetry/configuration/version/__init__.py" [tool.hatch.build.targets.sdist] include = [ diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md b/opentelemetry-configuration/src/opentelemetry/configuration/README.md similarity index 71% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md rename to opentelemetry-configuration/src/opentelemetry/configuration/README.md index d4f92a3dadb..516a7352954 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/README.md +++ b/opentelemetry-configuration/src/opentelemetry/configuration/README.md @@ -5,11 +5,11 @@ This package implements [OpenTelemetry file-based configuration](https://opentel ## Files - `schema.json`: vendored copy of the [OpenTelemetry configuration JSON schema](https://github.com/open-telemetry/opentelemetry-configuration) -- `models.py`: Python dataclasses generated from `schema.json` by [datamodel-code-generator](https://github.com/koxudaxi/datamodel-code-generator), using a custom template from `opentelemetry-sdk-configuration/codegen/` (see that directory's README for details) +- `models.py`: Python dataclasses generated from `schema.json` by [datamodel-code-generator](https://github.com/koxudaxi/datamodel-code-generator), using a custom template from `opentelemetry-configuration/codegen/` (see that directory's README for details) ## Updating the schema -1. Pick the desired release tag from the [opentelemetry-configuration releases](https://github.com/open-telemetry/opentelemetry-configuration/releases) and overwrite `opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json` with the `opentelemetry_configuration.json` published on that release. +1. Pick the desired release tag from the [opentelemetry-configuration releases](https://github.com/open-telemetry/opentelemetry-configuration/releases) and overwrite `opentelemetry-configuration/src/opentelemetry/configuration/schema.json` with the `opentelemetry_configuration.json` published on that release. 2. Regenerate `models.py`: @@ -20,5 +20,5 @@ This package implements [OpenTelemetry file-based configuration](https://opentel 3. Update any version string references in tests and source: ```sh - grep -r "OLD_VERSION" opentelemetry-sdk-configuration/ + grep -r "OLD_VERSION" opentelemetry-configuration/ ``` diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py b/opentelemetry-configuration/src/opentelemetry/configuration/__init__.py similarity index 73% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py rename to opentelemetry-configuration/src/opentelemetry/configuration/__init__.py index 2dad25a1a92..934987fb7bd 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/__init__.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/__init__.py @@ -12,7 +12,7 @@ variable, which the SDK's configurator picks up automatically. For programmatic use: ->>> from opentelemetry.sdk.configuration import ( +>>> from opentelemetry.configuration import ( ... load_config_file, configure_sdk, ... ) >>> config = load_config_file("otel-config.yaml") @@ -20,7 +20,7 @@ Construct a configuration programmatically and apply it: ->>> from opentelemetry.sdk.configuration import ( +>>> from opentelemetry.configuration import ( ... OpenTelemetryConfiguration, configure_sdk, ... ) >>> configure_sdk(OpenTelemetryConfiguration(file_format="1.0-rc.1")) @@ -29,10 +29,10 @@ behaviour may change between minor versions. """ -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration._sdk import configure_sdk -from opentelemetry.sdk.configuration.file._loader import load_config_file -from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration._sdk import configure_sdk +from opentelemetry.configuration.file._loader import load_config_file +from opentelemetry.configuration.models import OpenTelemetryConfiguration __all__ = [ "ConfigurationError", diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_common.py b/opentelemetry-configuration/src/opentelemetry/configuration/_common.py similarity index 99% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_common.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_common.py index 6b105ec6796..73fc0f9d0c5 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_common.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_common.py @@ -10,7 +10,7 @@ from typing import Any, Protocol from urllib.parse import urlparse -from opentelemetry.sdk.configuration._exceptions import ConfigurationError +from opentelemetry.configuration._exceptions import ConfigurationError from opentelemetry.util._importlib_metadata import entry_points _logger = logging.getLogger(__name__) diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_conversion.py b/opentelemetry-configuration/src/opentelemetry/configuration/_conversion.py similarity index 100% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_conversion.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_conversion.py diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_exceptions.py b/opentelemetry-configuration/src/opentelemetry/configuration/_exceptions.py similarity index 100% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_exceptions.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_exceptions.py diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_logger_provider.py b/opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py similarity index 94% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_logger_provider.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py index 73b0b00575f..31efa8afb28 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_logger_provider.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py @@ -6,35 +6,35 @@ import logging from opentelemetry._logs import set_logger_provider -from opentelemetry.sdk.configuration._common import ( +from opentelemetry.configuration._common import ( _map_compression, _parse_headers, _parse_otlp_file_output_stream, load_entry_point, ) -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration.models import ( BatchLogRecordProcessor as BatchLogRecordProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalOtlpFileExporter as ExperimentalOtlpFileExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( LoggerProvider as LoggerProviderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( LogRecordExporter as LogRecordExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( LogRecordProcessor as LogRecordProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SimpleLogRecordProcessor as SimpleLogRecordProcessorConfig, ) from opentelemetry.sdk._logs import LoggerProvider diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_meter_provider.py b/opentelemetry-configuration/src/opentelemetry/configuration/_meter_provider.py similarity index 95% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_meter_provider.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_meter_provider.py index bf163b88c1c..70ddf65e21b 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_meter_provider.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_meter_provider.py @@ -6,58 +6,58 @@ import logging from opentelemetry import metrics -from opentelemetry.sdk.configuration._common import ( +from opentelemetry.configuration._common import ( _map_compression, _parse_headers, _parse_otlp_file_output_stream, load_entry_point, ) -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration.models import ( Aggregation as AggregationConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ConsoleMetricExporter as ConsoleMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExemplarFilter as ExemplarFilterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalOtlpFileMetricExporter as ExperimentalOtlpFileMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalPrometheusMetricExporter as PrometheusMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, InstrumentType, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( MeterProvider as MeterProviderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( MetricReader as MetricReaderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpGrpcMetricExporter as OtlpGrpcMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpHttpMetricExporter as OtlpHttpMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PeriodicMetricReader as PeriodicMetricReaderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PullMetricExporter as PullMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PullMetricReader as PullMetricReaderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PushMetricExporter as PushMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( View as ViewConfig, ) from opentelemetry.sdk.metrics import ( diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_propagator.py b/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py similarity index 95% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_propagator.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py index 9c161ce9703..7e5d687218c 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_propagator.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py @@ -7,11 +7,11 @@ from opentelemetry.propagate import set_global_textmap from opentelemetry.propagators.composite import CompositePropagator from opentelemetry.propagators.textmap import TextMapPropagator -from opentelemetry.sdk.configuration._common import load_entry_point -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._common import load_entry_point +from opentelemetry.configuration.models import ( Propagator as PropagatorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( TextMapPropagator as TextMapPropagatorConfig, ) from opentelemetry.trace.propagation.tracecontext import ( diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_resource.py b/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py similarity index 97% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_resource.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_resource.py index b747778ef76..e903f191bb5 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_resource.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py @@ -11,14 +11,14 @@ from typing import Any from urllib import parse -from opentelemetry.sdk.configuration._common import load_entry_point -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._common import load_entry_point +from opentelemetry.configuration.models import ( AttributeNameValue, AttributeType, ExperimentalResourceDetector, IncludeExclude, ) -from opentelemetry.sdk.configuration.models import Resource as ResourceConfig +from opentelemetry.configuration.models import Resource as ResourceConfig from opentelemetry.sdk.resources import ( _DEFAULT_RESOURCE, OTEL_SERVICE_NAME, diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_sdk.py b/opentelemetry-configuration/src/opentelemetry/configuration/_sdk.py similarity index 79% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_sdk.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_sdk.py index 6c637078db8..0a3a9eaed37 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_sdk.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_sdk.py @@ -12,18 +12,18 @@ import logging -from opentelemetry.sdk.configuration._logger_provider import ( +from opentelemetry.configuration._logger_provider import ( configure_logger_provider, ) -from opentelemetry.sdk.configuration._meter_provider import ( +from opentelemetry.configuration._meter_provider import ( configure_meter_provider, ) -from opentelemetry.sdk.configuration._propagator import configure_propagator -from opentelemetry.sdk.configuration._resource import create_resource -from opentelemetry.sdk.configuration._tracer_provider import ( +from opentelemetry.configuration._propagator import configure_propagator +from opentelemetry.configuration._resource import create_resource +from opentelemetry.configuration._tracer_provider import ( configure_tracer_provider, ) -from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration +from opentelemetry.configuration.models import OpenTelemetryConfiguration _logger = logging.getLogger(__name__) @@ -45,7 +45,7 @@ def configure_sdk(config: OpenTelemetryConfiguration) -> None: ``load_config_file``). Example: - >>> from opentelemetry.sdk.configuration.file import ( + >>> from opentelemetry.configuration.file import ( ... load_config_file, configure_sdk, ... ) >>> config = load_config_file("otel-config.yaml") diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_tracer_provider.py b/opentelemetry-configuration/src/opentelemetry/configuration/_tracer_provider.py similarity index 95% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_tracer_provider.py rename to opentelemetry-configuration/src/opentelemetry/configuration/_tracer_provider.py index c713a0273ca..12e71821f96 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/_tracer_provider.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_tracer_provider.py @@ -6,47 +6,47 @@ import logging from opentelemetry import trace -from opentelemetry.sdk.configuration._common import ( +from opentelemetry.configuration._common import ( _map_compression, _parse_headers, _parse_otlp_file_output_stream, load_entry_point, ) -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration.models import ( ExperimentalComposableRuleBasedSampler as RuleBasedSamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableRuleBasedSamplerRule as RuleBasedSamplerRuleConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableSampler as ComposableSamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalOtlpFileExporter as ExperimentalOtlpFileExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ParentBasedSampler as ParentBasedSamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( Sampler as SamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanExporter as SpanExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanLimits as SpanLimitsConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.resources import Resource diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/__init__.py b/opentelemetry-configuration/src/opentelemetry/configuration/file/__init__.py similarity index 60% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/__init__.py rename to opentelemetry-configuration/src/opentelemetry/configuration/file/__init__.py index 498821328df..7f847ea7962 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/__init__.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/file/__init__.py @@ -7,36 +7,36 @@ using declarative configuration files (YAML or JSON). Example: - >>> from opentelemetry.sdk.configuration.file import load_config_file + >>> from opentelemetry.configuration.file import load_config_file >>> config = load_config_file("otel-config.yaml") >>> print(config.file_format) '1.0' """ -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration._logger_provider import ( +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration._logger_provider import ( configure_logger_provider, create_logger_provider, ) -from opentelemetry.sdk.configuration._meter_provider import ( +from opentelemetry.configuration._meter_provider import ( configure_meter_provider, create_meter_provider, ) -from opentelemetry.sdk.configuration._propagator import ( +from opentelemetry.configuration._propagator import ( configure_propagator, create_propagator, ) -from opentelemetry.sdk.configuration._resource import create_resource -from opentelemetry.sdk.configuration._sdk import configure_sdk -from opentelemetry.sdk.configuration._tracer_provider import ( +from opentelemetry.configuration._resource import create_resource +from opentelemetry.configuration._sdk import configure_sdk +from opentelemetry.configuration._tracer_provider import ( configure_tracer_provider, create_tracer_provider, ) -from opentelemetry.sdk.configuration.file._env_substitution import ( +from opentelemetry.configuration.file._env_substitution import ( EnvSubstitutionError, substitute_env_vars, ) -from opentelemetry.sdk.configuration.file._loader import load_config_file +from opentelemetry.configuration.file._loader import load_config_file __all__ = [ "load_config_file", diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_env_substitution.py b/opentelemetry-configuration/src/opentelemetry/configuration/file/_env_substitution.py similarity index 100% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_env_substitution.py rename to opentelemetry-configuration/src/opentelemetry/configuration/file/_env_substitution.py diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py b/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py similarity index 95% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py rename to opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py index 9806a87f58f..232c00dcae3 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/file/_loader.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py @@ -13,12 +13,12 @@ import jsonschema import yaml -from opentelemetry.sdk.configuration._conversion import _dict_to_dataclass -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration.file._env_substitution import ( +from opentelemetry.configuration._conversion import _dict_to_dataclass +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration.file._env_substitution import ( substitute_env_vars, ) -from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration +from opentelemetry.configuration.models import OpenTelemetryConfiguration # Schema version vendored in schema.json. ``file_format`` values are accepted # per the configuration spec's versioning rules: the major version must match, @@ -34,7 +34,7 @@ def _get_schema() -> dict: if not _schema_cache: schema_path = ( - importlib.resources.files("opentelemetry.sdk.configuration") + importlib.resources.files("opentelemetry.configuration") / "schema.json" ) _schema_cache.append( diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py b/opentelemetry-configuration/src/opentelemetry/configuration/models.py similarity index 99% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py rename to opentelemetry-configuration/src/opentelemetry/configuration/models.py index 34b63ff8a51..4a0b9521dac 100644 --- a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/models.py @@ -8,7 +8,7 @@ from enum import Enum from typing import Any, ClassVar, TypeAlias -from opentelemetry.sdk.configuration._common import _additional_properties +from opentelemetry.configuration._common import _additional_properties AlwaysOffSampler: TypeAlias = dict[str, Any] | None diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json b/opentelemetry-configuration/src/opentelemetry/configuration/schema.json similarity index 100% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json rename to opentelemetry-configuration/src/opentelemetry/configuration/schema.json diff --git a/opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/version/__init__.py b/opentelemetry-configuration/src/opentelemetry/configuration/version/__init__.py similarity index 100% rename from opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/version/__init__.py rename to opentelemetry-configuration/src/opentelemetry/configuration/version/__init__.py diff --git a/opentelemetry-sdk-configuration/test-requirements.txt b/opentelemetry-configuration/test-requirements.txt similarity index 92% rename from opentelemetry-sdk-configuration/test-requirements.txt rename to opentelemetry-configuration/test-requirements.txt index 9c6b9a24d51..556a43f63ca 100644 --- a/opentelemetry-sdk-configuration/test-requirements.txt +++ b/opentelemetry-configuration/test-requirements.txt @@ -18,4 +18,4 @@ zipp==3.19.2 -e tests/opentelemetry-test-utils -e opentelemetry-semantic-conventions -e opentelemetry-sdk --e opentelemetry-sdk-configuration +-e opentelemetry-configuration diff --git a/opentelemetry-sdk-configuration/tests/__init__.py b/opentelemetry-configuration/tests/__init__.py similarity index 100% rename from opentelemetry-sdk-configuration/tests/__init__.py rename to opentelemetry-configuration/tests/__init__.py diff --git a/opentelemetry-sdk-configuration/tests/file/__init__.py b/opentelemetry-configuration/tests/file/__init__.py similarity index 100% rename from opentelemetry-sdk-configuration/tests/file/__init__.py rename to opentelemetry-configuration/tests/file/__init__.py diff --git a/opentelemetry-sdk-configuration/tests/file/data/config_with_env_vars.yaml b/opentelemetry-configuration/tests/file/data/config_with_env_vars.yaml similarity index 100% rename from opentelemetry-sdk-configuration/tests/file/data/config_with_env_vars.yaml rename to opentelemetry-configuration/tests/file/data/config_with_env_vars.yaml diff --git a/opentelemetry-sdk-configuration/tests/file/data/invalid_yaml.yaml b/opentelemetry-configuration/tests/file/data/invalid_yaml.yaml similarity index 100% rename from opentelemetry-sdk-configuration/tests/file/data/invalid_yaml.yaml rename to opentelemetry-configuration/tests/file/data/invalid_yaml.yaml diff --git a/opentelemetry-sdk-configuration/tests/file/data/minimal_config.json b/opentelemetry-configuration/tests/file/data/minimal_config.json similarity index 100% rename from opentelemetry-sdk-configuration/tests/file/data/minimal_config.json rename to opentelemetry-configuration/tests/file/data/minimal_config.json diff --git a/opentelemetry-sdk-configuration/tests/file/data/minimal_config.yaml b/opentelemetry-configuration/tests/file/data/minimal_config.yaml similarity index 100% rename from opentelemetry-sdk-configuration/tests/file/data/minimal_config.yaml rename to opentelemetry-configuration/tests/file/data/minimal_config.yaml diff --git a/opentelemetry-sdk-configuration/tests/file/test_env_substitution.py b/opentelemetry-configuration/tests/file/test_env_substitution.py similarity index 99% rename from opentelemetry-sdk-configuration/tests/file/test_env_substitution.py rename to opentelemetry-configuration/tests/file/test_env_substitution.py index bbcdfd4f34b..14c79f20fd5 100644 --- a/opentelemetry-sdk-configuration/tests/file/test_env_substitution.py +++ b/opentelemetry-configuration/tests/file/test_env_substitution.py @@ -7,7 +7,7 @@ import yaml -from opentelemetry.sdk.configuration.file import ( +from opentelemetry.configuration.file import ( EnvSubstitutionError, substitute_env_vars, ) diff --git a/opentelemetry-sdk-configuration/tests/file/test_loader.py b/opentelemetry-configuration/tests/file/test_loader.py similarity index 96% rename from opentelemetry-sdk-configuration/tests/file/test_loader.py rename to opentelemetry-configuration/tests/file/test_loader.py index 646fa3059b4..c9dcbee8e67 100644 --- a/opentelemetry-sdk-configuration/tests/file/test_loader.py +++ b/opentelemetry-configuration/tests/file/test_loader.py @@ -7,24 +7,24 @@ from pathlib import Path from unittest.mock import patch -from opentelemetry.sdk.configuration._tracer_provider import ( +from opentelemetry.configuration._tracer_provider import ( create_tracer_provider, ) -from opentelemetry.sdk.configuration.file import ( +from opentelemetry.configuration.file import ( ConfigurationError, load_config_file, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( BatchSpanProcessor as BatchSpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import OpenTelemetryConfiguration -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import OpenTelemetryConfiguration +from opentelemetry.configuration.models import ( ParentBasedSampler as ParentBasedSamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.trace import TracerProvider as SdkTracerProvider @@ -348,7 +348,7 @@ def test_pre_release_meta_tag_is_accepted(self): def test_newer_minor_is_accepted_with_warning(self): with self.assertLogs( - "opentelemetry.sdk.configuration.file._loader", level="WARNING" + "opentelemetry.configuration.file._loader", level="WARNING" ) as logs: config = self._load("1.1") self.assertEqual(config.file_format, "1.1") diff --git a/opentelemetry-sdk-configuration/tests/test_common.py b/opentelemetry-configuration/tests/test_common.py similarity index 96% rename from opentelemetry-sdk-configuration/tests/test_common.py rename to opentelemetry-configuration/tests/test_common.py index 85be2c99f17..b4a9cc4745e 100644 --- a/opentelemetry-sdk-configuration/tests/test_common.py +++ b/opentelemetry-configuration/tests/test_common.py @@ -8,7 +8,7 @@ from typing import Any, ClassVar from unittest.mock import MagicMock, patch -from opentelemetry.sdk.configuration._common import ( +from opentelemetry.configuration._common import ( _additional_properties, _map_compression, _parse_headers, @@ -16,8 +16,8 @@ _resolve_component, load_entry_point, ) -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration.models import ( ExperimentalResourceDetector, LogRecordExporter, PushMetricExporter, @@ -96,7 +96,7 @@ def test_returns_loaded_class(self): mock_ep = MagicMock() mock_ep.load.return_value = mock_class with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): result = load_entry_point("some_group", "some_name") @@ -104,7 +104,7 @@ def test_returns_loaded_class(self): def test_raises_when_not_found(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError) as ctx: @@ -116,7 +116,7 @@ def test_wraps_load_exception_in_configuration_error(self): mock_ep = MagicMock() mock_ep.load.side_effect = ImportError("bad import") with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): with self.assertRaises(ConfigurationError) as ctx: @@ -131,7 +131,7 @@ def test_instantiation_error_not_wrapped(self): mock_ep = MagicMock() mock_ep.load.return_value = mock_class with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): cls = load_entry_point("some_group", "some_name") @@ -406,7 +406,7 @@ def test_resolves_plugin_via_entry_point(self): mock_instance = MagicMock() mock_class = MagicMock(return_value=mock_instance) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -421,7 +421,7 @@ def test_plugin_with_empty_config(self): mock_instance = MagicMock() mock_class = MagicMock(return_value=mock_instance) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -440,7 +440,7 @@ def test_no_component_raises_configuration_error(self): def test_plugin_not_found_raises_configuration_error(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): # pylint: disable=unexpected-keyword-arg diff --git a/opentelemetry-sdk-configuration/tests/test_conversion.py b/opentelemetry-configuration/tests/test_conversion.py similarity index 94% rename from opentelemetry-sdk-configuration/tests/test_conversion.py rename to opentelemetry-configuration/tests/test_conversion.py index 5de38362d13..6ae15c6e648 100644 --- a/opentelemetry-sdk-configuration/tests/test_conversion.py +++ b/opentelemetry-configuration/tests/test_conversion.py @@ -8,9 +8,9 @@ from dataclasses import dataclass from typing import Any, ClassVar -from opentelemetry.sdk.configuration._common import _additional_properties -from opentelemetry.sdk.configuration._conversion import _dict_to_dataclass -from opentelemetry.sdk.configuration.models import ExemplarFilter +from opentelemetry.configuration._common import _additional_properties +from opentelemetry.configuration._conversion import _dict_to_dataclass +from opentelemetry.configuration.models import ExemplarFilter @dataclass diff --git a/opentelemetry-sdk-configuration/tests/test_logger_provider.py b/opentelemetry-configuration/tests/test_logger_provider.py similarity index 94% rename from opentelemetry-sdk-configuration/tests/test_logger_provider.py rename to opentelemetry-configuration/tests/test_logger_provider.py index 076a06ebdfc..4aadcd1a104 100644 --- a/opentelemetry-sdk-configuration/tests/test_logger_provider.py +++ b/opentelemetry-configuration/tests/test_logger_provider.py @@ -9,7 +9,7 @@ from unittest.mock import MagicMock, patch from opentelemetry._logs import get_logger_provider -from opentelemetry.sdk.configuration._logger_provider import ( +from opentelemetry.configuration._logger_provider import ( _DEFAULT_EXPORT_TIMEOUT_MILLIS, _DEFAULT_MAX_EXPORT_BATCH_SIZE, _DEFAULT_MAX_QUEUE_SIZE, @@ -21,35 +21,35 @@ configure_logger_provider, create_logger_provider, ) -from opentelemetry.sdk.configuration.file._loader import ConfigurationError -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.file._loader import ConfigurationError +from opentelemetry.configuration.models import ( BatchLogRecordProcessor as BatchLogRecordProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalOtlpFileExporter as ExperimentalOtlpFileExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( LoggerProvider as LoggerProviderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( LogRecordExporter as LogRecordExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( LogRecordLimits as LogRecordLimitsConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( LogRecordProcessor as LogRecordProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( NameStringValuePair, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SimpleLogRecordProcessor as SimpleLogRecordProcessorConfig, ) from opentelemetry.sdk._logs import LoggerProvider @@ -229,7 +229,7 @@ def test_plugin_log_exporter_loaded_via_entry_point(self): mock_exporter = MagicMock() mock_class = MagicMock(return_value=mock_exporter) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -240,7 +240,7 @@ def test_plugin_log_exporter_loaded_via_entry_point(self): def test_unknown_log_exporter_raises_configuration_error(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): @@ -473,7 +473,7 @@ def test_limits_logs_warning(self): limits=LogRecordLimitsConfig(attribute_count_limit=64), ) with self.assertLogs( - "opentelemetry.sdk.configuration._logger_provider", + "opentelemetry.configuration._logger_provider", level="WARNING", ) as cm: create_logger_provider(config) @@ -486,7 +486,7 @@ def test_limits_logs_warning(self): def test_no_limits_no_warning(): config = LoggerProviderConfig(processors=[]) with patch( - "opentelemetry.sdk.configuration._logger_provider._logger" + "opentelemetry.configuration._logger_provider._logger" ) as mock_logger: create_logger_provider(config) mock_logger.warning.assert_not_called() diff --git a/opentelemetry-sdk-configuration/tests/test_meter_provider.py b/opentelemetry-configuration/tests/test_meter_provider.py similarity index 95% rename from opentelemetry-sdk-configuration/tests/test_meter_provider.py rename to opentelemetry-configuration/tests/test_meter_provider.py index f8dff50ff78..bc9d85d6eb1 100644 --- a/opentelemetry-sdk-configuration/tests/test_meter_provider.py +++ b/opentelemetry-configuration/tests/test_meter_provider.py @@ -9,33 +9,33 @@ import unittest from unittest.mock import MagicMock, patch -from opentelemetry.sdk.configuration._meter_provider import ( +from opentelemetry.configuration._meter_provider import ( configure_meter_provider, create_meter_provider, ) -from opentelemetry.sdk.configuration.file._loader import ConfigurationError -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.file._loader import ConfigurationError +from opentelemetry.configuration.models import ( Aggregation as AggregationConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( Base2ExponentialBucketHistogramAggregation as Base2Config, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ConsoleMetricExporter as ConsoleMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExemplarFilter as ExemplarFilterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalOtlpFileMetricExporter as ExperimentalOtlpFileMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalPrometheusMetricExporter as PrometheusMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExplicitBucketHistogramAggregation as ExplicitBucketConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, IncludeExclude, @@ -43,31 +43,31 @@ ViewSelector, ViewStream, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( MeterProvider as MeterProviderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( MetricReader as MetricReaderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpGrpcMetricExporter as OtlpGrpcMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpHttpMetricExporter as OtlpHttpMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PeriodicMetricReader as PeriodicMetricReaderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PullMetricExporter as PullMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PullMetricReader as PullMetricReaderConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( PushMetricExporter as PushMetricExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( View as ViewConfig, ) from opentelemetry.sdk.metrics import ( @@ -159,7 +159,7 @@ def test_configure_none_does_not_set_global(self): def test_configure_with_config_sets_global(self): config = MeterProviderConfig(readers=[]) with patch( - "opentelemetry.sdk.configuration._meter_provider.metrics.set_meter_provider" + "opentelemetry.configuration._meter_provider.metrics.set_meter_provider" ) as mock_set: configure_meter_provider(config) mock_set.assert_called_once() @@ -516,7 +516,7 @@ def test_pull_plugin_loads_via_entry_point(self): return_value=[MagicMock(**{"load.return_value": mock_class})] ) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", mock_entry_points, ): config = MeterProviderConfig( @@ -541,7 +541,7 @@ def test_pull_plugin_loads_via_entry_point(self): def test_pull_plugin_not_found_raises(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): config = MeterProviderConfig( @@ -579,7 +579,7 @@ def test_pull_producers_warns(self): ] ) with self.assertLogs( - "opentelemetry.sdk.configuration._meter_provider", + "opentelemetry.configuration._meter_provider", level="WARNING", ) as cm: create_meter_provider(config) @@ -605,7 +605,7 @@ def test_pull_cardinality_limits_warns(self): ] ) with self.assertLogs( - "opentelemetry.sdk.configuration._meter_provider", + "opentelemetry.configuration._meter_provider", level="WARNING", ) as cm: create_meter_provider(config) @@ -639,7 +639,7 @@ def test_plugin_metric_exporter_loaded_via_entry_point(self): mock_exporter = MagicMock() mock_class = MagicMock(return_value=mock_exporter) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -651,7 +651,7 @@ def test_plugin_metric_exporter_loaded_via_entry_point(self): def test_unknown_metric_exporter_raises_configuration_error(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): # pylint: disable=unexpected-keyword-arg @@ -886,7 +886,7 @@ def test_stream_attribute_keys_excluded_logs_warning(self): stream_kwargs={"attribute_keys": IncludeExclude(excluded=["key1"])} ) with self.assertLogs( - "opentelemetry.sdk.configuration._meter_provider", level="WARNING" + "opentelemetry.configuration._meter_provider", level="WARNING" ) as log: create_meter_provider(config) self.assertTrue(any("excluded" in msg for msg in log.output)) diff --git a/opentelemetry-sdk-configuration/tests/test_models.py b/opentelemetry-configuration/tests/test_models.py similarity index 75% rename from opentelemetry-sdk-configuration/tests/test_models.py rename to opentelemetry-configuration/tests/test_models.py index a0a7d0f3a76..c83b0b2a8ea 100644 --- a/opentelemetry-sdk-configuration/tests/test_models.py +++ b/opentelemetry-configuration/tests/test_models.py @@ -7,6 +7,6 @@ class TestModelsImport(unittest.TestCase): def test_models_import(self): # pylint: disable=no-self-use """Verify generated models import successfully across all Python versions""" - from opentelemetry.sdk.configuration import ( # pylint: disable=import-outside-toplevel,unused-import + from opentelemetry.configuration import ( # pylint: disable=import-outside-toplevel,unused-import models, # noqa: F401 # type: ignore ) diff --git a/opentelemetry-sdk-configuration/tests/test_propagator.py b/opentelemetry-configuration/tests/test_propagator.py similarity index 89% rename from opentelemetry-sdk-configuration/tests/test_propagator.py rename to opentelemetry-configuration/tests/test_propagator.py index fdeee25f7c6..0aa2b16522c 100644 --- a/opentelemetry-sdk-configuration/tests/test_propagator.py +++ b/opentelemetry-configuration/tests/test_propagator.py @@ -11,15 +11,15 @@ from opentelemetry.baggage.propagation import W3CBaggagePropagator from opentelemetry.environment_variables import OTEL_PROPAGATORS from opentelemetry.propagators.composite import CompositePropagator -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration._propagator import ( +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration._propagator import ( configure_propagator, create_propagator, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( Propagator as PropagatorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( TextMapPropagator as TextMapPropagatorConfig, ) from opentelemetry.trace.propagation.tracecontext import ( @@ -78,7 +78,7 @@ def test_b3_via_entry_point(self): mock_ep.load.return_value = lambda: mock_propagator with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -95,7 +95,7 @@ def test_b3multi_via_entry_point(self): mock_ep.load.return_value = lambda: mock_propagator with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -107,7 +107,7 @@ def test_b3multi_via_entry_point(self): def test_b3_not_installed_raises_configuration_error(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): config = PropagatorConfig( @@ -124,7 +124,7 @@ def test_composite_list_tracecontext(self): mock_ep.load.return_value = lambda: mock_tc with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): result = create_propagator(config) @@ -147,7 +147,7 @@ def fake_entry_points(group, name): return [] with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", side_effect=fake_entry_points, ): config = PropagatorConfig(composite_list="tracecontext,baggage") @@ -171,7 +171,7 @@ def test_composite_list_whitespace_around_names(self): mock_ep.load.return_value = lambda: mock_tc with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig(composite_list=" tracecontext ") @@ -184,7 +184,7 @@ def test_entry_point_load_exception_raises_configuration_error(self): mock_ep.load.side_effect = RuntimeError("package broken") with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig(composite_list="broken-prop") @@ -199,7 +199,7 @@ def test_deduplication_across_composite_and_composite_list(self): mock_ep.load.return_value = lambda: mock_tc with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -218,7 +218,7 @@ def test_deduplication_across_composite_and_composite_list(self): def test_unknown_composite_list_propagator_raises(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): config = PropagatorConfig(composite_list="nonexistent") @@ -231,7 +231,7 @@ def test_plugin_propagator_via_entry_point(self): mock_ep.load.return_value = lambda: mock_propagator with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): config = PropagatorConfig( @@ -247,7 +247,7 @@ def test_plugin_propagator_via_entry_point(self): def test_unknown_composite_propagator_raises(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): config = PropagatorConfig( @@ -263,7 +263,7 @@ def test_unknown_composite_propagator_raises(self): class TestConfigurePropagator(unittest.TestCase): def test_configure_propagator_calls_set_global_textmap(self): with patch( - "opentelemetry.sdk.configuration._propagator.set_global_textmap" + "opentelemetry.configuration._propagator.set_global_textmap" ) as mock_set: configure_propagator(None) mock_set.assert_called_once() @@ -275,7 +275,7 @@ def test_configure_propagator_with_config(self): composite=[TextMapPropagatorConfig(tracecontext={})] ) with patch( - "opentelemetry.sdk.configuration._propagator.set_global_textmap" + "opentelemetry.configuration._propagator.set_global_textmap" ) as mock_set: configure_propagator(config) mock_set.assert_called_once() @@ -290,7 +290,7 @@ def test_otel_propagators_env_var_ignored(self): composite=[TextMapPropagatorConfig(tracecontext={})] ) with patch( - "opentelemetry.sdk.configuration._propagator.set_global_textmap" + "opentelemetry.configuration._propagator.set_global_textmap" ) as mock_set: configure_propagator(config) propagator = mock_set.call_args[0][0] diff --git a/opentelemetry-sdk-configuration/tests/test_resource.py b/opentelemetry-configuration/tests/test_resource.py similarity index 97% rename from opentelemetry-sdk-configuration/tests/test_resource.py rename to opentelemetry-configuration/tests/test_resource.py index 9948d0ca676..3a21872ce12 100644 --- a/opentelemetry-sdk-configuration/tests/test_resource.py +++ b/opentelemetry-configuration/tests/test_resource.py @@ -7,16 +7,16 @@ import unittest from unittest.mock import MagicMock, patch -from opentelemetry.sdk.configuration._exceptions import ConfigurationError -from opentelemetry.sdk.configuration._resource import create_resource -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._exceptions import ConfigurationError +from opentelemetry.configuration._resource import create_resource +from opentelemetry.configuration.models import ( AttributeNameValue, AttributeType, ExperimentalResourceDetection, ExperimentalResourceDetector, IncludeExclude, ) -from opentelemetry.sdk.configuration.models import Resource as ResourceConfig +from opentelemetry.configuration.models import Resource as ResourceConfig from opentelemetry.sdk.resources import ( CONTAINER_ID, HOST_ARCH, @@ -289,7 +289,7 @@ def test_attributes_list_url_decoded(self): def test_attributes_list_invalid_pair_skipped(self): with self.assertLogs( - "opentelemetry.sdk.configuration._resource", level="WARNING" + "opentelemetry.configuration._resource", level="WARNING" ) as cm: config = ResourceConfig(attributes_list="no-equals,foo=bar") resource = create_resource(config) @@ -471,7 +471,7 @@ def test_container_detector_not_run_when_detectors_list_empty(self): def test_container_detector_raises_when_package_missing(self): """ConfigurationError is raised when the contrib entry point is not found.""" with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): @@ -486,7 +486,7 @@ def test_container_detector_uses_contrib_when_available(self): mock_ep.load.return_value = mock_detector with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): resource = create_resource(self._config_with_container()) @@ -510,7 +510,7 @@ def test_explicit_attributes_override_container_detector(self): ), ) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): resource = create_resource(config) @@ -600,7 +600,7 @@ def test_plugin_detector_loaded_via_entry_point(self): ) ) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[mock_ep], ): resource = create_resource(config) @@ -615,7 +615,7 @@ def test_unknown_detector_raises_configuration_error(self): ) ) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): diff --git a/opentelemetry-sdk-configuration/tests/test_sdk.py b/opentelemetry-configuration/tests/test_sdk.py similarity index 69% rename from opentelemetry-sdk-configuration/tests/test_sdk.py rename to opentelemetry-configuration/tests/test_sdk.py index aea4f6e1a92..1637eba8d7f 100644 --- a/opentelemetry-sdk-configuration/tests/test_sdk.py +++ b/opentelemetry-configuration/tests/test_sdk.py @@ -7,26 +7,26 @@ import unittest from unittest.mock import patch -from opentelemetry.sdk.configuration._sdk import configure_sdk -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration._sdk import configure_sdk +from opentelemetry.configuration.models import ( OpenTelemetryConfiguration, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( Propagator as PropagatorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( Resource as ResourceConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SimpleSpanProcessor as SimpleSpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanExporter as SpanExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.trace import TracerProvider as SdkTracerProvider @@ -39,11 +39,11 @@ def _config(**kwargs) -> OpenTelemetryConfiguration: class TestConfigureSdk(unittest.TestCase): - @patch("opentelemetry.sdk.configuration._sdk.configure_propagator") - @patch("opentelemetry.sdk.configuration._sdk.configure_logger_provider") - @patch("opentelemetry.sdk.configuration._sdk.configure_meter_provider") - @patch("opentelemetry.sdk.configuration._sdk.configure_tracer_provider") - @patch("opentelemetry.sdk.configuration._sdk.create_resource") + @patch("opentelemetry.configuration._sdk.configure_propagator") + @patch("opentelemetry.configuration._sdk.configure_logger_provider") + @patch("opentelemetry.configuration._sdk.configure_meter_provider") + @patch("opentelemetry.configuration._sdk.configure_tracer_provider") + @patch("opentelemetry.configuration._sdk.create_resource") # pylint: disable=no-self-use def test_calls_each_signal_with_resource( self, @@ -73,11 +73,11 @@ def test_calls_each_signal_with_resource( mock_logger.assert_called_once_with(None, sentinel_resource) mock_propagator.assert_called_once_with(propagator_cfg) - @patch("opentelemetry.sdk.configuration._sdk.configure_propagator") - @patch("opentelemetry.sdk.configuration._sdk.configure_logger_provider") - @patch("opentelemetry.sdk.configuration._sdk.configure_meter_provider") - @patch("opentelemetry.sdk.configuration._sdk.configure_tracer_provider") - @patch("opentelemetry.sdk.configuration._sdk.create_resource") + @patch("opentelemetry.configuration._sdk.configure_propagator") + @patch("opentelemetry.configuration._sdk.configure_logger_provider") + @patch("opentelemetry.configuration._sdk.configure_meter_provider") + @patch("opentelemetry.configuration._sdk.configure_tracer_provider") + @patch("opentelemetry.configuration._sdk.create_resource") # pylint: disable=no-self-use def test_disabled_skips_everything( self, @@ -100,11 +100,11 @@ def test_disabled_skips_everything( mock_logger.assert_not_called() mock_propagator.assert_not_called() - @patch("opentelemetry.sdk.configuration._sdk.configure_propagator") - @patch("opentelemetry.sdk.configuration._sdk.configure_logger_provider") - @patch("opentelemetry.sdk.configuration._sdk.configure_meter_provider") - @patch("opentelemetry.sdk.configuration._sdk.configure_tracer_provider") - @patch("opentelemetry.sdk.configuration._sdk.create_resource") + @patch("opentelemetry.configuration._sdk.configure_propagator") + @patch("opentelemetry.configuration._sdk.configure_logger_provider") + @patch("opentelemetry.configuration._sdk.configure_meter_provider") + @patch("opentelemetry.configuration._sdk.configure_tracer_provider") + @patch("opentelemetry.configuration._sdk.create_resource") def test_absent_sections_pass_none( self, mock_create_resource, # noqa: ARG002 @@ -126,7 +126,7 @@ class TestConfigureSdkIntegration(unittest.TestCase): """End-to-end: build a real OpenTelemetryConfiguration and apply it.""" @patch( - "opentelemetry.sdk.configuration._tracer_provider.trace.set_tracer_provider" + "opentelemetry.configuration._tracer_provider.trace.set_tracer_provider" ) def test_applies_tracer_provider_globally(self, mock_set_tracer): config = _config( diff --git a/opentelemetry-sdk-configuration/tests/test_tracer_provider.py b/opentelemetry-configuration/tests/test_tracer_provider.py similarity index 94% rename from opentelemetry-sdk-configuration/tests/test_tracer_provider.py rename to opentelemetry-configuration/tests/test_tracer_provider.py index 7ca515ab838..97484358327 100644 --- a/opentelemetry-sdk-configuration/tests/test_tracer_provider.py +++ b/opentelemetry-configuration/tests/test_tracer_provider.py @@ -10,69 +10,69 @@ from unittest.mock import MagicMock, patch from opentelemetry import trace as trace_api -from opentelemetry.sdk.configuration._tracer_provider import ( +from opentelemetry.configuration._tracer_provider import ( configure_tracer_provider, create_tracer_provider, ) -from opentelemetry.sdk.configuration.file._loader import ConfigurationError -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.file._loader import ConfigurationError +from opentelemetry.configuration.models import ( BatchSpanProcessor as BatchSpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableProbabilitySampler as ComposableProbabilityConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableRuleBasedSampler as RuleBasedSamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableRuleBasedSamplerRule as RuleBasedSamplerRuleConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableRuleBasedSamplerRuleAttributePatterns as RuleAttributePatternsConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableRuleBasedSamplerRuleAttributeValues as RuleAttributeValuesConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalComposableSampler as ComposableSamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalOtlpFileExporter as ExperimentalOtlpFileExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ExperimentalSpanParent as SpanParentConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpGrpcExporter as OtlpGrpcExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( OtlpHttpExporter as OtlpHttpExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( ParentBasedSampler as ParentBasedSamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( Sampler as SamplerConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SimpleSpanProcessor as SimpleSpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanExporter as SpanExporterConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanKind as SpanKindConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanLimits as SpanLimitsConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( SpanProcessor as SpanProcessorConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( TraceIdRatioBasedSampler as TraceIdRatioBasedConfig, ) -from opentelemetry.sdk.configuration.models import ( +from opentelemetry.configuration.models import ( TracerProvider as TracerProviderConfig, ) from opentelemetry.sdk.resources import Resource @@ -141,7 +141,7 @@ def test_configure_none_does_not_set_global(self): def test_configure_with_config_sets_global(self): config = TracerProviderConfig(processors=[]) with patch( - "opentelemetry.sdk.configuration._tracer_provider.trace.set_tracer_provider" + "opentelemetry.configuration._tracer_provider.trace.set_tracer_provider" ) as mock_set: configure_tracer_provider(config) mock_set.assert_called_once() @@ -249,7 +249,7 @@ def test_user_defined_sampler_loaded_via_entry_point(self): mock_sampler = MagicMock(spec=Sampler) mock_class = MagicMock(return_value=mock_sampler) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): # pylint: disable=unexpected-keyword-arg @@ -258,7 +258,7 @@ def test_user_defined_sampler_loaded_via_entry_point(self): def test_user_defined_sampler_not_found_raises_configuration_error(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): with self.assertRaises(ConfigurationError): @@ -777,7 +777,7 @@ def test_plugin_span_exporter_loaded_via_entry_point(self): mock_exporter = MagicMock() mock_class = MagicMock(return_value=mock_exporter) with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[MagicMock(**{"load.return_value": mock_class})], ): config = self._make_batch_config( @@ -791,7 +791,7 @@ def test_plugin_span_exporter_loaded_via_entry_point(self): def test_unknown_span_exporter_raises_configuration_error(self): with patch( - "opentelemetry.sdk.configuration._common.entry_points", + "opentelemetry.configuration._common.entry_points", return_value=[], ): config = self._make_batch_config( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi b/opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi new file mode 100644 index 00000000000..e57edc0f58b --- /dev/null +++ b/opentelemetry-sdk/src/opentelemetry/sdk/__init__.pyi @@ -0,0 +1,18 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The OpenTelemetry SDK package is an implementation of the OpenTelemetry +API +""" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 13e183c3a83..3589dd5bb31 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -723,20 +723,20 @@ class _OTelSDKConfigurator(_BaseConfigurator): def _configure(self, **kwargs): if config_file := environ.get(OTEL_CONFIG_FILE): # Declarative configuration lives in the separate - # ``opentelemetry-sdk-configuration`` package. Import lazily so the + # ``opentelemetry-configuration`` package. Import lazily so the # SDK has no runtime dependency on it; users who don't set # ``OTEL_CONFIG_FILE`` never pay the import cost. try: # pylint: disable=import-outside-toplevel - from opentelemetry.sdk.configuration import ( # noqa: PLC0415 + from opentelemetry.configuration import ( # noqa: PLC0415 configure_sdk, load_config_file, ) except ImportError as exc: raise RuntimeError( f"{OTEL_CONFIG_FILE} is set but " - "opentelemetry-sdk-configuration is not installed. " - "Install it with: pip install opentelemetry-sdk-configuration" + "opentelemetry-configuration is not installed. " + "Install it with: pip install opentelemetry-configuration" ) from exc if kwargs: diff --git a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py index 68e73bc68b2..9a3157413de 100644 --- a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py +++ b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py @@ -13,14 +13,14 @@ def _fake_configuration_module(): - """Build a stub `opentelemetry.sdk.configuration` module. + """Build a stub `opentelemetry.configuration` module. The SDK lazy-imports this package at runtime when OTEL_CONFIG_FILE is set, - but the SDK's test env does not depend on opentelemetry-sdk-configuration. + but the SDK's test env does not depend on opentelemetry-configuration. Injecting a stub into sys.modules lets these tests exercise the routing without installing the downstream package. """ - module = types.ModuleType("opentelemetry.sdk.configuration") + module = types.ModuleType("opentelemetry.configuration") module.configure_sdk = MagicMock() module.load_config_file = MagicMock() return module @@ -51,7 +51,7 @@ def test_env_var_set_routes_to_declarative_path( fake.load_config_file.return_value = sentinel_config with patch.dict( - "sys.modules", {"opentelemetry.sdk.configuration": fake} + "sys.modules", {"opentelemetry.configuration": fake} ): _OTelSDKConfigurator()._configure() @@ -61,18 +61,18 @@ def test_env_var_set_routes_to_declarative_path( @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) @patch.dict( - "sys.modules", {"opentelemetry.sdk.configuration": None}, clear=False + "sys.modules", {"opentelemetry.configuration": None}, clear=False ) @patch("opentelemetry.sdk._configuration._initialize_components") def test_env_var_set_but_package_missing_raises( self, mock_init_components ): - # When opentelemetry-sdk-configuration is not installed but the env + # When opentelemetry-configuration is not installed but the env # var is set, surface a clear RuntimeError instead of a bare # ImportError so users know which package to install. with self.assertRaises(RuntimeError) as ctx: _OTelSDKConfigurator()._configure() - self.assertIn("opentelemetry-sdk-configuration", str(ctx.exception)) + self.assertIn("opentelemetry-configuration", str(ctx.exception)) mock_init_components.assert_not_called() @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) @@ -81,7 +81,7 @@ def test_env_var_set_with_kwargs_warns_and_ignores(self): fake.load_config_file.return_value = object() with patch.dict( - "sys.modules", {"opentelemetry.sdk.configuration": fake} + "sys.modules", {"opentelemetry.configuration": fake} ): with self.assertLogs( "opentelemetry.sdk._configuration", level="WARNING" diff --git a/pyproject.toml b/pyproject.toml index a904fdf02c3..d05c87718d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ requires-python = ">=3.10" dependencies = [ "opentelemetry-api", "opentelemetry-sdk", - "opentelemetry-sdk-configuration", + "opentelemetry-configuration", "opentelemetry-semantic-conventions", "opentelemetry-proto", "opentelemetry-proto-json", @@ -31,7 +31,7 @@ required-version = ">=0.6.0" [tool.uv.sources] opentelemetry-api = { workspace = true} opentelemetry-sdk = { workspace = true } -opentelemetry-sdk-configuration = { workspace = true } +opentelemetry-configuration = { workspace = true } opentelemetry-proto = { workspace = true } opentelemetry-proto-json = { workspace = true } opentelemetry-semantic-conventions = { workspace = true } @@ -52,7 +52,7 @@ opentelemetry-codegen-json = { workspace = true } members = [ "opentelemetry-api", "opentelemetry-sdk", - "opentelemetry-sdk-configuration", + "opentelemetry-configuration", "opentelemetry-semantic-conventions", "opentelemetry-proto", "opentelemetry-proto-json", @@ -104,7 +104,7 @@ ignore = [ [tool.ruff.lint.per-file-ignores] "docs/**/*.*" = ["PLE"] -"opentelemetry-sdk-configuration/tests/test_models.py" = ["E402", "PLC0415"] +"opentelemetry-configuration/tests/test_models.py" = ["E402", "PLC0415"] "shim/opentelemetry-opentracing-shim/tests/*" = ["TID252"] [tool.ruff.lint.isort] @@ -161,9 +161,9 @@ strict = [ ] [tool.datamodel-codegen] -input = "opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/schema.json" +input = "opentelemetry-configuration/src/opentelemetry/configuration/schema.json" input-file-type = "jsonschema" -output = "opentelemetry-sdk-configuration/src/opentelemetry/sdk/configuration/models.py" +output = "opentelemetry-configuration/src/opentelemetry/configuration/models.py" output-model-type = "dataclasses.dataclass" field-constraints = true formatters = ["ruff-format", "ruff-check"] @@ -172,8 +172,8 @@ use-schema-description = true use-title-as-name = true use-union-operator = true target-python-version = "3.10" -custom-template-dir = "opentelemetry-sdk-configuration/codegen" -additional-imports = "typing.ClassVar,opentelemetry.sdk.configuration._common._additional_properties" +custom-template-dir = "opentelemetry-configuration/codegen" +additional-imports = "typing.ClassVar,opentelemetry.configuration._common._additional_properties" [tool.towncrier] directory = ".changelog" diff --git a/tox.ini b/tox.ini index 8aa7f304bd0..48f7b60cc19 100644 --- a/tox.ini +++ b/tox.ini @@ -29,9 +29,9 @@ envlist = lint-opentelemetry-sdk benchmark-opentelemetry-sdk - py3{10,11,12,13,14,14t}-test-opentelemetry-sdk-configuration - pypy3-test-opentelemetry-sdk-configuration - lint-opentelemetry-sdk-configuration + py3{10,11,12,13,14,14t}-test-opentelemetry-configuration + pypy3-test-opentelemetry-configuration + lint-opentelemetry-configuration py3{10,11,12,13,14,14t}-test-opentelemetry-semantic-conventions pypy3-test-opentelemetry-semantic-conventions @@ -138,7 +138,7 @@ deps = sdk: -r {toxinidir}/opentelemetry-sdk/test-requirements.txt benchmark-opentelemetry-sdk: -r {toxinidir}/opentelemetry-sdk/benchmark-requirements.txt - sdk-configuration: -r {toxinidir}/opentelemetry-sdk-configuration/test-requirements.txt + configuration: -r {toxinidir}/opentelemetry-configuration/test-requirements.txt semantic-conventions: -r {toxinidir}/opentelemetry-semantic-conventions/test-requirements.txt @@ -231,8 +231,8 @@ commands = lint-opentelemetry-sdk: pylint {toxinidir}/opentelemetry-sdk benchmark-opentelemetry-sdk: pytest {toxinidir}/opentelemetry-sdk/benchmarks --benchmark-json={toxinidir}/opentelemetry-sdk/sdk-benchmark.json {posargs} - test-opentelemetry-sdk-configuration: pytest {toxinidir}/opentelemetry-sdk-configuration/tests {posargs} - lint-opentelemetry-sdk-configuration: pylint {toxinidir}/opentelemetry-sdk-configuration + test-opentelemetry-configuration: pytest {toxinidir}/opentelemetry-configuration/tests {posargs} + lint-opentelemetry-configuration: pylint {toxinidir}/opentelemetry-configuration test-opentelemetry-proto-gen: pytest {toxinidir}/opentelemetry-proto/tests {posargs} lint-opentelemetry-proto-gen: pylint {toxinidir}/opentelemetry-proto @@ -429,7 +429,7 @@ deps = -e {toxinidir}/opentelemetry-api -e {toxinidir}/opentelemetry-semantic-conventions -e {toxinidir}/opentelemetry-sdk - -e {toxinidir}/opentelemetry-sdk-configuration + -e {toxinidir}/opentelemetry-configuration -e {toxinidir}/tests/opentelemetry-test-utils -e {toxinidir}/exporter/opentelemetry-exporter-http-transport -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common diff --git a/uv.lock b/uv.lock index b5b7a35df15..4877db4bbb9 100644 --- a/uv.lock +++ b/uv.lock @@ -11,6 +11,7 @@ resolution-markers = [ members = [ "opentelemetry-api", "opentelemetry-codegen-json", + "opentelemetry-configuration", "opentelemetry-exporter-http-transport", "opentelemetry-exporter-otlp", "opentelemetry-exporter-otlp-json-common", @@ -26,7 +27,6 @@ members = [ "opentelemetry-proto-json", "opentelemetry-python", "opentelemetry-sdk", - "opentelemetry-sdk-configuration", "opentelemetry-semantic-conventions", "opentelemetry-test-utils", ] @@ -829,6 +829,26 @@ requires-dist = [ { name = "types-protobuf", specifier = ">=4.24" }, ] +[[package]] +name = "opentelemetry-configuration" +source = { editable = "opentelemetry-configuration" } +dependencies = [ + { name = "jsonschema" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-sdk" }, + { name = "pyyaml" }, + { name = "typing-extensions" }, +] + +[package.metadata] +requires-dist = [ + { name = "jsonschema", specifier = ">=4.0" }, + { name = "opentelemetry-api", editable = "opentelemetry-api" }, + { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, + { name = "pyyaml", specifier = ">=6.0" }, + { name = "typing-extensions", specifier = ">=4.5.0" }, +] + [[package]] name = "opentelemetry-exporter-credential-provider-gcp" version = "0.62b0" @@ -1059,6 +1079,7 @@ source = { virtual = "." } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-codegen-json" }, + { name = "opentelemetry-configuration" }, { name = "opentelemetry-exporter-http-transport" }, { name = "opentelemetry-exporter-otlp-json-common" }, { name = "opentelemetry-exporter-otlp-json-file" }, @@ -1072,7 +1093,6 @@ dependencies = [ { name = "opentelemetry-proto" }, { name = "opentelemetry-proto-json" }, { name = "opentelemetry-sdk" }, - { name = "opentelemetry-sdk-configuration" }, { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-test-utils" }, ] @@ -1090,6 +1110,7 @@ dev = [ requires-dist = [ { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-codegen-json", editable = "codegen/opentelemetry-codegen-json" }, + { name = "opentelemetry-configuration", editable = "opentelemetry-configuration" }, { name = "opentelemetry-exporter-http-transport", editable = "exporter/opentelemetry-exporter-http-transport" }, { name = "opentelemetry-exporter-otlp-json-common", editable = "exporter/opentelemetry-exporter-otlp-json-common" }, { name = "opentelemetry-exporter-otlp-json-file", editable = "exporter/opentelemetry-exporter-otlp-json-file" }, @@ -1103,7 +1124,6 @@ requires-dist = [ { name = "opentelemetry-proto", editable = "opentelemetry-proto" }, { name = "opentelemetry-proto-json", editable = "opentelemetry-proto-json" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, - { name = "opentelemetry-sdk-configuration", editable = "opentelemetry-sdk-configuration" }, { name = "opentelemetry-semantic-conventions", editable = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-test-utils", editable = "tests/opentelemetry-test-utils" }, ] @@ -1134,26 +1154,6 @@ requires-dist = [ { name = "typing-extensions", specifier = ">=4.5.0" }, ] -[[package]] -name = "opentelemetry-sdk-configuration" -source = { editable = "opentelemetry-sdk-configuration" } -dependencies = [ - { name = "jsonschema" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-sdk" }, - { name = "pyyaml" }, - { name = "typing-extensions" }, -] - -[package.metadata] -requires-dist = [ - { name = "jsonschema", specifier = ">=4.0" }, - { name = "opentelemetry-api", editable = "opentelemetry-api" }, - { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, - { name = "pyyaml", specifier = ">=6.0" }, - { name = "typing-extensions", specifier = ">=4.5.0" }, -] - [[package]] name = "opentelemetry-semantic-conventions" source = { editable = "opentelemetry-semantic-conventions" } From 9b7795bc99aa07c775e5b47962e5a82fddaf35d8 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Fri, 26 Jun 2026 12:36:52 +0100 Subject: [PATCH 10/14] post-rename CI fixes: ruff import sort + disable no-member on dynamic fake module --- .../src/opentelemetry/configuration/_propagator.py | 6 +++--- opentelemetry-configuration/tests/test_propagator.py | 4 ++-- .../_configuration/test_configurator_file_routing.py | 12 +++++------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py b/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py index 7e5d687218c..5570ca648f7 100644 --- a/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py @@ -4,9 +4,6 @@ from __future__ import annotations from opentelemetry.baggage.propagation import W3CBaggagePropagator -from opentelemetry.propagate import set_global_textmap -from opentelemetry.propagators.composite import CompositePropagator -from opentelemetry.propagators.textmap import TextMapPropagator from opentelemetry.configuration._common import load_entry_point from opentelemetry.configuration.models import ( Propagator as PropagatorConfig, @@ -14,6 +11,9 @@ from opentelemetry.configuration.models import ( TextMapPropagator as TextMapPropagatorConfig, ) +from opentelemetry.propagate import set_global_textmap +from opentelemetry.propagators.composite import CompositePropagator +from opentelemetry.propagators.textmap import TextMapPropagator from opentelemetry.trace.propagation.tracecontext import ( TraceContextTextMapPropagator, ) diff --git a/opentelemetry-configuration/tests/test_propagator.py b/opentelemetry-configuration/tests/test_propagator.py index 0aa2b16522c..49940db2f91 100644 --- a/opentelemetry-configuration/tests/test_propagator.py +++ b/opentelemetry-configuration/tests/test_propagator.py @@ -9,8 +9,6 @@ # We access it here to assert composition correctness. # pylint: disable=protected-access from opentelemetry.baggage.propagation import W3CBaggagePropagator -from opentelemetry.environment_variables import OTEL_PROPAGATORS -from opentelemetry.propagators.composite import CompositePropagator from opentelemetry.configuration._exceptions import ConfigurationError from opentelemetry.configuration._propagator import ( configure_propagator, @@ -22,6 +20,8 @@ from opentelemetry.configuration.models import ( TextMapPropagator as TextMapPropagatorConfig, ) +from opentelemetry.environment_variables import OTEL_PROPAGATORS +from opentelemetry.propagators.composite import CompositePropagator from opentelemetry.trace.propagation.tracecontext import ( TraceContextTextMapPropagator, ) diff --git a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py index 9a3157413de..b67bd43c8d3 100644 --- a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py +++ b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py @@ -2,7 +2,9 @@ # SPDX-License-Identifier: Apache-2.0 # Tests access private members of SDK classes to assert correct configuration. -# pylint: disable=protected-access,no-self-use +# `no-member` is disabled because the fake module's attributes are set +# dynamically and pylint cannot introspect them. +# pylint: disable=protected-access,no-self-use,no-member import types import unittest @@ -50,9 +52,7 @@ def test_env_var_set_routes_to_declarative_path( sentinel_config = object() fake.load_config_file.return_value = sentinel_config - with patch.dict( - "sys.modules", {"opentelemetry.configuration": fake} - ): + with patch.dict("sys.modules", {"opentelemetry.configuration": fake}): _OTelSDKConfigurator()._configure() fake.load_config_file.assert_called_once_with("/tmp/otel.yaml") @@ -80,9 +80,7 @@ def test_env_var_set_with_kwargs_warns_and_ignores(self): fake = _fake_configuration_module() fake.load_config_file.return_value = object() - with patch.dict( - "sys.modules", {"opentelemetry.configuration": fake} - ): + with patch.dict("sys.modules", {"opentelemetry.configuration": fake}): with self.assertLogs( "opentelemetry.sdk._configuration", level="WARNING" ) as captured: From e76b3258ea47e8cd088b62ce2b4500f3fd06a6fc Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Fri, 26 Jun 2026 12:42:28 +0100 Subject: [PATCH 11/14] use class-based fake module in routing tests to drop the no-member pylint disable --- .../test_configurator_file_routing.py | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py index b67bd43c8d3..399b72495bd 100644 --- a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py +++ b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py @@ -2,9 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 # Tests access private members of SDK classes to assert correct configuration. -# `no-member` is disabled because the fake module's attributes are set -# dynamically and pylint cannot introspect them. -# pylint: disable=protected-access,no-self-use,no-member +# pylint: disable=protected-access,no-self-use import types import unittest @@ -14,18 +12,23 @@ from opentelemetry.sdk.environment_variables import OTEL_CONFIG_FILE -def _fake_configuration_module(): - """Build a stub `opentelemetry.configuration` module. +class _FakeConfigurationModule(types.ModuleType): + """Stub `opentelemetry.configuration` module. The SDK lazy-imports this package at runtime when OTEL_CONFIG_FILE is set, but the SDK's test env does not depend on opentelemetry-configuration. - Injecting a stub into sys.modules lets these tests exercise the routing - without installing the downstream package. + Injecting an instance into sys.modules lets these tests exercise the + routing without installing the downstream package. Declaring the attrs + at class level lets pylint introspect them without a no-member disable. """ - module = types.ModuleType("opentelemetry.configuration") - module.configure_sdk = MagicMock() - module.load_config_file = MagicMock() - return module + + configure_sdk: MagicMock + load_config_file: MagicMock + + def __init__(self) -> None: + super().__init__("opentelemetry.configuration") + self.configure_sdk = MagicMock() + self.load_config_file = MagicMock() class TestConfiguratorFileRouting(unittest.TestCase): @@ -48,7 +51,7 @@ def test_env_var_unset_runs_env_var_path(self, mock_init_components): def test_env_var_set_routes_to_declarative_path( self, mock_init_components ): - fake = _fake_configuration_module() + fake = _FakeConfigurationModule() sentinel_config = object() fake.load_config_file.return_value = sentinel_config @@ -77,7 +80,7 @@ def test_env_var_set_but_package_missing_raises( @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"}) def test_env_var_set_with_kwargs_warns_and_ignores(self): - fake = _fake_configuration_module() + fake = _FakeConfigurationModule() fake.load_config_file.return_value = object() with patch.dict("sys.modules", {"opentelemetry.configuration": fake}): From 5877b3e020c9ebc003c16ed8cb70a63a0b2eea63 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Fri, 26 Jun 2026 13:23:29 +0100 Subject: [PATCH 12/14] silence pylint no-name-in-module on conditional opentelemetry.configuration import (not installed in sdk lint env) --- .../src/opentelemetry/sdk/_configuration/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 3589dd5bb31..9891782fda4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -727,7 +727,11 @@ def _configure(self, **kwargs): # SDK has no runtime dependency on it; users who don't set # ``OTEL_CONFIG_FILE`` never pay the import cost. try: - # pylint: disable=import-outside-toplevel + # opentelemetry-configuration is an optional runtime dep + # and is not installed in this package's lint env, so + # silence the static-analysis no-name-in-module on the + # conditional import. + # pylint: disable=import-outside-toplevel,no-name-in-module from opentelemetry.configuration import ( # noqa: PLC0415 configure_sdk, load_config_file, From 45eacc201ec2f3161e4cb99eed99870c671738e1 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Tue, 30 Jun 2026 14:28:24 +0100 Subject: [PATCH 13/14] add opentelemetry-configuration to pyright include/exclude, drop unused typing-extensions dep --- opentelemetry-configuration/pyproject.toml | 1 - .../src/opentelemetry/configuration/_resource.py | 2 +- pyproject.toml | 2 ++ uv.lock | 2 -- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/opentelemetry-configuration/pyproject.toml b/opentelemetry-configuration/pyproject.toml index 04555c50718..024d43601d6 100644 --- a/opentelemetry-configuration/pyproject.toml +++ b/opentelemetry-configuration/pyproject.toml @@ -28,7 +28,6 @@ classifiers = [ dependencies = [ "opentelemetry-api == 1.44.0.dev", "opentelemetry-sdk == 1.44.0.dev", - "typing-extensions >= 4.5.0", "pyyaml >= 6.0", "jsonschema >= 4.0", ] diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py b/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py index e903f191bb5..199324405a8 100644 --- a/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py @@ -19,9 +19,9 @@ IncludeExclude, ) from opentelemetry.configuration.models import Resource as ResourceConfig +from opentelemetry.sdk.environment_variables import OTEL_SERVICE_NAME from opentelemetry.sdk.resources import ( _DEFAULT_RESOURCE, - OTEL_SERVICE_NAME, SERVICE_NAME, ProcessResourceDetector, Resource, diff --git a/pyproject.toml b/pyproject.toml index d05c87718d4..4d7fa36ae71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,6 +125,7 @@ include = [ "opentelemetry-semantic-conventions", "opentelemetry-api", "opentelemetry-sdk", + "opentelemetry-configuration", "opentelemetry-proto-json", "exporter/opentelemetry-exporter-otlp-json-file", "exporter/opentelemetry-exporter-http-transport", @@ -136,6 +137,7 @@ include = [ exclude = [ "opentelemetry-sdk/tests", + "opentelemetry-configuration/tests", "opentelemetry-sdk/src/opentelemetry/sdk/_events", "opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py", "opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py", diff --git a/uv.lock b/uv.lock index 4877db4bbb9..d26aec7204d 100644 --- a/uv.lock +++ b/uv.lock @@ -837,7 +837,6 @@ dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-sdk" }, { name = "pyyaml" }, - { name = "typing-extensions" }, ] [package.metadata] @@ -846,7 +845,6 @@ requires-dist = [ { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, { name = "pyyaml", specifier = ">=6.0" }, - { name = "typing-extensions", specifier = ">=4.5.0" }, ] [[package]] From 4b2e2dfe6fad0d599474ad617b970bb04bd09810 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Tue, 30 Jun 2026 14:52:25 +0100 Subject: [PATCH 14/14] loosen pyyaml floor to >= 5.4 (matches our actual API surface) --- opentelemetry-configuration/pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-configuration/pyproject.toml b/opentelemetry-configuration/pyproject.toml index 024d43601d6..c8f7eeaf986 100644 --- a/opentelemetry-configuration/pyproject.toml +++ b/opentelemetry-configuration/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ dependencies = [ "opentelemetry-api == 1.44.0.dev", "opentelemetry-sdk == 1.44.0.dev", - "pyyaml >= 6.0", + "pyyaml >= 5.4", "jsonschema >= 4.0", ] diff --git a/uv.lock b/uv.lock index d26aec7204d..ebf6386caf7 100644 --- a/uv.lock +++ b/uv.lock @@ -844,7 +844,7 @@ requires-dist = [ { name = "jsonschema", specifier = ">=4.0" }, { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, - { name = "pyyaml", specifier = ">=6.0" }, + { name = "pyyaml", specifier = ">=5.4" }, ] [[package]]