# Declarative Configuration

Note

Declarative configuration support is new in this release and may still have rough edges. If you hit a problem, please open an issue on the opentelemetry-python tracker.

This example configures the OpenTelemetry SDK from a single YAML file using declarative configuration instead of environment variables or hand-written provider setup.

The source files of this example are available here.

Install the declarative-config package, the auto-instrumentation entry point, the OTLP/HTTP exporter, and the `requests` instrumentation used by this example:

    pip install opentelemetry-configuration \
        opentelemetry-distro \
        opentelemetry-exporter-otlp-proto-http \
        opentelemetry-instrumentation-requests

Start an OTLP-capable backend locally so there is somewhere to send data. Write the following file:

    # otel-collector-config.yaml
    receivers:
      otlp:
        protocols:
          http:
            endpoint: 0.0.0.0:4318

    exporters:
      debug:
        verbosity: detailed

    service:
        pipelines:
            traces:
                receivers: [otlp]
                exporters: [debug]
            metrics:
                receivers: [otlp]
                exporters: [debug]
            logs:
                receivers: [otlp]
                exporters: [debug]

Then start the Collector:

    docker run \
        -p 4318:4318 \
        -v $(pwd)/otel-collector-config.yaml:/etc/otel-collector-config.yaml \
        otel/opentelemetry-collector:latest \
        --config=/etc/otel-collector-config.yaml

## Run the example

Point the SDK at `otel-config.yaml` with `OTEL_CONFIG_FILE` and let auto-instrumentation apply it. No configuration code lives in `app.py`:

    export OTEL_CONFIG_FILE=$(pwd)/otel-config.yaml
    opentelemetry-instrument python app.py

You should see the exported span in the Collector’s debug output. The `instrumentation/development.python` section in `otel-config.yaml` activates the `requests` instrumentation so outgoing HTTP calls made by `app.py` are automatically traced without any code changes.

## Environment variable substitution

`otel-config.yaml` uses `${DEPLOYMENT_ENVIRONMENT:-development}` to read the deployment environment from the environment, defaulting to `development`. Set it before running to override:

    export DEPLOYMENT_ENVIRONMENT=staging