From 100c64dd611050d8efe891000a596fda188f2436 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Thu, 3 Jul 2025 10:29:16 +0800 Subject: [PATCH 1/2] Convert distro build scripts from Groovy to Kotlin DSL --- examples/distro/agent/build.gradle | 127 ---------------- examples/distro/agent/build.gradle.kts | 135 ++++++++++++++++++ examples/distro/bootstrap/build.gradle | 6 - examples/distro/bootstrap/build.gradle.kts | 6 + examples/distro/build.gradle | 87 ----------- examples/distro/build.gradle.kts | 10 ++ examples/distro/buildSrc/build.gradle.kts | 48 +++++++ ...tel.instrumentation-conventions.gradle.kts | 73 ++++++++++ .../kotlin/otel.java-conventions.gradle.kts | 42 ++++++ .../kotlin/otel.shadow-conventions.gradle.kts | 25 ++++ .../otel.spotless-conventions.gradle.kts | 42 ++++++ .../custom/{build.gradle => build.gradle.kts} | 4 +- .../dependencyManagement/build.gradle.kts | 31 ++++ examples/distro/gradle/instrumentation.gradle | 67 --------- examples/distro/gradle/shadow.gradle | 22 --- examples/distro/gradle/spotless.license.java | 4 + examples/distro/instrumentation/build.gradle | 13 -- .../distro/instrumentation/build.gradle.kts | 17 +++ .../instrumentation/servlet-3/build.gradle | 34 ----- .../servlet-3/build.gradle.kts | 36 +++++ examples/distro/settings.gradle | 19 --- examples/distro/settings.gradle.kts | 20 +++ .../{build.gradle => build.gradle.kts} | 10 +- .../{build.gradle => build.gradle.kts} | 66 ++++----- 24 files changed, 527 insertions(+), 417 deletions(-) delete mode 100644 examples/distro/agent/build.gradle create mode 100644 examples/distro/agent/build.gradle.kts delete mode 100644 examples/distro/bootstrap/build.gradle create mode 100644 examples/distro/bootstrap/build.gradle.kts delete mode 100644 examples/distro/build.gradle create mode 100644 examples/distro/build.gradle.kts create mode 100644 examples/distro/buildSrc/build.gradle.kts create mode 100644 examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts create mode 100644 examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts create mode 100644 examples/distro/buildSrc/src/main/kotlin/otel.shadow-conventions.gradle.kts create mode 100644 examples/distro/buildSrc/src/main/kotlin/otel.spotless-conventions.gradle.kts rename examples/distro/custom/{build.gradle => build.gradle.kts} (91%) create mode 100644 examples/distro/dependencyManagement/build.gradle.kts delete mode 100644 examples/distro/gradle/instrumentation.gradle delete mode 100644 examples/distro/gradle/shadow.gradle create mode 100644 examples/distro/gradle/spotless.license.java delete mode 100644 examples/distro/instrumentation/build.gradle create mode 100644 examples/distro/instrumentation/build.gradle.kts delete mode 100644 examples/distro/instrumentation/servlet-3/build.gradle create mode 100644 examples/distro/instrumentation/servlet-3/build.gradle.kts delete mode 100644 examples/distro/settings.gradle create mode 100644 examples/distro/settings.gradle.kts rename examples/distro/smoke-tests/{build.gradle => build.gradle.kts} (75%) rename examples/distro/testing/agent-for-testing/{build.gradle => build.gradle.kts} (59%) diff --git a/examples/distro/agent/build.gradle b/examples/distro/agent/build.gradle deleted file mode 100644 index 828f19223308..000000000000 --- a/examples/distro/agent/build.gradle +++ /dev/null @@ -1,127 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - -plugins { - id("com.gradleup.shadow") -} - -apply from: "$rootDir/gradle/shadow.gradle" - -def relocatePackages = ext.relocatePackages - -configurations { - // this configuration collects libs that will be placed in the bootstrap classloader - bootstrapLibs { - canBeResolved = true - canBeConsumed = false - } - // this configuration collects libs that will be placed in the agent classloader, isolated from the instrumented application code - javaagentLibs { - canBeResolved = true - canBeConsumed = false - } - // this configuration stores the upstream agent dep that's extended by this project - upstreamAgent { - canBeResolved = true - canBeConsumed = false - } -} - -dependencies { - bootstrapLibs(project(":bootstrap")) - - javaagentLibs(project(":custom")) - javaagentLibs(project(":instrumentation:servlet-3")) - - upstreamAgent("io.opentelemetry.javaagent:opentelemetry-javaagent:${versions.opentelemetryJavaagent}") -} - -CopySpec isolateClasses(Iterable jars) { - return copySpec { - jars.forEach { - from(zipTree(it)) { - into("inst") - rename("^(.*)\\.class\$", "\$1.classdata") - // Rename LICENSE file since it clashes with license dir on non-case sensitive FSs (i.e. Mac) - rename("^LICENSE\$", "LICENSE.renamed") - exclude("META-INF/INDEX.LIST") - exclude("META-INF/*.DSA") - exclude("META-INF/*.SF") - exclude("META-INF/maven/**") - exclude("META-INF/MANIFEST.MF") - } - } - } -} - -tasks { - jar { - enabled = false - } - - // building the final javaagent jar is done in 3 steps: - - // 1. all distro specific javaagent libs are relocated - task relocateJavaagentLibs(type: ShadowJar) { - configurations = [project.configurations.javaagentLibs] - - duplicatesStrategy = DuplicatesStrategy.FAIL - - archiveFileName.set("javaagentLibs-relocated.jar") - - mergeServiceFiles() - exclude("**/module-info.class") - relocatePackages(it) - - // exclude known bootstrap dependencies - they can't appear in the inst/ directory - dependencies { - exclude("io.opentelemetry:opentelemetry-api") - exclude("io.opentelemetry:opentelemetry-context") - // events API and metrics advice API - exclude("io.opentelemetry:opentelemetry-api-incubator") - } - } - - // 2. the distro javaagent libs are then isolated - moved to the inst/ directory - // having a separate task for isolating javaagent libs is required to avoid duplicates with the upstream javaagent - // duplicatesStrategy in shadowJar won't be applied when adding files with with(CopySpec) because each CopySpec has - // its own duplicatesStrategy - task isolateJavaagentLibs(type: Copy) { - dependsOn(tasks.relocateJavaagentLibs) - with isolateClasses(tasks.relocateJavaagentLibs.outputs.files) - - into(layout.buildDirectory.dir("isolated/javaagentLibs")) - } - - // 3. the relocated and isolated javaagent libs are merged together with the bootstrap libs (which undergo relocation - // in this task) and the upstream javaagent jar; duplicates are removed - shadowJar { - configurations = [project.configurations.bootstrapLibs, project.configurations.upstreamAgent] - - dependsOn(tasks.isolateJavaagentLibs) - from(tasks.isolateJavaagentLibs.outputs) - - archiveClassifier.set("all") - - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - - mergeServiceFiles { - include("inst/META-INF/services/*") - } - exclude("**/module-info.class") - relocatePackages(it) - - manifest { - attributes.put("Main-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent") - attributes.put("Agent-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent") - attributes.put("Premain-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent") - attributes.put("Can-Redefine-Classes", "true") - attributes.put("Can-Retransform-Classes", "true") - attributes.put("Implementation-Vendor", "Demo") - attributes.put("Implementation-Version", "demo-${project.version}-otel-${versions.opentelemetryJavaagent}") - } - } - - assemble { - dependsOn(shadowJar) - } -} diff --git a/examples/distro/agent/build.gradle.kts b/examples/distro/agent/build.gradle.kts new file mode 100644 index 000000000000..af394aae5cc0 --- /dev/null +++ b/examples/distro/agent/build.gradle.kts @@ -0,0 +1,135 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + id("otel.java-conventions") + id("otel.shadow-conventions") +} + +base.archivesName.set("otel-javaagent") + +java { + withJavadocJar() + withSourcesJar() +} + +// this configuration collects libs that will be placed in the bootstrap classloader +val bootstrapLibs: Configuration by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} +// this configuration collects libs that will be placed in the agent classloader, isolated from the instrumented application code +val javaagentLibs: Configuration by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} +// this configuration stores the upstream agent dep that's extended by this project +val upstreamAgent: Configuration by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} + +val otelInstrumentationVersion: String by rootProject.extra + +dependencies { + add("upstreamAgent", platform(project(":dependencyManagement"))) + bootstrapLibs(project(":bootstrap")) + + javaagentLibs(project(":custom")) + javaagentLibs(project(":instrumentation:servlet-3")) + + upstreamAgent("io.opentelemetry.javaagent:opentelemetry-javaagent") +} + +fun CopySpec.isolateClasses(jars: Iterable) { + jars.forEach { + from(zipTree(it)) { + into("inst") + rename("^(.*)\\.class\$", "\$1.classdata") + // Rename LICENSE file since it clashes with license dir on non-case sensitive FSs (i.e. Mac) + rename("^LICENSE\$", "LICENSE.renamed") + exclude("META-INF/INDEX.LIST") + exclude("META-INF/*.DSA") + exclude("META-INF/*.SF") + exclude("META-INF/maven/**") + exclude("META-INF/MANIFEST.MF") + } + } +} + +tasks { + jar { + enabled = false + } + + processResources { + from(rootProject.file("licenses")) { + into("META-INF/licenses") + } + } + + // building the final javaagent jar is done in 3 steps: + + // 1. all distro specific javaagent libs are relocated + val relocateJavaagentLibs by registering(ShadowJar::class) { + configurations = listOf(javaagentLibs) + + duplicatesStrategy = DuplicatesStrategy.FAIL + + archiveFileName.set("javaagentLibs-relocated.jar") + + dependencies { + // exclude known bootstrap dependencies - they can't appear in the inst/ directory + exclude(dependency("org.slf4j:slf4j-api")) + exclude(dependency("io.opentelemetry:opentelemetry-api")) + exclude(dependency("io.opentelemetry:opentelemetry-context")) + exclude(dependency("io.opentelemetry:opentelemetry-api-incubator")) + } + } + + // 2. the distro javaagent libs are then isolated - moved to the inst/ directory + // having a separate task for isolating javaagent libs is required to avoid duplicates with the upstream javaagent + // duplicatesStrategy in shadowJar won't be applied when adding files with with(CopySpec) because each CopySpec has + // its own duplicatesStrategy + val isolateJavaagentLibs by registering(Copy::class) { + dependsOn(relocateJavaagentLibs) + isolateClasses(relocateJavaagentLibs.get().outputs.files) + + into(layout.buildDirectory.dir("isolated/javaagentLibs")) + } + + // 3. the relocated and isolated javaagent libs are merged together with the bootstrap libs (which undergo relocation + // in this task) and the upstream javaagent jar; duplicates are removed + shadowJar { + configurations = listOf(bootstrapLibs, upstreamAgent) + + dependsOn(isolateJavaagentLibs) + from(isolateJavaagentLibs.get().outputs) + + archiveClassifier.set("all") + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + mergeServiceFiles { + include("inst/META-INF/services/*") + } + exclude("**/module-info.class") + + manifest { + attributes( + mapOf( + "Main-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent", + "Agent-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent", + "Premain-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent", + "Can-Redefine-Classes" to true, + "Can-Retransform-Classes" to true, + "Implementation-Vendor" to "Demo", + "Implementation-Version" to "demo-${project.version}-otel-$otelInstrumentationVersion", + ), + ) + } + } + + assemble { + dependsOn(shadowJar) + } +} diff --git a/examples/distro/bootstrap/build.gradle b/examples/distro/bootstrap/build.gradle deleted file mode 100644 index 1f769508f773..000000000000 --- a/examples/distro/bootstrap/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -plugins { - id "java" -} - -dependencies { -} diff --git a/examples/distro/bootstrap/build.gradle.kts b/examples/distro/bootstrap/build.gradle.kts new file mode 100644 index 000000000000..77b86d7d3dc9 --- /dev/null +++ b/examples/distro/bootstrap/build.gradle.kts @@ -0,0 +1,6 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { +} \ No newline at end of file diff --git a/examples/distro/build.gradle b/examples/distro/build.gradle deleted file mode 100644 index 54cb4ebda424..000000000000 --- a/examples/distro/build.gradle +++ /dev/null @@ -1,87 +0,0 @@ -group 'io.opentelemetry.example' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - maven { - name = "sonatype" - url = uri("https://central.sonatype.com/repository/maven-snapshots/") - } - } - dependencies { - classpath "com.diffplug.spotless:spotless-plugin-gradle:7.0.4" - classpath "com.gradleup.shadow:shadow-gradle-plugin:8.3.7" - classpath "io.opentelemetry.instrumentation:gradle-plugins:2.18.0-alpha-SNAPSHOT" - } -} - -subprojects { - version = rootProject.version - - apply plugin: "java" - apply plugin: "com.diffplug.spotless" - - ext { - versions = [ - // this line is managed by .github/scripts/update-sdk-version.sh - opentelemetrySdk : "1.51.0", - - // these lines are managed by .github/scripts/update-version.sh - opentelemetryJavaagent : "2.18.0-SNAPSHOT", - opentelemetryJavaagentAlpha: "2.18.0-alpha-SNAPSHOT", - - autoservice : "1.1.1" - ] - - deps = [ - autoservice: [ - "com.google.auto.service:auto-service:${versions.autoservice}", - "com.google.auto.service:auto-service-annotations:${versions.autoservice}", - ] - ] - } - - repositories { - mavenCentral() - maven { - name = "sonatype" - url = uri("https://central.sonatype.com/repository/maven-snapshots/") - } - } - - spotless { - java { - googleJavaFormat() - licenseHeaderFile(rootProject.file("../../buildscripts/spotless.license.java"), "(package|import|public)") - target("src/**/*.java") - } - } - - dependencies { - implementation(platform("io.opentelemetry:opentelemetry-bom:${versions.opentelemetrySdk}")) - - // these serve as a test of the instrumentation boms - implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:${versions.opentelemetryJavaagent}")) - implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:${versions.opentelemetryJavaagentAlpha}")) - - testImplementation("org.mockito:mockito-core:5.18.0") - - testImplementation(enforcedPlatform("org.junit:junit-bom:5.13.2")) - testImplementation("org.junit.jupiter:junit-jupiter-api") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") - } - - tasks { - test { - useJUnitPlatform() - } - - compileJava { - options.release.set(8) - } - } -} diff --git a/examples/distro/build.gradle.kts b/examples/distro/build.gradle.kts new file mode 100644 index 000000000000..f386baff779b --- /dev/null +++ b/examples/distro/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("otel.instrumentation-conventions") +} + +group = "io.opentelemetry.example" +version = "1.0-SNAPSHOT" + +subprojects { + version = rootProject.version +} \ No newline at end of file diff --git a/examples/distro/buildSrc/build.gradle.kts b/examples/distro/buildSrc/build.gradle.kts new file mode 100644 index 000000000000..0bf9054ea9eb --- /dev/null +++ b/examples/distro/buildSrc/build.gradle.kts @@ -0,0 +1,48 @@ +plugins { + `kotlin-dsl` + + // When updating, update below in dependencies too + id("com.diffplug.spotless") version "7.0.4" +} + +spotless { + kotlinGradle { + ktlint().editorConfigOverride( + mapOf( + "indent_size" to "2", + "continuation_indent_size" to "2", + "max_line_length" to "160", + "insert_final_newline" to "true", + "ktlint_standard_no-wildcard-imports" to "disabled", + // ktlint does not break up long lines, it just fails on them + "ktlint_standard_max-line-length" to "disabled", + // ktlint makes it *very* hard to locate where this actually happened + "ktlint_standard_trailing-comma-on-call-site" to "disabled", + // depends on ktlint_standard_wrapping + "ktlint_standard_trailing-comma-on-declaration-site" to "disabled", + // also very hard to find out where this happens + "ktlint_standard_wrapping" to "disabled" + ) + ) + target("**/*.gradle.kts") + } +} + +repositories { + gradlePluginPortal() + + // for otel upstream snapshots + maven { + url = uri("https://central.sonatype.com/repository/maven-snapshots/") + } +} + +dependencies { + implementation(gradleApi()) + + implementation("com.diffplug.spotless:spotless-plugin-gradle:7.0.4") + implementation("io.opentelemetry.instrumentation:gradle-plugins:2.9.0-alpha") + + // keep these versions in sync with settings.gradle.kts + implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.7") +} diff --git a/examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts b/examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts new file mode 100644 index 000000000000..c92d927871a0 --- /dev/null +++ b/examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts @@ -0,0 +1,73 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + id("otel.java-conventions") + id("otel.shadow-conventions") + + id("io.opentelemetry.instrumentation.muzzle-generation") + id("io.opentelemetry.instrumentation.muzzle-check") +} + +val testInstrumentation by configurations.creating +val testAgent by configurations.creating + +dependencies { + add("testInstrumentation", platform(project(":dependencyManagement"))) + compileOnly("io.opentelemetry:opentelemetry-sdk") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + compileOnly("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api") + compileOnly("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-incubator") + compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api") + compileOnly("io.opentelemetry.semconv:opentelemetry-semconv") + + annotationProcessor("com.google.auto.service:auto-service") + compileOnly("com.google.auto.service:auto-service") + compileOnly(project(":bootstrap")) + + // the javaagent that is going to be used when running instrumentation unit tests + testAgent(project(path = ":testing:agent-for-testing", configuration = "shadow")) + // test dependencies + testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common") + testImplementation("io.opentelemetry:opentelemetry-sdk-testing") + testImplementation("org.assertj:assertj-core") + + add("codegen", platform(project(":dependencyManagement"))) + add("muzzleBootstrap", platform(project(":dependencyManagement"))) + add("muzzleTooling", platform(project(":dependencyManagement"))) + + add("codegen", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") + add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support") + add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api") + add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") +} + +tasks.named("shadowJar").configure { + configurations = listOf(project.configurations.runtimeClasspath.get(), testInstrumentation) + mergeServiceFiles() + archiveFileName.set("agent-testing.jar") +} + +tasks.withType().configureEach { + val shadowJar = tasks.shadowJar.get() + val agentShadowJar = project(":testing:agent-for-testing").tasks.shadowJar + inputs.file(shadowJar.archiveFile) + + dependsOn(shadowJar) + dependsOn(agentShadowJar.get()) + + jvmArgs("-Dotel.javaagent.debug=true") + jvmArgs("-Dotel.javaagent.experimental.initializer.jar=${shadowJar.archiveFile.get().asFile.absolutePath}") + jvmArgs("-Dotel.javaagent.testing.additional-library-ignores.enabled=false") + jvmArgs("-Dotel.javaagent.testing.fail-on-context-leak=true") + jvmArgs("-Dotel.javaagent.testing.transform-safe-logging.enabled=true") + + // The sources are packaged into the testing jar so we need to make sure to exclude from the test + // classpath, which automatically inherits them, to ensure our shaded versions are used. + classpath = classpath.filter { + if (it == file(layout.buildDirectory.dir("resources/main")) || it == file(layout.buildDirectory.dir("classes/java/main"))) { + return@filter false + } + return@filter true + } +} diff --git a/examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts b/examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts new file mode 100644 index 000000000000..ce77b0476044 --- /dev/null +++ b/examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts @@ -0,0 +1,42 @@ +plugins { + java +} + +repositories { + mavenLocal() + mavenCentral() + maven { + name = "sonatype" + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + } +} +evaluationDependsOn(":dependencyManagement") +val dependencyManagementConf = configurations.create("dependencyManagement") { + isCanBeConsumed = false + isCanBeResolved = false + isVisible = false +} +afterEvaluate { + configurations.configureEach { + if (isCanBeResolved && !isCanBeConsumed) { + extendsFrom(dependencyManagementConf) + } + } +} + +dependencies { + add(dependencyManagementConf.name, platform(project(":dependencyManagement"))) + add("testImplementation", "org.mockito:mockito-core") + add("testImplementation", enforcedPlatform("org.junit:junit-bom")) + add("testImplementation", "org.junit.jupiter:junit-jupiter-api") + add("testRuntimeOnly", "org.junit.jupiter:junit-jupiter-engine") + add("testRuntimeOnly", "org.junit.platform:junit-platform-launcher") +} + +tasks.withType().configureEach { + useJUnitPlatform() +} + +tasks.withType().configureEach { + options.release.set(11) +} diff --git a/examples/distro/buildSrc/src/main/kotlin/otel.shadow-conventions.gradle.kts b/examples/distro/buildSrc/src/main/kotlin/otel.shadow-conventions.gradle.kts new file mode 100644 index 000000000000..869377460e34 --- /dev/null +++ b/examples/distro/buildSrc/src/main/kotlin/otel.shadow-conventions.gradle.kts @@ -0,0 +1,25 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + id("com.gradleup.shadow") +} + +tasks.withType().configureEach { + // rewrite dependencies calling Logger.getLogger + relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") + + // prevents conflict with library instrumentation, since these classes live in the bootstrap class loader + relocate("io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation") { + exclude("io.opentelemetry.instrumentation.resources.*") + exclude("io.opentelemetry.instrumentation.spring.resources.*") + } + + // relocate(OpenTelemetry API) since these classes live in the bootstrap class loader + relocate("io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api") + relocate("io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") + relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") + + // relocate the OpenTelemetry extensions that are used by instrumentation modules + relocate("io.opentelemetry.contrib.awsxray", "io.opentelemetry.javaagent.shaded.io.opentelemetry.contrib.awsxray") + relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") +} diff --git a/examples/distro/buildSrc/src/main/kotlin/otel.spotless-conventions.gradle.kts b/examples/distro/buildSrc/src/main/kotlin/otel.spotless-conventions.gradle.kts new file mode 100644 index 000000000000..b5366a1ef027 --- /dev/null +++ b/examples/distro/buildSrc/src/main/kotlin/otel.spotless-conventions.gradle.kts @@ -0,0 +1,42 @@ +import com.diffplug.gradle.spotless.SpotlessExtension + +plugins { + java + id("com.diffplug.spotless") +} + +extensions.configure("spotless") { + java { + googleJavaFormat() + licenseHeaderFile(rootProject.file("gradle/spotless.license.java"), "(package|import|public)") + target("src/**/*.java") + toggleOffOn() + } + kotlinGradle { + ktlint().editorConfigOverride( + mapOf( + "indent_size" to "2", + "continuation_indent_size" to "2", + "max_line_length" to "160", + "insert_final_newline" to "true", + "ktlint_standard_no-wildcard-imports" to "disabled", + // ktlint does not break up long lines, it just fails on them + "ktlint_standard_max-line-length" to "disabled", + // ktlint makes it *very* hard to locate where this actually happened + "ktlint_standard_trailing-comma-on-call-site" to "disabled", + // depends on ktlint_standard_wrapping + "ktlint_standard_trailing-comma-on-declaration-site" to "disabled", + // also very hard to find out where this happens + "ktlint_standard_wrapping" to "disabled" + ) + ) + } +} + +val formatCode by tasks.registering { + dependsOn(tasks.named("spotlessApply")) +} + +tasks.named("check").configure { + dependsOn(tasks.named("spotlessCheck")) +} diff --git a/examples/distro/custom/build.gradle b/examples/distro/custom/build.gradle.kts similarity index 91% rename from examples/distro/custom/build.gradle rename to examples/distro/custom/build.gradle.kts index 39b0a25030d9..dc16b80db077 100644 --- a/examples/distro/custom/build.gradle +++ b/examples/distro/custom/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id "java" + id("otel.java-conventions") } dependencies { @@ -8,4 +8,4 @@ dependencies { compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") -} +} \ No newline at end of file diff --git a/examples/distro/dependencyManagement/build.gradle.kts b/examples/distro/dependencyManagement/build.gradle.kts new file mode 100644 index 000000000000..c52d05d9a7db --- /dev/null +++ b/examples/distro/dependencyManagement/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + `java-platform` +} + +val otelVersion = "1.51.0" +val otelAlphaVersion = otelVersion.replaceFirst("(-SNAPSHOT)?$".toRegex(), "-alpha$1") +val otelInstrumentationVersion = "2.18.0-SNAPSHOT" +val otelInstrumentationAlphaVersion = otelInstrumentationVersion.replaceFirst("(-SNAPSHOT)?$".toRegex(), "-alpha$1") + +// Set version properties for use in other projects +rootProject.extra["otelInstrumentationVersion"] = otelInstrumentationVersion +rootProject.extra["otelInstrumentationAlphaVersion"] = otelInstrumentationAlphaVersion + +javaPlatform { + allowDependencies() +} + +dependencies { + api(enforcedPlatform("io.opentelemetry:opentelemetry-bom:$otelVersion")) + api(enforcedPlatform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:$otelInstrumentationVersion")) + api(enforcedPlatform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:$otelInstrumentationAlphaVersion")) + api(enforcedPlatform("org.junit:junit-bom:5.12.2")) + constraints { + api("com.google.auto.service:auto-service:1.1.1") + api("org.assertj:assertj-core:3.27.3") + api("org.mockito:mockito-core:5.18.0") + api("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:$otelInstrumentationAlphaVersion") + api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support:$otelInstrumentationAlphaVersion") + api("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:$otelInstrumentationAlphaVersion") + } +} diff --git a/examples/distro/gradle/instrumentation.gradle b/examples/distro/gradle/instrumentation.gradle deleted file mode 100644 index 4f1d672f158f..000000000000 --- a/examples/distro/gradle/instrumentation.gradle +++ /dev/null @@ -1,67 +0,0 @@ -apply plugin: 'java' -apply plugin: 'com.gradleup.shadow' -apply plugin: 'io.opentelemetry.instrumentation.muzzle-generation' -apply plugin: 'io.opentelemetry.instrumentation.muzzle-check' - -apply from: "$rootDir/gradle/shadow.gradle" - -def relocatePackages = ext.relocatePackages - -configurations { - testInstrumentation - testAgent -} - -dependencies { - compileOnly("io.opentelemetry:opentelemetry-sdk") - compileOnly("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api") - compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api") - - annotationProcessor deps.autoservice - compileOnly deps.autoservice - - // the javaagent that is going to be used when running instrumentation unit tests - testAgent(project(path: ":testing:agent-for-testing", configuration: "shadow")) - // test dependencies - testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common") - testImplementation("io.opentelemetry:opentelemetry-sdk-testing") - testImplementation("org.assertj:assertj-core:3.27.3") - - add("codegen", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions.opentelemetryJavaagentAlpha}") - add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support:${versions.opentelemetryJavaagentAlpha}") - add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions.opentelemetryJavaagentAlpha}") - add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions.opentelemetryJavaagentAlpha}") -} - -shadowJar { - configurations = [project.configurations.runtimeClasspath, project.configurations.testInstrumentation] - mergeServiceFiles() - - archiveFileName = 'agent-testing.jar' - - relocatePackages(it) -} - -tasks.withType(Test).configureEach { - inputs.file(shadowJar.archiveFile) - - jvmArgs "-Dotel.javaagent.debug=true" - jvmArgs "-javaagent:${configurations.testAgent.files.first().absolutePath}" - jvmArgs "-Dotel.javaagent.experimental.initializer.jar=${shadowJar.archiveFile.get().asFile.absolutePath}" - jvmArgs "-Dotel.javaagent.testing.additional-library-ignores.enabled=false" - jvmArgs "-Dotel.javaagent.testing.fail-on-context-leak=true" - // prevent sporadic gradle deadlocks, see SafeLogger for more details - jvmArgs "-Dotel.javaagent.testing.transform-safe-logging.enabled=true" - - dependsOn shadowJar - dependsOn configurations.testAgent.buildDependencies - - // The sources are packaged into the testing jar so we need to make sure to exclude from the test - // classpath, which automatically inherits them, to ensure our shaded versions are used. - classpath = classpath.filter { - if (it == file(layout.buildDirectory.dir("resources/main")) || it == file(layout.buildDirectory.dir("classes/java/main"))) { - return false - } - return true - } -} diff --git a/examples/distro/gradle/shadow.gradle b/examples/distro/gradle/shadow.gradle deleted file mode 100644 index 4cbf01b16aee..000000000000 --- a/examples/distro/gradle/shadow.gradle +++ /dev/null @@ -1,22 +0,0 @@ -ext.relocatePackages = { shadowJar -> - // rewrite dependencies calling Logger.getLogger - shadowJar.relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") - - // prevents conflict with library instrumentation, since these classes live in the bootstrap class loader - shadowJar.relocate("io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation") { - // Exclude resource providers since they live in the agent class loader - exclude("io.opentelemetry.instrumentation.resources.*") - exclude("io.opentelemetry.instrumentation.spring.resources.*") - } - - // relocate(OpenTelemetry API) since these classes live in the bootstrap class loader - shadowJar.relocate("io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api") - shadowJar.relocate("io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") - shadowJar.relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") - - // relocate the OpenTelemetry extensions that are used by instrumentation modules - // these extensions live in the AgentClassLoader, and are injected into the user's class loader - // by the instrumentation modules that use them - shadowJar.relocate("io.opentelemetry.contrib.awsxray", "io.opentelemetry.javaagent.shaded.io.opentelemetry.contrib.awsxray") - shadowJar.relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") -} diff --git a/examples/distro/gradle/spotless.license.java b/examples/distro/gradle/spotless.license.java new file mode 100644 index 000000000000..6dcadbed24de --- /dev/null +++ b/examples/distro/gradle/spotless.license.java @@ -0,0 +1,4 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ diff --git a/examples/distro/instrumentation/build.gradle b/examples/distro/instrumentation/build.gradle deleted file mode 100644 index 9d1a69144a12..000000000000 --- a/examples/distro/instrumentation/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -Project instr_project = project -subprojects { - afterEvaluate { Project subProj -> - if (subProj.getPlugins().hasPlugin('java')) { - // Make it so all instrumentation subproject tests can be run with a single command. - instr_project.tasks.test.dependsOn(subProj.tasks.test) - - instr_project.dependencies { - implementation(project(subProj.getPath())) - } - } - } -} diff --git a/examples/distro/instrumentation/build.gradle.kts b/examples/distro/instrumentation/build.gradle.kts new file mode 100644 index 000000000000..ff135e60d15f --- /dev/null +++ b/examples/distro/instrumentation/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id("otel.java-conventions") +} + +val instrumentationTest = tasks.named("test") +val instrumentationDeps = dependencies + +subprojects { + val subProj = this + + plugins.withId("java") { + // Make it so all instrumentation subproject tests can be run with a single command. + instrumentationTest.configure { + dependsOn(subProj.tasks.named("test")) + } + } +} \ No newline at end of file diff --git a/examples/distro/instrumentation/servlet-3/build.gradle b/examples/distro/instrumentation/servlet-3/build.gradle deleted file mode 100644 index 667e25bb3b49..000000000000 --- a/examples/distro/instrumentation/servlet-3/build.gradle +++ /dev/null @@ -1,34 +0,0 @@ -apply from: "$rootDir/gradle/instrumentation.gradle" - -muzzle { - pass { - group.set("javax.servlet") - module.set("javax.servlet-api") - versions.set("[3.0,)") - assertInverse.set(true) - } - pass { - group.set("javax.servlet") - module.set("servlet-api") - versions.set("[2.2, 3.0)") - assertInverse.set(true) - } -} - -dependencies { - compileOnly project(":bootstrap") - compileOnly "javax.servlet:javax.servlet-api:3.0.1" - - testInstrumentation "io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common:${versions.opentelemetryJavaagentAlpha}" - testInstrumentation "io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-2.2:${versions.opentelemetryJavaagentAlpha}" - testInstrumentation "io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions.opentelemetryJavaagentAlpha}" - - testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common") { - exclude group: 'org.eclipse.jetty', module: 'jetty-server' - } - - testImplementation "com.squareup.okhttp3:okhttp:4.12.0" - testImplementation "javax.servlet:javax.servlet-api:3.0.1" - testImplementation "org.eclipse.jetty:jetty-server:8.2.0.v20160908" - testImplementation "org.eclipse.jetty:jetty-servlet:8.2.0.v20160908" -} diff --git a/examples/distro/instrumentation/servlet-3/build.gradle.kts b/examples/distro/instrumentation/servlet-3/build.gradle.kts new file mode 100644 index 000000000000..c888b9e6947f --- /dev/null +++ b/examples/distro/instrumentation/servlet-3/build.gradle.kts @@ -0,0 +1,36 @@ +plugins { + id("otel.instrumentation-conventions") +} + +muzzle { + pass { + group.set("javax.servlet") + module.set("javax.servlet-api") + versions.set("[3.0,)") + assertInverse.set(true) + } + pass { + group.set("javax.servlet") + module.set("servlet-api") + versions.set("[2.2, 3.0)") + assertInverse.set(true) + } +} + +dependencies { + compileOnly(project(":bootstrap")) + compileOnly("javax.servlet:javax.servlet-api:3.0.1") + + testInstrumentation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common:${rootProject.extra["otelInstrumentationAlphaVersion"]}") + testInstrumentation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-2.2:${rootProject.extra["otelInstrumentationAlphaVersion"]}") + testInstrumentation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${rootProject.extra["otelInstrumentationAlphaVersion"]}") + + testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common") { + exclude(group = "org.eclipse.jetty", module = "jetty-server") + } + + testImplementation("com.squareup.okhttp3:okhttp:4.12.0") + testImplementation("javax.servlet:javax.servlet-api:3.0.1") + testImplementation("org.eclipse.jetty:jetty-server:8.2.0.v20160908") + testImplementation("org.eclipse.jetty:jetty-servlet:8.2.0.v20160908") +} diff --git a/examples/distro/settings.gradle b/examples/distro/settings.gradle deleted file mode 100644 index f1e44d1ed1e9..000000000000 --- a/examples/distro/settings.gradle +++ /dev/null @@ -1,19 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - maven { - name = "sonatype" - url = uri("https://central.sonatype.com/repository/maven-snapshots/") - } - } -} - -rootProject.name = 'opentelemetry-java-instrumentation-distro-demo' - -include "agent" -include "bootstrap" -include "custom" -include "instrumentation" -include "instrumentation:servlet-3" -include "smoke-tests" -include "testing:agent-for-testing" diff --git a/examples/distro/settings.gradle.kts b/examples/distro/settings.gradle.kts new file mode 100644 index 000000000000..6476cf4ce434 --- /dev/null +++ b/examples/distro/settings.gradle.kts @@ -0,0 +1,20 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = "sonatype" + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + } + } +} + +rootProject.name = "opentelemetry-java-instrumentation-distro-demo" + +include("agent") +include("bootstrap") +include("custom") +include("instrumentation") +include("instrumentation:servlet-3") +include("smoke-tests") +include("testing:agent-for-testing") +include("dependencyManagement") \ No newline at end of file diff --git a/examples/distro/smoke-tests/build.gradle b/examples/distro/smoke-tests/build.gradle.kts similarity index 75% rename from examples/distro/smoke-tests/build.gradle rename to examples/distro/smoke-tests/build.gradle.kts index c47ab5ebf041..4ea0898cb497 100644 --- a/examples/distro/smoke-tests/build.gradle +++ b/examples/distro/smoke-tests/build.gradle.kts @@ -1,5 +1,7 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + plugins { - id "java" + id("otel.java-conventions") } dependencies { @@ -18,11 +20,11 @@ tasks.test { testLogging.showStandardStreams = true - def shadowTask = project(":agent").tasks.shadowJar + val shadowTask = project(":agent").tasks.named("shadowJar").get() dependsOn(shadowTask) inputs.files(layout.files(shadowTask)) doFirst { - jvmArgs("-Dio.opentelemetry.smoketest.agent.shadowJar.path=${shadowTask.archiveFile.get()}") + jvmArgs("-Dio.opentelemetry.smoketest.agent.shadowJar.path=${shadowTask.archiveFile.get().asFile.absolutePath}") } -} +} \ No newline at end of file diff --git a/examples/distro/testing/agent-for-testing/build.gradle b/examples/distro/testing/agent-for-testing/build.gradle.kts similarity index 59% rename from examples/distro/testing/agent-for-testing/build.gradle rename to examples/distro/testing/agent-for-testing/build.gradle.kts index 5eec782efd4c..09fd6a86fcd7 100644 --- a/examples/distro/testing/agent-for-testing/build.gradle +++ b/examples/distro/testing/agent-for-testing/build.gradle.kts @@ -1,38 +1,34 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - plugins { + id("otel.java-conventions") id("com.gradleup.shadow") + id("otel.shadow-conventions") } -apply from: "$rootDir/gradle/shadow.gradle" - -def relocatePackages = ext.relocatePackages - configurations { // this configuration collects libs that will be placed in the bootstrap classloader - bootstrapLibs { - canBeResolved = true - canBeConsumed = false + create("bootstrapLibs") { + isCanBeResolved = true + isCanBeConsumed = false } // this configuration collects libs that will be placed in the agent classloader, isolated from the instrumented application code - javaagentLibs { - canBeResolved = true - canBeConsumed = false + create("javaagentLibs") { + isCanBeResolved = true + isCanBeConsumed = false } // this configuration stores the upstream agent dep that's extended by this project - upstreamAgent { - canBeResolved = true - canBeConsumed = false + create("upstreamAgent") { + isCanBeResolved = true + isCanBeConsumed = false } } dependencies { - bootstrapLibs(project(":bootstrap")) + "bootstrapLibs"(project(":bootstrap")) // and finally include everything from otel agent for testing - upstreamAgent("io.opentelemetry.javaagent:opentelemetry-agent-for-testing:${versions.opentelemetryJavaagentAlpha}") + "upstreamAgent"("io.opentelemetry.javaagent:opentelemetry-agent-for-testing:${rootProject.extra["otelInstrumentationAlphaVersion"]}") } -CopySpec isolateClasses(Iterable jars) { +fun CopySpec.isolateClasses(jars: Iterable): CopySpec { return copySpec { jars.forEach { from(zipTree(it)) { @@ -56,8 +52,8 @@ tasks { // building the final javaagent jar is done in 3 steps: // 1. all distro specific javaagent libs are relocated - task relocateJavaagentLibs(type: ShadowJar) { - configurations = [project.configurations.javaagentLibs] + val relocateJavaagentLibs by registering(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) { + configurations = listOf(project.configurations["javaagentLibs"]) duplicatesStrategy = DuplicatesStrategy.FAIL @@ -65,7 +61,6 @@ tasks { mergeServiceFiles() exclude("**/module-info.class") - relocatePackages(it) // exclude known bootstrap dependencies - they can't appear in the inst/ directory dependencies { @@ -80,9 +75,9 @@ tasks { // having a separate task for isolating javaagent libs is required to avoid duplicates with the upstream javaagent // duplicatesStrategy in shadowJar won't be applied when adding files with with(CopySpec) because each CopySpec has // its own duplicatesStrategy - task isolateJavaagentLibs(type: Copy) { - dependsOn(tasks.relocateJavaagentLibs) - with isolateClasses(tasks.relocateJavaagentLibs.outputs.files) + val isolateJavaagentLibs by registering(Copy::class) { + dependsOn(relocateJavaagentLibs) + with(isolateClasses(relocateJavaagentLibs.get().outputs.files)) into(layout.buildDirectory.dir("isolated/javaagentLibs")) } @@ -90,10 +85,10 @@ tasks { // 3. the relocated and isolated javaagent libs are merged together with the bootstrap libs (which undergo relocation // in this task) and the upstream javaagent jar; duplicates are removed shadowJar { - configurations = [project.configurations.bootstrapLibs, project.configurations.upstreamAgent] + configurations = listOf(project.configurations["bootstrapLibs"], project.configurations["upstreamAgent"]) - dependsOn(tasks.isolateJavaagentLibs) - from(tasks.isolateJavaagentLibs.outputs) + dependsOn(isolateJavaagentLibs) + from(isolateJavaagentLibs.get().outputs) archiveClassifier.set("") @@ -103,20 +98,19 @@ tasks { include("inst/META-INF/services/*") } exclude("**/module-info.class") - relocatePackages(it) manifest { - attributes.put("Main-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent") - attributes.put("Agent-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent") - attributes.put("Premain-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent") - attributes.put("Can-Redefine-Classes", "true") - attributes.put("Can-Retransform-Classes", "true") - attributes.put("Implementation-Vendor", "Demo") - attributes.put("Implementation-Version", "demo-${project.version}-otel-${versions.opentelemetryJavaagent}") + attributes["Main-Class"] = "io.opentelemetry.javaagent.OpenTelemetryAgent" + attributes["Agent-Class"] = "io.opentelemetry.javaagent.OpenTelemetryAgent" + attributes["Premain-Class"] = "io.opentelemetry.javaagent.OpenTelemetryAgent" + attributes["Can-Redefine-Classes"] = "true" + attributes["Can-Retransform-Classes"] = "true" + attributes["Implementation-Vendor"] = "Demo" + attributes["Implementation-Version"] = "demo-${project.version}-otel-${rootProject.extra["otelInstrumentationVersion"]}" } } assemble { dependsOn(shadowJar) } -} +} \ No newline at end of file From aad399b33b2df51ae41f21807cb8a0b185b48463 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Thu, 10 Jul 2025 08:50:25 +0800 Subject: [PATCH 2/2] Fix: update shadowJar dependency handling and change Java release version --- .../kotlin/otel.instrumentation-conventions.gradle.kts | 7 +++++-- .../src/main/kotlin/otel.java-conventions.gradle.kts | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts b/examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts index c92d927871a0..58afe2530416 100644 --- a/examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts +++ b/examples/distro/buildSrc/src/main/kotlin/otel.instrumentation-conventions.gradle.kts @@ -50,11 +50,14 @@ tasks.named("shadowJar").configure { tasks.withType().configureEach { val shadowJar = tasks.shadowJar.get() - val agentShadowJar = project(":testing:agent-for-testing").tasks.shadowJar + val agentProject = project(":testing:agent-for-testing") + val agentShadowJar = agentProject.tasks.findByName("shadowJar") inputs.file(shadowJar.archiveFile) dependsOn(shadowJar) - dependsOn(agentShadowJar.get()) + if (agentShadowJar != null) { + dependsOn(agentShadowJar) + } jvmArgs("-Dotel.javaagent.debug=true") jvmArgs("-Dotel.javaagent.experimental.initializer.jar=${shadowJar.archiveFile.get().asFile.absolutePath}") diff --git a/examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts b/examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts index ce77b0476044..638da2fac4f3 100644 --- a/examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts +++ b/examples/distro/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts @@ -38,5 +38,5 @@ tasks.withType().configureEach { } tasks.withType().configureEach { - options.release.set(11) + options.release.set(8) }