From 478306d9ee174676b3a4f5ce7b6df1a004c7717b Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sun, 23 Nov 2025 09:06:19 -0500 Subject: [PATCH 1/3] Update spring-boot-actuator-autoconfigure for spring boot 4 --- .../javaagent/build.gradle.kts | 10 ++++++---- ...nfigurationImportSelectorInstrumentation.java | 4 +++- ...nTelemetryMeterRegistryAutoConfiguration.java | 16 ++++++++++++---- .../AdditionalLibraryIgnoredTypesConfigurer.java | 2 ++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts index 336e7403c411..f5fabae09f7d 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts @@ -12,17 +12,21 @@ muzzle { } } +val latestDepTest = findProperty("testLatestDeps") as Boolean + dependencies { library("org.springframework.boot:spring-boot-actuator-autoconfigure:2.0.0.RELEASE") library("io.micrometer:micrometer-core:1.5.0") testLibrary("io.micrometer:micrometer-registry-prometheus:1.0.1") + if (latestDepTest) { + testLibrary("org.springframework.boot:spring-boot-starter-micrometer-metrics:4.0.0") + } + implementation(project(":instrumentation:micrometer:micrometer-1.5:javaagent")) // dependency management pins logback-classic to 1.3 which is the last release that supports java 8 latestDepTestLibrary("ch.qos.logback:logback-classic:latest.release") - // tests don't work with spring boot 4 yet - latestDepTestLibrary("org.springframework.boot:spring-boot-actuator-autoconfigure:3.+") // documented limitation } tasks.withType().configureEach { @@ -33,8 +37,6 @@ tasks.withType().configureEach { jvmArgs("-Dotel.instrumentation.spring-boot-actuator-autoconfigure.enabled=true") } -val latestDepTest = findProperty("testLatestDeps") as Boolean - // spring 6 (spring boot 3) requires java 17 if (latestDepTest) { otelJava { diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java index a8f31e84b14f..cafcb489ae89 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java @@ -39,7 +39,9 @@ public static class GetCandidateConfigurationsAdvice { public static List onExit(@Advice.Return List originalConfigurations) { List configurations = originalConfigurations; if (configurations.contains( - "org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration")) { + "org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration") + || configurations.contains( + "org.springframework.boot.micrometer.metrics.autoconfigure.MetricsAutoConfiguration")) { List configs = new ArrayList<>(configurations.size() + 1); configs.addAll(configurations); // using class reference here so that muzzle will consider it a dependency of this advice diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java index fe207bb6cf9b..cd4d7e8fff25 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java @@ -16,8 +16,6 @@ import java.util.List; import java.util.Set; import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration; -import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -27,11 +25,21 @@ @Configuration // CompositeMeterRegistryAutoConfiguration configures the "final" composite registry -@AutoConfigureBefore(CompositeMeterRegistryAutoConfiguration.class) +// Spring Boot 2.x-3.x location and Spring Boot 4.x location (package changed in 4.x) +@AutoConfigureBefore( + name = { + "org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration", + "org.springframework.boot.micrometer.metrics.autoconfigure.CompositeMeterRegistryAutoConfiguration" + }) // configure after the SimpleMeterRegistry has initialized; it is normally the last MeterRegistry // implementation to be configured, as it's used as a fallback // the OTel registry should be added in addition to that fallback and not replace it -@AutoConfigureAfter(SimpleMetricsExportAutoConfiguration.class) +// Spring Boot 2.x-3.x location and Spring Boot 4.x location (package changed in 4.x) +@AutoConfigureAfter( + name = { + "org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration", + "org.springframework.boot.micrometer.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration" + }) @ConditionalOnBean(Clock.class) @ConditionalOnClass(MeterRegistry.class) public class OpenTelemetryMeterRegistryAutoConfiguration { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java index 7b51eeb3ad0c..c97e34993b76 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/AdditionalLibraryIgnoredTypesConfigurer.java @@ -112,6 +112,8 @@ public void configure(IgnoredTypesBuilder builder) { .allowClass( "org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter$$Lambda") .allowClass("org.springframework.boot.autoconfigure.BackgroundPreinitializer$") + .allowClass( + "org.springframework.boot.autoconfigure.preinitialize.BackgroundPreinitializingApplicationListener$") .allowClass( "org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration$$Lambda") .allowClass("org.springframework.boot.autoconfigure.condition.OnClassCondition$") From 77008773ca33265faad2e0d2691bf9bafa122b6e Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 24 Nov 2025 06:59:29 -0500 Subject: [PATCH 2/3] move comment --- .../OpenTelemetryMeterRegistryAutoConfiguration.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java index cd4d7e8fff25..38c084696106 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java @@ -25,20 +25,18 @@ @Configuration // CompositeMeterRegistryAutoConfiguration configures the "final" composite registry -// Spring Boot 2.x-3.x location and Spring Boot 4.x location (package changed in 4.x) @AutoConfigureBefore( name = { - "org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration", - "org.springframework.boot.micrometer.metrics.autoconfigure.CompositeMeterRegistryAutoConfiguration" + "org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration", // Spring Boot 2.x-3.x location + "org.springframework.boot.micrometer.metrics.autoconfigure.CompositeMeterRegistryAutoConfiguration" // Spring Boot 4.x location }) // configure after the SimpleMeterRegistry has initialized; it is normally the last MeterRegistry // implementation to be configured, as it's used as a fallback // the OTel registry should be added in addition to that fallback and not replace it -// Spring Boot 2.x-3.x location and Spring Boot 4.x location (package changed in 4.x) @AutoConfigureAfter( name = { - "org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration", - "org.springframework.boot.micrometer.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration" + "org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration", // Spring Boot 2.x-3.x location + "org.springframework.boot.micrometer.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration" // Spring Boot 4.x location }) @ConditionalOnBean(Clock.class) @ConditionalOnClass(MeterRegistry.class) From c3c86ec5e9337248b270a60630cb072a46063944 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 24 Nov 2025 12:12:19 -0500 Subject: [PATCH 3/3] add comments --- .../javaagent/build.gradle.kts | 1 + .../v2_0/AutoConfigurationImportSelectorInstrumentation.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts index f5fabae09f7d..b8d52463c0a0 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/build.gradle.kts @@ -20,6 +20,7 @@ dependencies { testLibrary("io.micrometer:micrometer-registry-prometheus:1.0.1") if (latestDepTest) { + // Micrometer moved into its own Spring Boot starter in version 4 testLibrary("org.springframework.boot:spring-boot-starter-micrometer-metrics:4.0.0") } diff --git a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java index cafcb489ae89..f4e8fbb3a4f8 100644 --- a/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java +++ b/instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/AutoConfigurationImportSelectorInstrumentation.java @@ -39,8 +39,10 @@ public static class GetCandidateConfigurationsAdvice { public static List onExit(@Advice.Return List originalConfigurations) { List configurations = originalConfigurations; if (configurations.contains( + // Spring Boot 2.x-3.x location "org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration") || configurations.contains( + // Spring Boot 4.x location "org.springframework.boot.micrometer.metrics.autoconfigure.MetricsAutoConfiguration")) { List configs = new ArrayList<>(configurations.size() + 1); configs.addAll(configurations);