diff --git a/.changelog/5356.changed b/.changelog/5356.changed
new file mode 100644
index 00000000000..8c011228192
--- /dev/null
+++ b/.changelog/5356.changed
@@ -0,0 +1 @@
+`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 27033640dc1..f5ee709b14e 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-configuration:
+ name: opentelemetry-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-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..1b0657ab7d4 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-configuration_ubuntu-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py311-test-opentelemetry-configuration_ubuntu-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py312-test-opentelemetry-configuration_ubuntu-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py313-test-opentelemetry-configuration_ubuntu-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py314-test-opentelemetry-configuration_ubuntu-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py314t-test-opentelemetry-configuration_ubuntu-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ pypy3-test-opentelemetry-configuration_ubuntu-latest:
+ name: opentelemetry-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-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-configuration_windows-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py311-test-opentelemetry-configuration_windows-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py312-test-opentelemetry-configuration_windows-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py313-test-opentelemetry-configuration_windows-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py314-test-opentelemetry-configuration_windows-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ py314t-test-opentelemetry-configuration_windows-latest:
+ name: opentelemetry-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-configuration -- -ra
+
+ pypy3-test-opentelemetry-configuration_windows-latest:
+ name: opentelemetry-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-configuration -- -ra
+
py310-test-opentelemetry-semantic-conventions_windows-latest:
name: opentelemetry-semantic-conventions 3.10 Windows
runs-on: windows-latest
diff --git a/docs/examples/declarative-config/README.rst b/docs/examples/declarative-config/README.rst
index ec3b828b829..fe327f1a9b3 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-configuration \
opentelemetry-distro \
opentelemetry-exporter-otlp-proto-http
diff --git a/docs/sdk/configuration.rst b/docs/sdk/configuration.rst
index 40af342e418..851691ce3eb 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-configuration
Enabling with an environment variable
-------------------------------------
diff --git a/opentelemetry-configuration/README.rst b/opentelemetry-configuration/README.rst
new file mode 100644
index 00000000000..f571a4af9f4
--- /dev/null
+++ b/opentelemetry-configuration/README.rst
@@ -0,0 +1,47 @@
+OpenTelemetry Python SDK Declarative Configuration
+===================================================
+
+|pypi|
+
+.. |pypi| image:: https://badge.fury.io/py/opentelemetry-configuration.svg
+ :target: https://pypi.org/project/opentelemetry-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.configuration import configure_sdk, load_config_file
+
+ config = load_config_file("otel-config.yaml")
+ configure_sdk(config)
+
+Installation
+------------
+
+::
+
+ pip install opentelemetry-configuration
+
+References
+----------
+
+* `OpenTelemetry declarative configuration specification
+ `_
+* `Language support status matrix
+ `_
+* `OpenTelemetry Project `_
diff --git a/opentelemetry-sdk/codegen/README.md b/opentelemetry-configuration/codegen/README.md
similarity index 70%
rename from opentelemetry-sdk/codegen/README.md
rename to opentelemetry-configuration/codegen/README.md
index b79210a576e..73b008a2633 100644
--- a/opentelemetry-sdk/codegen/README.md
+++ b/opentelemetry-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-configuration/src/opentelemetry/configuration/README.md` for the full schema update workflow.
diff --git a/opentelemetry-sdk/codegen/dataclass.jinja2 b/opentelemetry-configuration/codegen/dataclass.jinja2
similarity index 100%
rename from opentelemetry-sdk/codegen/dataclass.jinja2
rename to opentelemetry-configuration/codegen/dataclass.jinja2
diff --git a/opentelemetry-configuration/pyproject.toml b/opentelemetry-configuration/pyproject.toml
new file mode 100644
index 00000000000..c8f7eeaf986
--- /dev/null
+++ b/opentelemetry-configuration/pyproject.toml
@@ -0,0 +1,49 @@
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[project]
+name = "opentelemetry-configuration"
+dynamic = ["version"]
+description = "OpenTelemetry Python 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",
+ "pyyaml >= 5.4",
+ "jsonschema >= 4.0",
+]
+
+[project.urls]
+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/configuration/version/__init__.py"
+
+[tool.hatch.build.targets.sdist]
+include = [
+ "/src",
+ "/tests",
+]
+
+[tool.hatch.build.targets.wheel]
+packages = ["src/opentelemetry"]
diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/README.md b/opentelemetry-configuration/src/opentelemetry/configuration/README.md
new file mode 100644
index 00000000000..516a7352954
--- /dev/null
+++ b/opentelemetry-configuration/src/opentelemetry/configuration/README.md
@@ -0,0 +1,24 @@
+# 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-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-configuration/src/opentelemetry/configuration/schema.json` with the `opentelemetry_configuration.json` published on that release.
+
+2. Regenerate `models.py`:
+
+ ```sh
+ tox -e generate-config-from-jsonschema
+ ```
+
+3. Update any version string references in tests and source:
+
+ ```sh
+ grep -r "OLD_VERSION" opentelemetry-configuration/
+ ```
diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/__init__.py b/opentelemetry-configuration/src/opentelemetry/configuration/__init__.py
new file mode 100644
index 00000000000..934987fb7bd
--- /dev/null
+++ b/opentelemetry-configuration/src/opentelemetry/configuration/__init__.py
@@ -0,0 +1,42 @@
+# 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.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.configuration import (
+... OpenTelemetryConfiguration, configure_sdk,
+... )
+>>> configure_sdk(OpenTelemetryConfiguration(file_format="1.0-rc.1"))
+
+This package is **experimental**. The API surface, type names, and
+behaviour may change between minor versions.
+"""
+
+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",
+ "OpenTelemetryConfiguration",
+ "configure_sdk",
+ "load_config_file",
+]
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py b/opentelemetry-configuration/src/opentelemetry/configuration/_common.py
similarity index 99%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_common.py
index a635311271d..73fc0f9d0c5 100644
--- a/opentelemetry-sdk/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/src/opentelemetry/sdk/_configuration/_conversion.py b/opentelemetry-configuration/src/opentelemetry/configuration/_conversion.py
similarity index 100%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_conversion.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_conversion.py
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_exceptions.py b/opentelemetry-configuration/src/opentelemetry/configuration/_exceptions.py
similarity index 100%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_exceptions.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_exceptions.py
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py b/opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py
similarity index 94%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py
index e2ecdfa3a89..31efa8afb28 100644
--- a/opentelemetry-sdk/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/src/opentelemetry/sdk/_configuration/_meter_provider.py b/opentelemetry-configuration/src/opentelemetry/configuration/_meter_provider.py
similarity index 95%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_meter_provider.py
index 8fffaf9d63e..70ddf65e21b 100644
--- a/opentelemetry-sdk/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/src/opentelemetry/sdk/_configuration/_propagator.py b/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py
similarity index 95%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py
index 8008cf77c42..5570ca648f7 100644
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py
+++ b/opentelemetry-configuration/src/opentelemetry/configuration/_propagator.py
@@ -4,16 +4,16 @@
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.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.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-sdk/src/opentelemetry/sdk/_configuration/_resource.py b/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py
similarity index 96%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_resource.py
index 15e842ee318..199324405a8 100644
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py
+++ b/opentelemetry-configuration/src/opentelemetry/configuration/_resource.py
@@ -11,17 +11,17 @@
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.environment_variables import OTEL_SERVICE_NAME
from opentelemetry.sdk.resources import (
_DEFAULT_RESOURCE,
- OTEL_SERVICE_NAME,
SERVICE_NAME,
ProcessResourceDetector,
Resource,
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_sdk.py b/opentelemetry-configuration/src/opentelemetry/configuration/_sdk.py
similarity index 79%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_sdk.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_sdk.py
index efa26aa9360..0a3a9eaed37 100644
--- a/opentelemetry-sdk/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/src/opentelemetry/sdk/_configuration/_tracer_provider.py b/opentelemetry-configuration/src/opentelemetry/configuration/_tracer_provider.py
similarity index 95%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/_tracer_provider.py
index f6c3a06c7f8..12e71821f96 100644
--- a/opentelemetry-sdk/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/src/opentelemetry/sdk/_configuration/file/__init__.py b/opentelemetry-configuration/src/opentelemetry/configuration/file/__init__.py
similarity index 60%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/__init__.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/file/__init__.py
index 49b09ba46b0..7f847ea7962 100644
--- a/opentelemetry-sdk/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/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/src/opentelemetry/sdk/_configuration/file/_env_substitution.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/file/_env_substitution.py
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py b/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py
similarity index 90%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py
index 475ecac3225..232c00dcae3 100644
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py
+++ b/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py
@@ -10,28 +10,15 @@
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 (
+import jsonschema
+import yaml
+
+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
-
-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
+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,
@@ -47,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/src/opentelemetry/sdk/_configuration/models.py b/opentelemetry-configuration/src/opentelemetry/configuration/models.py
similarity index 99%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/models.py
rename to opentelemetry-configuration/src/opentelemetry/configuration/models.py
index 88caddbb94c..4a0b9521dac 100644
--- a/opentelemetry-sdk/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/src/opentelemetry/sdk/_configuration/schema.json b/opentelemetry-configuration/src/opentelemetry/configuration/schema.json
similarity index 100%
rename from opentelemetry-sdk/src/opentelemetry/sdk/_configuration/schema.json
rename to opentelemetry-configuration/src/opentelemetry/configuration/schema.json
diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/version/__init__.py b/opentelemetry-configuration/src/opentelemetry/configuration/version/__init__.py
new file mode 100644
index 00000000000..98ec6d01b8a
--- /dev/null
+++ b/opentelemetry-configuration/src/opentelemetry/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-configuration/test-requirements.txt b/opentelemetry-configuration/test-requirements.txt
new file mode 100644
index 00000000000..556a43f63ca
--- /dev/null
+++ b/opentelemetry-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-configuration
diff --git a/opentelemetry-sdk/tests/_configuration/__init__.py b/opentelemetry-configuration/tests/__init__.py
similarity index 100%
rename from opentelemetry-sdk/tests/_configuration/__init__.py
rename to opentelemetry-configuration/tests/__init__.py
diff --git a/opentelemetry-sdk/tests/_configuration/file/__init__.py b/opentelemetry-configuration/tests/file/__init__.py
similarity index 100%
rename from opentelemetry-sdk/tests/_configuration/file/__init__.py
rename to opentelemetry-configuration/tests/file/__init__.py
diff --git a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/file/data/config_with_env_vars.yaml
rename to opentelemetry-configuration/tests/file/data/config_with_env_vars.yaml
diff --git a/opentelemetry-sdk/tests/_configuration/file/data/invalid_yaml.yaml b/opentelemetry-configuration/tests/file/data/invalid_yaml.yaml
similarity index 100%
rename from opentelemetry-sdk/tests/_configuration/file/data/invalid_yaml.yaml
rename to opentelemetry-configuration/tests/file/data/invalid_yaml.yaml
diff --git a/opentelemetry-sdk/tests/_configuration/file/data/minimal_config.json b/opentelemetry-configuration/tests/file/data/minimal_config.json
similarity index 100%
rename from opentelemetry-sdk/tests/_configuration/file/data/minimal_config.json
rename to opentelemetry-configuration/tests/file/data/minimal_config.json
diff --git a/opentelemetry-sdk/tests/_configuration/file/data/minimal_config.yaml b/opentelemetry-configuration/tests/file/data/minimal_config.yaml
similarity index 100%
rename from opentelemetry-sdk/tests/_configuration/file/data/minimal_config.yaml
rename to opentelemetry-configuration/tests/file/data/minimal_config.yaml
diff --git a/opentelemetry-sdk/tests/_configuration/file/test_env_substitution.py b/opentelemetry-configuration/tests/file/test_env_substitution.py
similarity index 99%
rename from opentelemetry-sdk/tests/_configuration/file/test_env_substitution.py
rename to opentelemetry-configuration/tests/file/test_env_substitution.py
index b9f71f387c3..14c79f20fd5 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/file/test_loader.py b/opentelemetry-configuration/tests/file/test_loader.py
similarity index 96%
rename from opentelemetry-sdk/tests/_configuration/file/test_loader.py
rename to opentelemetry-configuration/tests/file/test_loader.py
index ecb485c6a56..c9dcbee8e67 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_common.py b/opentelemetry-configuration/tests/test_common.py
similarity index 96%
rename from opentelemetry-sdk/tests/_configuration/test_common.py
rename to opentelemetry-configuration/tests/test_common.py
index b7a9a0f1477..b4a9cc4745e 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_conversion.py b/opentelemetry-configuration/tests/test_conversion.py
similarity index 94%
rename from opentelemetry-sdk/tests/_configuration/test_conversion.py
rename to opentelemetry-configuration/tests/test_conversion.py
index c6cc082e1e3..6ae15c6e648 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_logger_provider.py b/opentelemetry-configuration/tests/test_logger_provider.py
similarity index 94%
rename from opentelemetry-sdk/tests/_configuration/test_logger_provider.py
rename to opentelemetry-configuration/tests/test_logger_provider.py
index 1835880cf3e..4aadcd1a104 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_meter_provider.py b/opentelemetry-configuration/tests/test_meter_provider.py
similarity index 95%
rename from opentelemetry-sdk/tests/_configuration/test_meter_provider.py
rename to opentelemetry-configuration/tests/test_meter_provider.py
index adc8a63f562..bc9d85d6eb1 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_models.py b/opentelemetry-configuration/tests/test_models.py
similarity index 75%
rename from opentelemetry-sdk/tests/_configuration/test_models.py
rename to opentelemetry-configuration/tests/test_models.py
index 2daa8d71995..c83b0b2a8ea 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_propagator.py b/opentelemetry-configuration/tests/test_propagator.py
similarity index 89%
rename from opentelemetry-sdk/tests/_configuration/test_propagator.py
rename to opentelemetry-configuration/tests/test_propagator.py
index a14e1315f00..49940db2f91 100644
--- a/opentelemetry-sdk/tests/_configuration/test_propagator.py
+++ b/opentelemetry-configuration/tests/test_propagator.py
@@ -9,19 +9,19 @@
# 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.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.environment_variables import OTEL_PROPAGATORS
+from opentelemetry.propagators.composite import CompositePropagator
from opentelemetry.trace.propagation.tracecontext import (
TraceContextTextMapPropagator,
)
@@ -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/tests/_configuration/test_resource.py b/opentelemetry-configuration/tests/test_resource.py
similarity index 97%
rename from opentelemetry-sdk/tests/_configuration/test_resource.py
rename to opentelemetry-configuration/tests/test_resource.py
index ac323bcbde3..3a21872ce12 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_sdk.py b/opentelemetry-configuration/tests/test_sdk.py
similarity index 69%
rename from opentelemetry-sdk/tests/_configuration/test_sdk.py
rename to opentelemetry-configuration/tests/test_sdk.py
index b223ad344c5..1637eba8d7f 100644
--- a/opentelemetry-sdk/tests/_configuration/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/tests/_configuration/test_tracer_provider.py b/opentelemetry-configuration/tests/test_tracer_provider.py
similarity index 94%
rename from opentelemetry-sdk/tests/_configuration/test_tracer_provider.py
rename to opentelemetry-configuration/tests/test_tracer_provider.py
index abac735fe42..97484358327 100644
--- a/opentelemetry-sdk/tests/_configuration/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/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/README.md b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/README.md
deleted file mode 100644
index e7cf918eea7..00000000000
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# SDK File 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)
-
-## 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 \
- https://raw.githubusercontent.com/open-telemetry/opentelemetry-configuration/refs/tags/vX.Y.Z/opentelemetry_configuration.json
- ```
-
-2. Regenerate `models.py`:
-
- ```sh
- tox -e generate-config-from-jsonschema
- ```
-
-3. Update any version string references in tests and source:
-
- ```sh
- grep -r "OLD_VERSION" opentelemetry-sdk/
- ```
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py
index 46d1ca7ddfc..9891782fda4 100644
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py
+++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py
@@ -722,16 +722,26 @@ 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-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:
+ # 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,
+ )
+ except ImportError as exc:
+ raise RuntimeError(
+ f"{OTEL_CONFIG_FILE} is set but "
+ "opentelemetry-configuration is not installed. "
+ "Install it with: pip install opentelemetry-configuration"
+ ) from exc
if kwargs:
_logger.warning(
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/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..399b72495bd 100644
--- a/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py
+++ b/opentelemetry-sdk/tests/_configuration/test_configurator_file_routing.py
@@ -4,14 +4,33 @@
# 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._configuration._exceptions import ConfigurationError
from opentelemetry.sdk.environment_variables import OTEL_CONFIG_FILE
+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 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.
+ """
+
+ 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):
def tearDown(self):
# _BaseConfigurator caches instances via a singleton; reset so sibling
@@ -28,42 +47,49 @@ 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._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 = _FakeConfigurationModule()
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.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: "/does/not/exist.yaml"})
+ @patch.dict("os.environ", {OTEL_CONFIG_FILE: "/tmp/otel.yaml"})
+ @patch.dict(
+ "sys.modules", {"opentelemetry.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-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-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")
- 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 = _FakeConfigurationModule()
+ fake.load_config_file.return_value = object()
+
+ with patch.dict("sys.modules", {"opentelemetry.configuration": fake}):
+ with self.assertLogs(
+ "opentelemetry.sdk._configuration", level="WARNING"
+ ) as captured:
+ _OTelSDKConfigurator()._configure(
+ sampler="X", auto_instrumentation_version="Y"
+ )
self.assertTrue(
any(
@@ -72,7 +98,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")
diff --git a/pyproject.toml b/pyproject.toml
index 95c826e01b6..4d7fa36ae71 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,6 +5,7 @@ requires-python = ">=3.10"
dependencies = [
"opentelemetry-api",
"opentelemetry-sdk",
+ "opentelemetry-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-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-configuration",
"opentelemetry-semantic-conventions",
"opentelemetry-proto",
"opentelemetry-proto-json",
@@ -101,7 +104,7 @@ ignore = [
[tool.ruff.lint.per-file-ignores]
"docs/**/*.*" = ["PLE"]
-"opentelemetry-sdk/tests/_configuration/test_models.py" = ["E402", "PLC0415"]
+"opentelemetry-configuration/tests/test_models.py" = ["E402", "PLC0415"]
"shim/opentelemetry-opentracing-shim/tests/*" = ["TID252"]
[tool.ruff.lint.isort]
@@ -122,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",
@@ -133,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",
@@ -158,9 +163,9 @@ strict = [
]
[tool.datamodel-codegen]
-input = "opentelemetry-sdk/src/opentelemetry/sdk/_configuration/schema.json"
+input = "opentelemetry-configuration/src/opentelemetry/configuration/schema.json"
input-file-type = "jsonschema"
-output = "opentelemetry-sdk/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"]
@@ -169,8 +174,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-configuration/codegen"
+additional-imports = "typing.ClassVar,opentelemetry.configuration._common._additional_properties"
[tool.towncrier]
directory = ".changelog"
diff --git a/tox.ini b/tox.ini
index 5476de0cde1..48f7b60cc19 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-configuration
+ pypy3-test-opentelemetry-configuration
+ lint-opentelemetry-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
+ configuration: -r {toxinidir}/opentelemetry-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-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
@@ -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-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 ec806543d86..ebf6386caf7 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",
@@ -828,6 +829,24 @@ 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" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "jsonschema", specifier = ">=4.0" },
+ { name = "opentelemetry-api", editable = "opentelemetry-api" },
+ { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" },
+ { name = "pyyaml", specifier = ">=5.4" },
+]
+
[[package]]
name = "opentelemetry-exporter-credential-provider-gcp"
version = "0.62b0"
@@ -1058,6 +1077,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" },
@@ -1088,6 +1108,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" },
@@ -1124,21 +1145,12 @@ dependencies = [
{ name = "typing-extensions" },
]
-[package.optional-dependencies]
-file-configuration = [
- { name = "jsonschema" },
- { name = "pyyaml" },
-]
-
[package.metadata]
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 = "pyyaml", marker = "extra == 'file-configuration'", specifier = ">=6.0" },
{ name = "typing-extensions", specifier = ">=4.5.0" },
]
-provides-extras = ["file-configuration"]
[[package]]
name = "opentelemetry-semantic-conventions"