From 05672f2ffab095d9bd0ff13772aaa2027f1317a9 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 20 Oct 2025 15:53:56 -0700 Subject: [PATCH 1/4] Update to Gradle 9.1 --- buildSrc/build.gradle.kts | 7 ++--- .../kotlin/ai.shadow-conventions.gradle.kts | 24 ++++++++++++++- .../main/kotlin/ai.smoke-test-jar.gradle.kts | 30 +++++++++++++++++-- .../gradle/AiSmokeTestExtension.kt | 2 ++ etw/etw-testapp/build.gradle.kts | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 + smoke-tests/apps/ReadOnly/build.gradle.kts | 2 ++ smoke-tests/apps/gRPC/build.gradle.kts | 2 +- 9 files changed, 61 insertions(+), 11 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index fad471e9378..3e807c48b63 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -20,6 +20,7 @@ repositories { mavenCentral() mavenLocal() gradlePluginPortal() + maven("https://central.sonatype.com/repository/maven-snapshots/") } tasks.withType().configureEach { @@ -32,11 +33,11 @@ dependencies { // When updating, update above in plugins too implementation("com.diffplug.spotless:spotless-plugin-gradle:8.0.0") implementation("com.github.spotbugs.snom:spotbugs-gradle-plugin:6.3.0") - implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.9") + implementation("com.gradleup.shadow:shadow-gradle-plugin:9.2.2") implementation("org.owasp:dependency-check-gradle:12.1.8") - implementation("io.opentelemetry.instrumentation:gradle-plugins:2.19.0-alpha") + implementation("io.opentelemetry.instrumentation:gradle-plugins:2.22.0-alpha-SNAPSHOT") implementation("net.ltgt.gradle:gradle-errorprone-plugin:4.3.0") implementation("net.ltgt.gradle:gradle-nullaway-plugin:2.3.0") @@ -44,6 +45,4 @@ dependencies { implementation("gradle.plugin.io.morethan.jmhreport:gradle-jmh-report:0.9.6") implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.3") - // earlier versions aren't compatible with Gradle 8.1.1 - implementation("org.springframework.boot:spring-boot-gradle-plugin:2.5.12") } diff --git a/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts b/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts index 35f12ccf566..a9225f13cff 100644 --- a/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts @@ -1,13 +1,35 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.api.file.DuplicatesStrategy plugins { id("com.gradleup.shadow") } tasks.withType().configureEach { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + mergeServiceFiles() + mergeServiceFiles("META-INF/services/**") mergeServiceFiles { - include("inst/META-INF/services/*") + include("inst/META-INF/services/**") } + filesMatching("META-INF/services/**") { + duplicatesStrategy = DuplicatesStrategy.INCLUDE + } + filesMatching("inst/META-INF/services/**") { + duplicatesStrategy = DuplicatesStrategy.INCLUDE + } + exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA") + exclude( + "META-INF/LICENSE", + "META-INF/NOTICE", + "META-INF/LICENSE.txt", + "META-INF/NOTICE.txt", + "META-INF/INDEX.LIST", + "META-INF/io.netty.versions.properties", + "META-INF/AL2.0", + "META-INF/LGPL2.1" + ) + exclude("META-INF/maven/**") exclude("**/module-info.class") diff --git a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts index bf6a7dcb5ac..99102ad6a02 100644 --- a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts @@ -1,11 +1,35 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.microsoft.applicationinsights.gradle.AiSmokeTestExtension +import org.gradle.api.file.DuplicatesStrategy plugins { id("ai.smoke-test") - id("org.springframework.boot") + id("com.gradleup.shadow") } val aiSmokeTest = extensions.getByType(AiSmokeTestExtension::class) -aiSmokeTest.testAppArtifactDir.set(tasks.bootJar.flatMap { it.destinationDirectory }) -aiSmokeTest.testAppArtifactFilename.set(tasks.bootJar.flatMap { it.archiveFileName }) +aiSmokeTest.mainClass.convention("com.microsoft.applicationinsights.smoketestapp.SpringBootApp") + +val shadowJar = tasks.named("shadowJar") { + archiveClassifier.set("") + archiveVersion.set("") + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + mergeServiceFiles() + mergeServiceFiles("META-INF/spring.factories") + mergeServiceFiles("META-INF/spring.handlers") + mergeServiceFiles("META-INF/spring.schemas") + mergeServiceFiles("META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports") + + manifest { + attributes["Main-Class"] = aiSmokeTest.mainClass.get() + } +} + +tasks.named("assemble") { + dependsOn(shadowJar) +} + +aiSmokeTest.testAppArtifactDir.set(shadowJar.flatMap { it.destinationDirectory }) +aiSmokeTest.testAppArtifactFilename.set(shadowJar.flatMap { it.archiveFileName }) diff --git a/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt b/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt index bce6f0eca04..aefa5067c83 100644 --- a/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt +++ b/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt @@ -10,4 +10,6 @@ abstract class AiSmokeTestExtension { abstract val testAppArtifactFilename: Property abstract val dependencyContainers: ListProperty + + abstract val mainClass: Property } diff --git a/etw/etw-testapp/build.gradle.kts b/etw/etw-testapp/build.gradle.kts index 2e6a486c0f3..629b4a2845b 100644 --- a/etw/etw-testapp/build.gradle.kts +++ b/etw/etw-testapp/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("ai.java-conventions") - id("org.springframework.boot" version "2.5.12") + id("org.springframework.boot" version "2.7.18") id("war") } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da476b..2e1113280ef 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index dd56f07c555..69915c1d0b1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,6 +13,7 @@ dependencyResolutionManagement { repositories { mavenCentral() mavenLocal() + maven("https://central.sonatype.com/repository/maven-snapshots/") } } diff --git a/smoke-tests/apps/ReadOnly/build.gradle.kts b/smoke-tests/apps/ReadOnly/build.gradle.kts index 29d8040b549..31e43ea60c0 100644 --- a/smoke-tests/apps/ReadOnly/build.gradle.kts +++ b/smoke-tests/apps/ReadOnly/build.gradle.kts @@ -1,3 +1,5 @@ plugins { id("ai.smoke-test-jar") } + +aiSmokeTest.mainClass.set("com.microsoft.applicationinsights.smoketestapp.App") diff --git a/smoke-tests/apps/gRPC/build.gradle.kts b/smoke-tests/apps/gRPC/build.gradle.kts index eae03a2ecef..99802a6e67d 100644 --- a/smoke-tests/apps/gRPC/build.gradle.kts +++ b/smoke-tests/apps/gRPC/build.gradle.kts @@ -2,7 +2,7 @@ import com.google.protobuf.gradle.* plugins { id("ai.smoke-test-jar") - id("com.google.protobuf") version "0.8.19" + id("com.google.protobuf") version "0.9.5" } val grpcVersion = "1.26.0" // first version with support for arm64 From cfa8c0bf2e1f5f640993c2c5c8c6409efd543c3b Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 20 Oct 2025 15:56:09 -0700 Subject: [PATCH 2/4] less --- buildSrc/build.gradle.kts | 3 +-- settings.gradle.kts | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 3e807c48b63..05375fa4d76 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -20,7 +20,6 @@ repositories { mavenCentral() mavenLocal() gradlePluginPortal() - maven("https://central.sonatype.com/repository/maven-snapshots/") } tasks.withType().configureEach { @@ -37,7 +36,7 @@ dependencies { implementation("org.owasp:dependency-check-gradle:12.1.8") - implementation("io.opentelemetry.instrumentation:gradle-plugins:2.22.0-alpha-SNAPSHOT") + implementation("io.opentelemetry.instrumentation:gradle-plugins:2.21.0-alpha") implementation("net.ltgt.gradle:gradle-errorprone-plugin:4.3.0") implementation("net.ltgt.gradle:gradle-nullaway-plugin:2.3.0") diff --git a/settings.gradle.kts b/settings.gradle.kts index 69915c1d0b1..dd56f07c555 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,6 @@ dependencyResolutionManagement { repositories { mavenCentral() mavenLocal() - maven("https://central.sonatype.com/repository/maven-snapshots/") } } From 3cca0a8bfa7f2c4fa696b8679baf4ba4a3d911eb Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 20 Oct 2025 15:57:58 -0700 Subject: [PATCH 3/4] less --- buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts | 4 +--- .../applicationinsights/gradle/AiSmokeTestExtension.kt | 2 -- .../smoketestapp/{App.java => SpringBootApp.java} | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) rename smoke-tests/apps/ReadOnly/src/main/java/com/microsoft/applicationinsights/smoketestapp/{App.java => SpringBootApp.java} (94%) diff --git a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts index 99102ad6a02..a9ae5df5599 100644 --- a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts @@ -9,8 +9,6 @@ plugins { val aiSmokeTest = extensions.getByType(AiSmokeTestExtension::class) -aiSmokeTest.mainClass.convention("com.microsoft.applicationinsights.smoketestapp.SpringBootApp") - val shadowJar = tasks.named("shadowJar") { archiveClassifier.set("") archiveVersion.set("") @@ -23,7 +21,7 @@ val shadowJar = tasks.named("shadowJar") { mergeServiceFiles("META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports") manifest { - attributes["Main-Class"] = aiSmokeTest.mainClass.get() + attributes["Main-Class"] = "com.microsoft.applicationinsights.smoketestapp.SpringBootApp" } } diff --git a/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt b/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt index aefa5067c83..bce6f0eca04 100644 --- a/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt +++ b/buildSrc/src/main/kotlin/com/microsoft/applicationinsights/gradle/AiSmokeTestExtension.kt @@ -10,6 +10,4 @@ abstract class AiSmokeTestExtension { abstract val testAppArtifactFilename: Property abstract val dependencyContainers: ListProperty - - abstract val mainClass: Property } diff --git a/smoke-tests/apps/ReadOnly/src/main/java/com/microsoft/applicationinsights/smoketestapp/App.java b/smoke-tests/apps/ReadOnly/src/main/java/com/microsoft/applicationinsights/smoketestapp/SpringBootApp.java similarity index 94% rename from smoke-tests/apps/ReadOnly/src/main/java/com/microsoft/applicationinsights/smoketestapp/App.java rename to smoke-tests/apps/ReadOnly/src/main/java/com/microsoft/applicationinsights/smoketestapp/SpringBootApp.java index 382610b2ff8..05103c90ea0 100644 --- a/smoke-tests/apps/ReadOnly/src/main/java/com/microsoft/applicationinsights/smoketestapp/App.java +++ b/smoke-tests/apps/ReadOnly/src/main/java/com/microsoft/applicationinsights/smoketestapp/SpringBootApp.java @@ -8,7 +8,7 @@ // Spring boot doesn't support read-only containers // (https://github.com/spring-projects/spring-boot/issues/8578) -public class App { +public class SpringBootApp { private static final Logger logger = Logger.getLogger("smoketestapp"); From 4dc65fd60e2a762c43f09fc3883d87d3057da7a8 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 23 Oct 2025 13:26:08 -0700 Subject: [PATCH 4/4] more --- ...utoconfigure.spi.metrics.ConfigurableMetricExporterProvider | 1 + buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts | 3 +++ smoke-tests/apps/ReadOnly/build.gradle.kts | 2 -- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 agent/agent/src/main/resources/inst/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider diff --git a/agent/agent/src/main/resources/inst/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider b/agent/agent/src/main/resources/inst/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider new file mode 100644 index 00000000000..93d8d0ee99a --- /dev/null +++ b/agent/agent/src/main/resources/inst/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider @@ -0,0 +1 @@ +io.opentelemetry.exporter.otlp.internal.OtlpMetricExporterProvider diff --git a/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts b/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts index a9225f13cff..2ac0649ce38 100644 --- a/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.shadow-conventions.gradle.kts @@ -11,6 +11,7 @@ tasks.withType().configureEach { mergeServiceFiles("META-INF/services/**") mergeServiceFiles { include("inst/META-INF/services/**") + path = "inst/META-INF/services" } filesMatching("META-INF/services/**") { duplicatesStrategy = DuplicatesStrategy.INCLUDE @@ -18,6 +19,8 @@ tasks.withType().configureEach { filesMatching("inst/META-INF/services/**") { duplicatesStrategy = DuplicatesStrategy.INCLUDE } + exclude("META-INF/services/javax.servlet.ServletContainerInitializer") + exclude("inst/META-INF/services/javax.servlet.ServletContainerInitializer") exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA") exclude( "META-INF/LICENSE", diff --git a/smoke-tests/apps/ReadOnly/build.gradle.kts b/smoke-tests/apps/ReadOnly/build.gradle.kts index 31e43ea60c0..29d8040b549 100644 --- a/smoke-tests/apps/ReadOnly/build.gradle.kts +++ b/smoke-tests/apps/ReadOnly/build.gradle.kts @@ -1,5 +1,3 @@ plugins { id("ai.smoke-test-jar") } - -aiSmokeTest.mainClass.set("com.microsoft.applicationinsights.smoketestapp.App")