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"