diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/build.gradle.kts b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/build.gradle.kts index c5db3fdd76a1..3f3b0b13a763 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/build.gradle.kts +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/build.gradle.kts @@ -57,17 +57,4 @@ tasks { dependsOn(testPS) dependsOn(testSerial) } - - tasks { - compileJava { - // We compile this module for java 8 because it is used as a dependency in spring-boot-autoconfigure. - // If this module is compiled for java 17 then gradle can figure out based on the metadata that - // spring-boot-autoconfigure has a dependency that requires 17 and fails the build when it is used - // in a project that targets an earlier java version. - // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/13384 - sourceCompatibility = "1.8" - targetCompatibility = "1.8" - options.release.set(null as Int?) - } - } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 681fdcb45b81..992ca1c4a527 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -54,7 +54,6 @@ dependencies { compileOnly("ch.qos.logback:logback-classic:1.0.0") implementation(project(":instrumentation:jdbc:library")) implementation(project(":instrumentation:runtime-telemetry:runtime-telemetry-java8:library")) - implementation(project(":instrumentation:runtime-telemetry:runtime-telemetry-java17:library")) library("org.springframework.kafka:spring-kafka:2.9.0") library("org.springframework.boot:spring-boot-starter-actuator:$springBootVersion") @@ -99,6 +98,7 @@ dependencies { // needed for the Spring Boot 3 support implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library")) + compileOnly(project(":instrumentation:runtime-telemetry:runtime-telemetry-java17:library")) // give access to common classes, e.g. InstrumentationConfigUtil add("javaSpring3CompileOnly", files(sourceSets.main.get().output.classesDirs)) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java deleted file mode 100644 index 8f258004a853..000000000000 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; -import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; -import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Configures runtime metrics collection for Java 17+. - * - *
This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public class Java17RuntimeMetricsProvider implements RuntimeMetricsProvider { - private static final Logger logger = LoggerFactory.getLogger(Java17RuntimeMetricsProvider.class); - - @Override - public int minJavaVersion() { - return 17; - } - - @Override - public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { - logger.debug("Use runtime metrics instrumentation for Java 17+"); - return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), config); - } -} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsAutoConfiguration.java new file mode 100644 index 000000000000..403b2671e626 --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsAutoConfiguration.java @@ -0,0 +1,50 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; +import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnJava; +import org.springframework.boot.system.JavaVersion; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configures runtime metrics collection for Java 17+. + * + *
This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +@Configuration +@ConditionalOnJava(JavaVersion.SEVENTEEN) +@ConditionalOnClass(RuntimeMetrics.class) +public class Java17RuntimeMetricsAutoConfiguration { + private static final Logger logger = + LoggerFactory.getLogger(Java17RuntimeMetricsAutoConfiguration.class); + + static final String JAVA_17_RUNTIME_METRICS_PROVIDER_BEAN_NAME = "java17RuntimeMetricsProvider"; + + @Bean(name = JAVA_17_RUNTIME_METRICS_PROVIDER_BEAN_NAME) + RuntimeMetricsProvider java17RuntimeMetricsProvider() { + return new RuntimeMetricsProvider() { + @Override + public int minJavaVersion() { + return 17; + } + + @Override + public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { + logger.debug("Use runtime metrics instrumentation for Java 17+"); + return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), config); + } + }; + } +} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsBeanRegistrationExcludeFilter.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsBeanRegistrationExcludeFilter.java index e6b98f3fa675..556ae77dd2a1 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsBeanRegistrationExcludeFilter.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsBeanRegistrationExcludeFilter.java @@ -20,6 +20,7 @@ public boolean isExcludedFromAotProcessing(RegisteredBean registeredBean) { // The JFR-based runtime metric code is excluded from the Spring AOT processing step. // That way, this code is not included in a Spring native image application. - return Java17RuntimeMetricsProvider.class.getName().equals(registeredBean.getBeanName()); + return Java17RuntimeMetricsAutoConfiguration.JAVA_17_RUNTIME_METRICS_PROVIDER_BEAN_NAME.equals( + registeredBean.getBeanName()); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index cb026785d354..050a2a64d017 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -13,7 +13,7 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.w io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.scheduling.SpringSchedulingInstrumentationAutoConfiguration,\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration,\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider,\ -io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider +io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsAutoConfiguration org.springframework.context.ApplicationListener=\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging.LogbackAppenderApplicationListener diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 2392e0c35592..ab9a0421ecfd 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -13,4 +13,4 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.w io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.scheduling.SpringSchedulingInstrumentationAutoConfiguration io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider -io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider +io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsAutoConfiguration diff --git a/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts b/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts index e04442dd47f8..43ddb30bd335 100644 --- a/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts +++ b/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) implementation(project(":smoke-tests-otel-starter:spring-boot-common")) + implementation(project(":instrumentation:runtime-telemetry:runtime-telemetry-java17:library")) testImplementation("org.testcontainers:junit-jupiter") testImplementation("org.testcontainers:kafka") testImplementation("org.testcontainers:mongodb")