--- title: SDK configuration weight: 30 cSpell:ignore: customizer distro --- This spring starter supports [configuration metadata](https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html), which means that you can see and autocomplete all available properties in your IDE. ## General configuration The OpenTelemetry Starter supports all the [SDK Autoconfiguration](/docs/zero-code/java/agent/configuration/#sdk-configuration) (since 2.2.0). You can update the configuration with properties in the `application.properties` or the `application.yaml` file, or with environment variables. `application.properties` example: ```properties otel.propagators=tracecontext,b3 otel.resource.attributes.deployment.environment=dev otel.resource.attributes.service.name=cart otel.resource.attributes.service.namespace=shop ``` `application.yaml` example: ```yaml otel: propagators: - tracecontext - b3 resource: attributes: deployment.environment: dev service: name: cart namespace: shop ``` Environment variables example: ```shell export OTEL_PROPAGATORS="tracecontext,b3" export OTEL_RESOURCE_ATTRIBUTES="deployment.environment=dev,service.name=cart,service.namespace=shop" ``` ## Overriding Resource Attributes As usual in Spring Boot, you can override properties in the `application.properties` and `application.yaml` files with environment variables. For example, you can set or override the `deployment.environment` resource attribute (not changing `service.name` or `service.namespace`) by setting the standard `OTEL_RESOURCE_ATTRIBUTES` environment variable: ```shell export OTEL_RESOURCE_ATTRIBUTES="deployment.environment=prod" ``` Alternatively, you can use the `OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_ENVIRONMENT` environment variable to set or override a single resource attribute: ```shell export OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_ENVIRONMENT="prod" ``` The second option supports [SpEL](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html) expressions. Note that `DEPLOYMENT_ENVIRONMENT` gets converted to `deployment.environment` by Spring Boot's [Relaxed Binding](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.typesafe-configuration-properties.relaxed-binding.environment-variables). ## Disable the OpenTelemetry Starter {{% config_option name="otel.sdk.disabled" %}} Set the value to `true` to disable the starter, e.g. for testing purposes. {{% /config_option %}} ## Programmatic configuration You can use the `AutoConfigurationCustomizerProvider` for programmatic configuration. Programmatic configuration is recommended for advanced use cases, which are not configurable using properties. ### Exclude actuator endpoints from tracing As an example, you can customize the sampler to exclude health check endpoints from tracing: {{< tabpane text=true >}} {{% tab header="Maven (`pom.xml`)" lang=Maven %}} ```xml io.opentelemetry.contrib opentelemetry-samplers 1.33.0-alpha ``` {{% /tab %}} {{% tab header="Gradle (`build.gradle`)" lang=Gradle %}} ```kotlin dependencies { implementation("io.opentelemetry.contrib:opentelemetry-samplers:1.33.0-alpha") } ``` {{% /tab %}} {{< /tabpane>}} ```java package otel; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.contrib.sampler.RuleBasedRoutingSampler; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import io.opentelemetry.semconv.UrlAttributes; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterPaths { @Bean public AutoConfigurationCustomizerProvider otelCustomizer() { return p -> p.addSamplerCustomizer( (fallback, config) -> RuleBasedRoutingSampler.builder(SpanKind.SERVER, fallback) .drop(UrlAttributes.URL_PATH, "^/actuator") .build()); } } ``` ### Configure the exporter programmatically You can also configure OTLP exporters programmatically. This configuration replaces the default OTLP exporter and adds a custom header to the requests. ```java package otel; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import java.util.Collections; import java.util.Map; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CustomAuth { @Bean public AutoConfigurationCustomizerProvider otelCustomizer() { return p -> p.addSpanExporterCustomizer( (exporter, config) -> { if (exporter instanceof OtlpHttpSpanExporter) { return ((OtlpHttpSpanExporter) exporter) .toBuilder().setHeaders(this::headers).build(); } return exporter; }); } private Map headers() { return Collections.singletonMap("Authorization", "Bearer " + refreshToken()); } private String refreshToken() { // e.g. read the token from a kubernetes secret return "token"; } } ``` ## Resource Providers The OpenTelemetry Starter includes the same resource providers as the Java agent: - [Common resource providers](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/resources/library) - [Resource providers that are disabled by default](/docs/zero-code/java/agent/configuration/#enable-resource-providers-that-are-disabled-by-default) In addition, the OpenTelemetry Starter includes the following Spring Boot specific resource providers: ### Distribution Resource Provider FQN: `io.opentelemetry.instrumentation.spring.autoconfigure.resources.DistroVersionResourceProvider` | Attribute | Value | | -------------------------- | ----------------------------------- | | `telemetry.distro.name` | `opentelemetry-spring-boot-starter` | | `telemetry.distro.version` | version of the starter | ### Spring Resource Provider FQN: `io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider` | Attribute | Value | | ----------------- | ---------------------------------------------------------------------------------------------------------- | | `service.name` | `spring.application.name` or `build.name` from `build-info.properties` (see [Service name](#service-name)) | | `service.version` | `build.version` from `build-info.properties` | ## Service name Using these resource providers, the service name is determined by the following precedence rules, in accordance with the OpenTelemetry [specification](/docs/languages/sdk-configuration/general/#otel_service_name): 1. `otel.service.name` spring property or `OTEL_SERVICE_NAME` environment variable (highest precedence) 2. `service.name` in `otel.resource.attributes` system/spring property or `OTEL_RESOURCE_ATTRIBUTES` environment variable 3. `spring.application.name` spring property 4. `build-info.properties` 5. `Implementation-Title` from META-INF/MANIFEST.MF 6. The default value is `unknown_service:java` (lowest precedence) Use the following snippet in your pom.xml file to generate the `build-info.properties` file: {{< tabpane text=true >}} {{% tab header="Maven (`pom.xml`)" lang=Maven %}} ```xml ${project.artifactId} org.springframework.boot spring-boot-maven-plugin build-info repackage ``` {{% /tab %}} {{% tab header="Gradle (`build.gradle`)" lang=Gradle %}} ```kotlin springBoot { buildInfo { } } ``` {{% /tab %}} {{< /tabpane>}}