diff --git a/content/en/docs/zero-code/java/spring-boot-starter/_index.md b/content/en/docs/zero-code/java/spring-boot-starter/_index.md new file mode 100644 index 000000000000..c4fc993a6601 --- /dev/null +++ b/content/en/docs/zero-code/java/spring-boot-starter/_index.md @@ -0,0 +1,28 @@ +--- +title: Spring Boot starter +aliases: + [ + /docs/languages/java/automatic/spring-boot/, + /docs/zero-code/java/spring-boot/, + ] +--- + +You can use two options to instrument +[Spring Boot](https://spring.io/projects/spring-boot) applications with +OpenTelemetry. + +1. The default choice for instrumenting Spring Boot applications is the + [**OpenTelemetry Java agent**](../agent) with byte code instrumentation: + - **More out of the box instrumentation** than the OpenTelemetry starter +2. The **OpenTelemetry Spring Boot starter** can help you with: + - **Spring Boot Native image** applications for which the OpenTelemetry Java + agent does not work + - **Startup overhead** of the OpenTelemetry Java agent exceeding your + requirements + - A Java monitoring agent already used because the OpenTelemetry Java agent + might not work with the other agent + - **Spring Boot configuration files** (`application.properties`, + `application.yml`) to configure the OpenTelemetry Spring Boot starter which + doesn't work with the OpenTelemetry Java agent + +## Use the OpenTelemetry starter diff --git a/content/en/docs/zero-code/java/spring-boot-starter/additional-instrumentations.md b/content/en/docs/zero-code/java/spring-boot-starter/additional-instrumentations.md new file mode 100644 index 000000000000..6b9fa3185bdc --- /dev/null +++ b/content/en/docs/zero-code/java/spring-boot-starter/additional-instrumentations.md @@ -0,0 +1,42 @@ +--- +title: Additional instrumentations +description: + Additional instrumentations in addition to the out of the box instrumentation + of the starter +weight: 50 +--- + +The OpenTelemetry Spring Boot starter provides of the box +instrumentation](../out-of-the-box-instrumentation) that you can complete with +additional instrumentations. + +## Log4j2 Instrumentation + +You have to add the OpenTelemetry appender to your `log4j2.xml` file: + +```xml + + + + + + + + + + + +``` + +You can find more configuration options for the OpenTelemetry appender in the +[Log4j](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/log4j/log4j-appender-2.17/library/README.md) +instrumentation library. + +| System property | Type | Default | Description | +| --------------------------------------------- | ------- | ------- | ----------------------------------------------------------------------------------------------- | +| `otel.instrumentation.log4j-appender.enabled` | Boolean | true | Enables the configuration of the Log4j OpenTelemetry appender with an `OpenTelemetry` instance. | + +## OpenTelemetry instrumentations libraries + +You can configure other instrumentations with +[OpenTelemetry instrumentations libraries](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md#libraries--frameworks). diff --git a/content/en/docs/zero-code/java/spring-boot-starter/annotations.md b/content/en/docs/zero-code/java/spring-boot-starter/annotations.md new file mode 100644 index 000000000000..527284e70539 --- /dev/null +++ b/content/en/docs/zero-code/java/spring-boot-starter/annotations.md @@ -0,0 +1,59 @@ +--- +title: Annotations +description: Using instrumentation annotations with the Spring starter. +aliases: [../annotations] +weight: 60 +--- + +For most users, the out-of-the-box instrumentation is completely sufficient and +nothing more has to be done. Sometimes, however, users wish to create +[spans](/docs/concepts/signals/traces/#spans) for their own custom code without +doing too much code change. + +## Available annotations + +This feature uses spring-aop to wrap methods annotated with `@WithSpan` in a +span. The arguments to the method can be captured as attributed on the created +span by annotating the method parameters with `@SpanAttribute`. + +> **Note**: this annotation can only be applied to bean methods managed by the +> spring application context. To learn more about aspect weaving in spring, see +> [spring-aop](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop). + +| Feature | Property | Default Value | Description | +| ----------- | ------------------------------------------ | ------------- | --------------------------------- | +| `@WithSpan` | `otel.instrumentation.annotations.enabled` | true | Enables the WithSpan annotations. | + +```java +import org.springframework.stereotype.Component; + +import io.opentelemetry.instrumentation.annotations.SpanAttribute; +import io.opentelemetry.instrumentation.annotations.WithSpan; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; + +/** + * Test WithSpan + */ +@Component +public class TracedClass { + + @WithSpan + public void tracedMethod() { + } + + @WithSpan(value="span name") + public void tracedMethodWithName() { + Span currentSpan = Span.current(); + currentSpan.addEvent("ADD EVENT TO tracedMethodWithName SPAN"); + currentSpan.setAttribute("isTestAttribute", true); + } + + @WithSpan(kind = SpanKind.CLIENT) + public void tracedClientSpan() { + } + + public void tracedMethodWithAttribute(@SpanAttribute("attributeName") String parameter) { + } +} +``` diff --git a/content/en/docs/zero-code/java/spring-boot-starter/getting-started.md b/content/en/docs/zero-code/java/spring-boot-starter/getting-started.md new file mode 100644 index 000000000000..a0c21c90f937 --- /dev/null +++ b/content/en/docs/zero-code/java/spring-boot-starter/getting-started.md @@ -0,0 +1,132 @@ +--- +title: Getting Started +description: Getting Started of the OpenTelemetry starter +weight: 20 +cSpell:ignore: springboot +--- + +## OpenTelemetry Spring Boot starter + +{{% alert title="Note" color="info" %}} + +You can also use the Java agent to instrument your Spring Boot application. The +pros and cons are described in the [overview page](..). + +{{% /alert %}} + +### Compatibility + +The OpenTelemetry Spring Boot starter works with Spring Boot 2.0 and 3.0, and +Spring Boot native image applications. The +[opentelemetry-java-examples/spring-native](https://github.com/open-telemetry/opentelemetry-java-examples/tree/main/spring-native) +repository contains an example of a Spring Boot Native image application +instrumented using the OpenTelemetry Spring Boot starter. + +### Dependency management + +A Bill of Material +([BOM](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms)) +ensures that versions of dependencies (including transitive ones) are aligned. + +Importing the `opentelemetry-bom` and `opentelemetry-instrumentation-bom-alpha` +BOMs when using the OpenTelemetry starter is important to ensure version +alignment across all OpenTelemetry dependencies. + +The following example shows how to import both BOMs using Maven: + +```xml + + + + io.opentelemetry + opentelemetry-bom + {{% param vers.otel %}} + pom + import + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-bom-alpha + {{% param vers.instrumentation %}}-alpha + pom + import + + + +``` + +With Gradle and Spring Boot, you have +[two ways](https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/) +to import a BOM. + +You can use the Gradle’s native BOM support by adding `dependencies`: + +```kotlin +import org.springframework.boot.gradle.plugin.SpringBootPlugin + +plugins { + id("java") + id("org.springframework.boot") version "3.2.O" +} + +dependencies { + implementation(platform(SpringBootPlugin.BOM_COORDINATES)) + implementation(platform("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}")) + implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:{{% param vers.instrumentation %}}-alpha")) +} +``` + +The other way with Gradle is to use the `io.spring.dependency-management` plugin +and to import the BOMs in `dependencyManagement`: + +```kotlin +plugins { + id("java") + id("org.springframework.boot") version "3.2.O" + id("io.spring.dependency-management") version "1.1.0" +} + +dependencyManagement { + imports { + mavenBom("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}") + mavenBom("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:{{% param vers.instrumentation %}}-alpha") + } +} +``` + +{{% alert title="Note" color="info" %}} + +Be careful not to mix up the different ways of configuring things with Gradle. +For example, don't use +`implementation(platform("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}"))` +with the `io.spring.dependency-management` plugin. + +{{% /alert %}} + +#### OpenTelemetry Starter dependency + +Add the dependency given below to enable the OpenTelemetry starter. + +The OpenTelemetry starter uses OpenTelemetry Spring Boot +[autoconfiguration](https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.auto-configuration). + +{{< tabpane text=true >}} {{% tab header="Maven (`pom.xml`)" lang=Maven %}} + +```xml + + + io.opentelemetry.instrumentation + opentelemetry-spring-boot-starter + + +``` + +{{% /tab %}} {{% tab header="Gradle (`gradle.build`)" lang=Gradle %}} + +```kotlin +dependencies { + implementation("io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter") +} +``` + +{{% /tab %}} {{< /tabpane>}} diff --git a/content/en/docs/zero-code/java/spring-boot-starter/other-spring-autoconfig.md b/content/en/docs/zero-code/java/spring-boot-starter/other-spring-autoconfig.md new file mode 100644 index 000000000000..d22be5345cf1 --- /dev/null +++ b/content/en/docs/zero-code/java/spring-boot-starter/other-spring-autoconfig.md @@ -0,0 +1,70 @@ +--- +title: Other Spring autoconfigurations +description: Spring autoconfigurations without the OpenTelemetry Spring starter +cSpell:ignore: autoconfigurations +weight: 70 +--- + +Instead of using the OpenTelemetry Spring starter, you can use the OpenTelemetry +autoconfiguration features with an annotation or the Zipkin starter. + +## Spring support + +Autoconfiguration is natively supported by Spring Boot applications. To enable +these features in "vanilla" use `@EnableOpenTelemetry` to complete a component +scan of this package. + +```java +import io.opentelemetry.instrumentation.spring.autoconfigure.EnableOpenTelemetry; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableOpenTelemetry +public class OpenTelemetryConfig {} +``` + +## Zipkin starter + +OpenTelemetry Zipkin Exporter Starter is a starter package that includes the +opentelemetry-api, opentelemetry-sdk, opentelemetry-extension-annotations, +opentelemetry-logging-exporter, opentelemetry-spring-boot-autoconfigurations and +spring framework starters required to setup distributed tracing. It also +provides the +[opentelemetry-exporters-zipkin](https://github.com/open-telemetry/opentelemetry-java/tree/main/exporters/zipkin) +artifact and corresponding exporter autoconfiguration. Check out +[opentelemetry-spring-boot-autoconfigure](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/spring/spring-boot-autoconfigure/README.md#features) +for the list of supported libraries and features. + +If an exporter is present in the classpath during runtime and a spring bean of +the exporter is missing from the spring application context, an exporter bean is +initialized and added to a simple span processor in the active tracer provider. +Check out the implementation +[here](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java). + +{{< tabpane text=true >}} {{% tab header="Maven (`pom.xml`)" lang=Maven %}} + +```xml + + + io.opentelemetry + opentelemetry-exporter-zipkin + {{% param vers.otel %}} + + +``` + +{{% /tab %}} {{% tab header="Gradle (`gradle.build`)" lang=Gradle %}} + +```kotlin +dependencies { + implementation("io.opentelemetry:opentelemetry-exporter-zipkin:{{% param vers.otel %}}") +} +``` + +{{% /tab %}} {{< /tabpane>}} + +### Configurations + +| Property | Default Value | ConditionalOnClass | +| ------------------------------ | ------------- | -------------------- | +| `otel.exporter.zipkin.enabled` | true | `ZipkinSpanExporter` | diff --git a/content/en/docs/zero-code/java/spring-boot-starter/out-of-the-box-instrumentation.md b/content/en/docs/zero-code/java/spring-boot-starter/out-of-the-box-instrumentation.md new file mode 100644 index 000000000000..93584855c51b --- /dev/null +++ b/content/en/docs/zero-code/java/spring-boot-starter/out-of-the-box-instrumentation.md @@ -0,0 +1,186 @@ +--- +title: Out of the box instrumentation +description: Out of the box instrumentation for the starter +aliases: [../annotations] +weight: 40 +cSpell:ignore: autoconfigurations autoconfigures logback webflux webmvc +--- + +Out of the box instrumentation is available for several frameworks: + +| Feature | Property | Default Value | +| --------------------- | ----------------------------------------------- | ------------- | +| JDBC | `otel.instrumentation.jdbc.enabled` | true | +| Logback | `otel.instrumentation.logback-appender.enabled` | true | +| Spring Web | `otel.instrumentation.spring-web.enabled` | true | +| Spring Web MVC | `otel.instrumentation.spring-webmvc.enabled` | true | +| Spring WebFlux | `otel.instrumentation.spring-webflux.enabled` | true | +| Kafka | `otel.instrumentation.kafka.enabled` | true | +| MongoDB | `otel.instrumentation.mongo.enabled` | true | +| Micrometer | `otel.instrumentation.micrometer.enabled` | false | +| R2DBC (reactive JDBC) | `otel.instrumentation.r2dbc.enabled` | true | + +## Common instrumentation configuration + +Common properties for all database instrumentations: + +| System property | Type | Default | Description | +| ------------------------------------------------------------ | ------- | ------- | -------------------------------------- | +| `otel.instrumentation.common.db-statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | + +## JDBC Instrumentation + +| System property | Type | Default | Description | +| ------------------------------------------------------- | ------- | ------- | -------------------------------------- | +| `otel.instrumentation.jdbc.statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | + +## Logback + +You can enable experimental features with system properties to capture +attributes : + +| System property | Type | Default | Description | +| -------------------------------------------------------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| `otel.instrumentation.logback-appender.experimental-log-attributes` | Boolean | false | Enable the capture of experimental log attributes `thread.name` and `thread.id`. | +| `otel.instrumentation.logback-appender.experimental.capture-code-attributes` | Boolean | false | Enable the capture of [source code attributes]. Note that capturing source code attributes at logging sites might add a performance overhead. | +| `otel.instrumentation.logback-appender.experimental.capture-marker-attribute` | Boolean | false | Enable the capture of Logback markers as attributes. | +| `otel.instrumentation.logback-appender.experimental.capture-key-value-pair-attributes` | Boolean | false | Enable the capture of Logback key value pairs as attributes. | +| `otel.instrumentation.logback-appender.experimental.capture-logger-context-attributes` | Boolean | false | Enable the capture of Logback logger context properties as attributes. | +| `otel.instrumentation.logback-appender.experimental.capture-mdc-attributes` | String | | Comma separated list of MDC attributes to capture. Use the wildcard character `*` to capture all attributes. | + +[source code attributes]: + /docs/specs/semconv/general/attributes/#source-code-attributes + +Alternatively, you can enable these features by adding the OpenTelemetry Logback +appender in your `logback.xml` or `logback-spring.xml` file: + +```xml + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + false + true + true + true + true + * + + + + + + +``` + +## Spring Web Autoconfiguration + +Provides autoconfiguration for the `RestTemplate` trace interceptor defined in +[opentelemetry-spring-web-3.1](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-web/spring-web-3.1/library). +This autoconfiguration instruments all requests sent using Spring `RestTemplate` +beans by applying a `RestTemplate` bean post processor. This feature is +supported for spring web versions 3.1+. To learn more about the OpenTelemetry +`RestTemplate` interceptor, see +[opentelemetry-spring-web-3.1](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-web/spring-web-3.1/library). + +The following ways of creating a `RestTemplate` are supported: + +```java +@Bean +public RestTemplate restTemplate() { + return new RestTemplate(); +} +``` + +```java +public MyService(RestTemplateBuilder restTemplateBuilder) { + this.restTemplate = restTemplateBuilder.build(); +} +``` + +The following ways of creating a `RestClient` are supported: + +```java +@Bean +public RestClient restClient() { + return RestClient.create(); +} +``` + +```java +public MyService(RestClient.Builder restClientBuilder) { + this.restClient = restClientBuilder.build(); +} +``` + +## Spring Web MVC Autoconfiguration + +This feature autoconfigures instrumentation for Spring WebMVC controllers by +adding a +[telemetry producing servlet `Filter`](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/WebMvcTelemetryProducingFilter.java) +bean to the application context. The filter decorates the request execution with +a server span, propagating the incoming tracing context if received in the HTTP +request. To learn more about the OpenTelemetry Spring WebMVC instrumentation, +see the +[opentelemetry-spring-webmvc-5.3 instrumentation library](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library). + +## Spring WebFlux Autoconfiguration + +Provides autoconfigurations for the OpenTelemetry WebClient ExchangeFilter +defined in +[opentelemetry-spring-webflux-5.3](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-webflux/spring-webflux-5.3/library). +This autoconfiguration instruments all outgoing HTTP requests sent using +Spring's WebClient and WebClient Builder beans by applying a bean post +processor. This feature is supported for spring webflux versions 5.0+. For +details, see +[opentelemetry-spring-webflux-5.3](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-webflux/spring-webflux-5.3/library). + +The following ways of creating a `WebClient` are supported: + +```java +@Bean +public WebClient webClient() { + return WebClient.create(); +} +``` + +```java +public MyService(WebClient.Builder webClientBuilder) { + this.webClient = webClientBuilder.build(); +} +``` + +## Kafka Instrumentation + +Provides autoconfiguration for the Kafka client instrumentation. + +| System property | Type | Default | Description | +| --------------------------------------------------------- | ------- | ------- | ---------------------------------------------------- | +| `otel.instrumentation.kafka.experimental-span-attributes` | Boolean | false | Enables the capture of experimental span attributes. | + +## Micrometer Instrumentation + +Provides autoconfiguration for the Micrometer to OpenTelemetry bridge. + +## MongoDB Instrumentation + +Provides autoconfiguration for the MongoDB client instrumentation. + +| System property | Type | Default | Description | +| -------------------------------------------------------- | ------- | ------- | -------------------------------------- | +| `otel.instrumentation.mongo.statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | + +## R2DBC Instrumentation + +Provides autoconfiguration for the OpenTelemetry R2DBC instrumentation. + +| System property | Type | Default | Description | +| -------------------------------------------------------- | ------- | ------- | -------------------------------------- | +| `otel.instrumentation.r2dbc.statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | diff --git a/content/en/docs/zero-code/java/spring-boot-starter/sdk-configuration.md b/content/en/docs/zero-code/java/spring-boot-starter/sdk-configuration.md new file mode 100644 index 000000000000..52704620091c --- /dev/null +++ b/content/en/docs/zero-code/java/spring-boot-starter/sdk-configuration.md @@ -0,0 +1,266 @@ +--- +title: SDK configuration +description: Configure the SDK with the OpenTelemetry starter +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/languages/java/automatic/configuration/#sdk-autoconfiguration) +(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 (`gradle.build`)" lang=Gradle %}} + +```kotlin +dependencies { + implementation("io.opentelemetry.contrib:opentelemetry-samplers:1.33.0-alpha") +} +``` + +{{% /tab %}} {{< /tabpane>}} + +```java +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.contrib.sampler.RuleBasedRoutingSampler; +import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; +import io.opentelemetry.semconv.SemanticAttributes; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OpenTelemetryConfig { + + @Bean + public AutoConfigurationCustomizerProvider otelCustomizer() { + return p -> + p.addSamplerCustomizer( + (fallback, config) -> + RuleBasedRoutingSampler.builder(SpanKind.SERVER, fallback) + .drop(SemanticAttributes.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 +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 OpenTelemetryConfig { + + @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/languages/java/automatic/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.version` from `build-info.properties` (see [Service name](#service-name)) | +| `service.version` | `build.name` 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 (`gradle.build`)" lang=Gradle %}} + +```kotlin +springBoot { + buildInfo { + } +} +``` + +{{% /tab %}} {{< /tabpane>}} diff --git a/content/en/docs/zero-code/java/spring-boot/_index.md b/content/en/docs/zero-code/java/spring-boot/_index.md deleted file mode 100644 index 859e6ac671a7..000000000000 --- a/content/en/docs/zero-code/java/spring-boot/_index.md +++ /dev/null @@ -1,744 +0,0 @@ ---- -title: Spring Boot -description: Spring Boot instrumentation for OpenTelemetry Java -aliases: [/docs/languages/java/automatic/spring-boot/] -# prettier-ignore -cSpell:ignore: autoconfigurations autoconfigures customizer datasource distro logback springboot webflux webmvc ---- - -## How to instrument Spring Boot with OpenTelemetry - -The [OpenTelemetry Java agent](..) with byte code instrumentation can cover most -of your needs when instrumenting -[Spring Boot](https://spring.io/projects/spring-boot) applications. - -Alternatively, the OpenTelemetry [Spring Boot starter] can help you in the -following cases: - -- Spring Boot Native image applications for which the OpenTelemetry Java agent - does not work -- Startup overhead of the OpenTelemetry Java agent exceeds your requirements -- OpenTelemetry Java agent might not work if your application already uses - another Java monitoring agent -- You can use the Spring Boot configuration files (`application.properties`, - `application.yml`) to configure the OpenTelemetry Spring Boot starter which - doesn't work with the OpenTelemetry Java agent - -[Spring Boot starter]: - https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using.build-systems.starters - -The OpenTelemetry Java agent has more automatic instrumentation features than -the OpenTelemetry starter. - -You can use -[OpenTelemetry instrumentations libraries](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md#libraries--frameworks) -to complete the automatic instrumentation of the Spring Boot starter. - -## OpenTelemetry Spring Boot starter - -### Compatibility - -The OpenTelemetry Spring Boot starter works with Spring Boot 2.0 and 3.0, and -Spring Boot native image applications. The -[opentelemetry-java-examples/spring-native](https://github.com/open-telemetry/opentelemetry-java-examples/tree/main/spring-native) -repository contains an example of a Spring Boot Native image application -instrumented using the OpenTelemetry Spring Boot starter. - -### Dependency management - -A Bill of Material -([BOM](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms)) -ensures that versions of dependencies (including transitive ones) are aligned. - -Importing the `opentelemetry-bom` and `opentelemetry-instrumentation-bom-alpha` -BOMs when using the OpenTelemetry starter is important to ensure version -alignment across all OpenTelemetry dependencies. - -The following example shows how to import both BOMs using Maven: - -```xml - - - - io.opentelemetry - opentelemetry-bom - {{% param vers.otel %}} - pom - import - - - io.opentelemetry.instrumentation - opentelemetry-instrumentation-bom-alpha - {{% param vers.instrumentation %}}-alpha - pom - import - - - -``` - -With Gradle and Spring Boot, you have -[two ways](https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/) -to import a BOM. - -You can use the Gradle’s native BOM support by adding `dependencies`: - -```kotlin -import org.springframework.boot.gradle.plugin.SpringBootPlugin - -plugins { - id("java") - id("org.springframework.boot") version "3.2.O" -} - -dependencies { - implementation(platform(SpringBootPlugin.BOM_COORDINATES)) - implementation(platform("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}")) - implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:{{% param vers.instrumentation %}}-alpha")) -} -``` - -The other way with Gradle is to use the `io.spring.dependency-management` plugin -and to import the BOMs in `dependencyManagement`: - -```kotlin -plugins { - id("java") - id("org.springframework.boot") version "3.2.O" - id("io.spring.dependency-management") version "1.1.0" -} - -dependencyManagement { - imports { - mavenBom("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}") - mavenBom("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:{{% param vers.instrumentation %}}-alpha") - } -} -``` - -{{% alert title="Note" color="info" %}} - -Be careful not to mix up the different ways of configuring things with Gradle. -For example, don't use -`implementation(platform("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}"))` -with the `io.spring.dependency-management` plugin. - -{{% /alert %}} - -#### OpenTelemetry Starter dependency - -Add the dependency given below to enable the OpenTelemetry starter. - -The OpenTelemetry starter uses OpenTelemetry Spring Boot -[autoconfiguration](https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.auto-configuration). - -{{< tabpane text=true >}} {{% tab header="Maven (`pom.xml`)" lang=Maven %}} - -```xml - - - io.opentelemetry.instrumentation - opentelemetry-spring-boot-starter - - -``` - -{{% /tab %}} {{% tab header="Gradle (`gradle.build`)" lang=Gradle %}} - -```kotlin -dependencies { - implementation("io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter") -} -``` - -{{% /tab %}} {{< /tabpane>}} - -### Configuration - -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/languages/java/automatic/configuration/#sdk-autoconfiguration) -(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 (`gradle.build`)" lang=Gradle %}} - -```kotlin -dependencies { - implementation("io.opentelemetry.contrib:opentelemetry-samplers:1.33.0-alpha") -} -``` - -{{% /tab %}} {{< /tabpane>}} - -```java -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.contrib.sampler.RuleBasedRoutingSampler; -import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; -import io.opentelemetry.semconv.SemanticAttributes; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class OpenTelemetryConfig { - - @Bean - public AutoConfigurationCustomizerProvider otelCustomizer() { - return p -> - p.addSamplerCustomizer( - (fallback, config) -> - RuleBasedRoutingSampler.builder(SpanKind.SERVER, fallback) - .drop(SemanticAttributes.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 -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 OpenTelemetryConfig { - - @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/languages/java/automatic/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.version` from `build-info.properties` (see [Service name](#service-name)) | -| `service.version` | `build.name` 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 (`gradle.build`)" lang=Gradle %}} - -```kotlin -springBoot { - buildInfo { - } -} -``` - -{{% /tab %}} {{< /tabpane>}} - -### Automatic instrumentation - -Automatic instrumentation is available for several frameworks: - -| Feature | Property | Default Value | -| --------------------- | ----------------------------------------------- | ------------- | -| JDBC | `otel.instrumentation.jdbc.enabled` | true | -| Logback | `otel.instrumentation.logback-appender.enabled` | true | -| Spring Web | `otel.instrumentation.spring-web.enabled` | true | -| Spring Web MVC | `otel.instrumentation.spring-webmvc.enabled` | true | -| Spring WebFlux | `otel.instrumentation.spring-webflux.enabled` | true | -| Kafka | `otel.instrumentation.kafka.enabled` | true | -| MongoDB | `otel.instrumentation.mongo.enabled` | true | -| Micrometer | `otel.instrumentation.micrometer.enabled` | false | -| R2DBC (reactive JDBC) | `otel.instrumentation.r2dbc.enabled` | true | - -#### Common instrumentation configuration - -Common properties for all database instrumentations: - -| System property | Type | Default | Description | -| ------------------------------------------------------------ | ------- | ------- | -------------------------------------- | -| `otel.instrumentation.common.db-statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | - -#### JDBC Instrumentation - -| System property | Type | Default | Description | -| ------------------------------------------------------- | ------- | ------- | -------------------------------------- | -| `otel.instrumentation.jdbc.statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | - -#### Logback - -You can enable experimental features with system properties to capture -attributes : - -| System property | Type | Default | Description | -| -------------------------------------------------------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| `otel.instrumentation.logback-appender.experimental-log-attributes` | Boolean | false | Enable the capture of experimental log attributes `thread.name` and `thread.id`. | -| `otel.instrumentation.logback-appender.experimental.capture-code-attributes` | Boolean | false | Enable the capture of [source code attributes]. Note that capturing source code attributes at logging sites might add a performance overhead. | -| `otel.instrumentation.logback-appender.experimental.capture-marker-attribute` | Boolean | false | Enable the capture of Logback markers as attributes. | -| `otel.instrumentation.logback-appender.experimental.capture-key-value-pair-attributes` | Boolean | false | Enable the capture of Logback key value pairs as attributes. | -| `otel.instrumentation.logback-appender.experimental.capture-logger-context-attributes` | Boolean | false | Enable the capture of Logback logger context properties as attributes. | -| `otel.instrumentation.logback-appender.experimental.capture-mdc-attributes` | String | | Comma separated list of MDC attributes to capture. Use the wildcard character `*` to capture all attributes. | - -[source code attributes]: - /docs/specs/semconv/general/attributes/#source-code-attributes - -Alternatively, you can enable these features by adding the OpenTelemetry Logback -appender in your `logback.xml` or `logback-spring.xml` file: - -```xml - - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - false - true - true - true - true - * - - - - - - -``` - -#### Spring Web Autoconfiguration - -Provides autoconfiguration for the `RestTemplate` trace interceptor defined in -[opentelemetry-spring-web-3.1](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-web/spring-web-3.1/library). -This autoconfiguration instruments all requests sent using Spring `RestTemplate` -beans by applying a `RestTemplate` bean post processor. This feature is -supported for spring web versions 3.1+. To learn more about the OpenTelemetry -`RestTemplate` interceptor, see -[opentelemetry-spring-web-3.1](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-web/spring-web-3.1/library). - -The following ways of creating a `RestTemplate` are supported: - -```java -@Bean -public RestTemplate restTemplate() { - return new RestTemplate(); -} -``` - -```java -public MyService(RestTemplateBuilder restTemplateBuilder) { - this.restTemplate = restTemplateBuilder.build(); -} -``` - -The following ways of creating a `RestClient` are supported: - -```java -@Bean -public RestClient restClient() { - return RestClient.create(); -} -``` - -```java -public MyService(RestClient.Builder restClientBuilder) { - this.restClient = restClientBuilder.build(); -} -``` - -#### Spring Web MVC Autoconfiguration - -This feature autoconfigures instrumentation for Spring WebMVC controllers by -adding a -[telemetry producing servlet `Filter`](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/WebMvcTelemetryProducingFilter.java) -bean to the application context. The filter decorates the request execution with -a server span, propagating the incoming tracing context if received in the HTTP -request. To learn more about the OpenTelemetry Spring WebMVC instrumentation, -see the -[opentelemetry-spring-webmvc-5.3 instrumentation library](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library). - -#### Spring WebFlux Autoconfiguration - -Provides autoconfigurations for the OpenTelemetry WebClient ExchangeFilter -defined in -[opentelemetry-spring-webflux-5.3](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-webflux/spring-webflux-5.3/library). -This autoconfiguration instruments all outgoing HTTP requests sent using -Spring's WebClient and WebClient Builder beans by applying a bean post -processor. This feature is supported for spring webflux versions 5.0+. For -details, see -[opentelemetry-spring-webflux-5.3](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/spring/spring-webflux/spring-webflux-5.3/library). - -The following ways of creating a `WebClient` are supported: - -```java -@Bean -public WebClient webClient() { - return WebClient.create(); -} -``` - -```java -public MyService(WebClient.Builder webClientBuilder) { - this.webClient = webClientBuilder.build(); -} -``` - -#### Kafka Instrumentation - -Provides autoconfiguration for the Kafka client instrumentation. - -| System property | Type | Default | Description | -| --------------------------------------------------------- | ------- | ------- | ---------------------------------------------------- | -| `otel.instrumentation.kafka.experimental-span-attributes` | Boolean | false | Enables the capture of experimental span attributes. | - -#### Micrometer Instrumentation - -Provides autoconfiguration for the Micrometer to OpenTelemetry bridge. - -#### MongoDB Instrumentation - -Provides autoconfiguration for the MongoDB client instrumentation. - -| System property | Type | Default | Description | -| -------------------------------------------------------- | ------- | ------- | -------------------------------------- | -| `otel.instrumentation.mongo.statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | - -#### R2DBC Instrumentation - -Provides autoconfiguration for the OpenTelemetry R2DBC instrumentation. - -| System property | Type | Default | Description | -| -------------------------------------------------------- | ------- | ------- | -------------------------------------- | -| `otel.instrumentation.r2dbc.statement-sanitizer.enabled` | Boolean | true | Enables the DB statement sanitization. | - -### Additional Instrumentations - -#### Log4j2 Instrumentation - -You have to add the OpenTelemetry appender to your `log4j2.xml` file: - -```xml - - - - - - - - - - - -``` - -You can find more configuration options for the OpenTelemetry appender in the -[Log4j](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/log4j/log4j-appender-2.17/library/README.md) -instrumentation library. - -| System property | Type | Default | Description | -| --------------------------------------------- | ------- | ------- | ----------------------------------------------------------------------------------------------- | -| `otel.instrumentation.log4j-appender.enabled` | Boolean | true | Enables the configuration of the Log4j OpenTelemetry appender with an `OpenTelemetry` instance. | - -#### Instrumentation Annotations - -This feature uses spring-aop to wrap methods annotated with `@WithSpan` in a -span. The arguments to the method can be captured as attributed on the created -span by annotating the method parameters with `@SpanAttribute`. - -> **Note**: this annotation can only be applied to bean methods managed by the -> spring application context. To learn more about aspect weaving in spring, see -> [spring-aop](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop). - -| Feature | Property | Default Value | Description | -| ----------- | ------------------------------------------ | ------------- | --------------------------------- | -| `@WithSpan` | `otel.instrumentation.annotations.enabled` | true | Enables the WithSpan annotations. | - -```java -import org.springframework.stereotype.Component; - -import io.opentelemetry.instrumentation.annotations.SpanAttribute; -import io.opentelemetry.instrumentation.annotations.WithSpan; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanKind; - -/** - * Test WithSpan - */ -@Component -public class TracedClass { - - @WithSpan - public void tracedMethod() { - } - - @WithSpan(value="span name") - public void tracedMethodWithName() { - Span currentSpan = Span.current(); - currentSpan.addEvent("ADD EVENT TO tracedMethodWithName SPAN"); - currentSpan.setAttribute("isTestAttribute", true); - } - - @WithSpan(kind = SpanKind.CLIENT) - public void tracedClientSpan() { - } - - public void tracedMethodWithAttribute(@SpanAttribute("attributeName") String parameter) { - } -} -``` - -#### OpenTelemetry instrumentations libraries - -You can configure other instrumentations with -[OpenTelemetry instrumentations libraries](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md#libraries--frameworks). - -## Other solutions - -Instead of using the OpenTelemetry Spring starter, you can use the OpenTelemetry -autoconfiguration features with an annotation or the Zipkin starter. - -### Spring support - -Autoconfiguration is natively supported by Spring Boot applications. To enable -these features in "vanilla" use `@EnableOpenTelemetry` to complete a component -scan of this package. - -```java -import io.opentelemetry.instrumentation.spring.autoconfigure.EnableOpenTelemetry; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableOpenTelemetry -public class OpenTelemetryConfig {} -``` - -### Zipkin starter - -OpenTelemetry Zipkin Exporter Starter is a starter package that includes the -opentelemetry-api, opentelemetry-sdk, opentelemetry-extension-annotations, -opentelemetry-logging-exporter, opentelemetry-spring-boot-autoconfigurations and -spring framework starters required to setup distributed tracing. It also -provides the -[opentelemetry-exporters-zipkin](https://github.com/open-telemetry/opentelemetry-java/tree/main/exporters/zipkin) -artifact and corresponding exporter autoconfiguration. Check out -[opentelemetry-spring-boot-autoconfigure](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/spring/spring-boot-autoconfigure/README.md#features) -for the list of supported libraries and features. - -If an exporter is present in the classpath during runtime and a spring bean of -the exporter is missing from the spring application context, an exporter bean is -initialized and added to a simple span processor in the active tracer provider. -Check out the implementation -[here](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java). - -{{< tabpane text=true >}} {{% tab header="Maven (`pom.xml`)" lang=Maven %}} - -```xml - - - io.opentelemetry - opentelemetry-exporter-zipkin - {{% param vers.otel %}} - - -``` - -{{% /tab %}} {{% tab header="Gradle (`gradle.build`)" lang=Gradle %}} - -```kotlin -dependencies { - implementation("io.opentelemetry:opentelemetry-exporter-zipkin:{{% param vers.otel %}}") -} -``` - -{{% /tab %}} {{< /tabpane>}} - -#### Configurations - -| Property | Default Value | ConditionalOnClass | -| ------------------------------ | ------------- | -------------------- | -| `otel.exporter.zipkin.enabled` | true | `ZipkinSpanExporter` |