diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b83dca4f..a03f6cf1 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - suite: [ "glassfish", "jetty", "liberty", "tomcat", "tomee", "wildfly", "other" ] + suite: [ "glassfish", "jetty", "liberty", "tomcat", "tomee", "wildfly"] fail-fast: true steps: # Set fetch-depth: 0 to fetch commit history and tags for use in version calculation diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 6c209d97..64046e9a 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - suite: [ "glassfish", "jetty", "liberty", "tomcat", "tomee", "wildfly", "other" ] + suite: [ "glassfish", "jetty", "liberty", "tomcat", "tomee", "wildfly"] fail-fast: true steps: # Set fetch-depth: 0 to fetch commit history and tags for use in version calculation diff --git a/build.gradle.kts b/build.gradle.kts index 1f2f88da..22f9b995 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { id("com.diffplug.spotless") version "5.2.0" apply false id("org.hypertrace.publish-maven-central-plugin") version "1.1.1" id("org.hypertrace.ci-utils-plugin") version "0.4.0" - id("org.gradle.test-retry") version "1.2.0" apply false + id("org.gradle.test-retry") version "1.5.0" apply false id("org.owasp.dependencycheck") version "7.1.1" } diff --git a/instrumentation/build.gradle.kts b/instrumentation/build.gradle.kts index 6a2d1b42..6ef713d6 100644 --- a/instrumentation/build.gradle.kts +++ b/instrumentation/build.gradle.kts @@ -40,27 +40,30 @@ tasks { mergeServiceFiles() - relocate("com.blogspot.mydailyjava.weaklockfree", "io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree") + relocate("com.blogspot.mydailyjava.weaklockfree", "org.hypertrace.io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree") exclude("**/module-info.class") - relocate("org.slf4j", "io.opentelemetry.javaagent.slf4j") - relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") + relocate("org.slf4j", "org.hypertrace.io.opentelemetry.javaagent.slf4j") + relocate("java.util.logging.Logger", "org.hypertrace.io.opentelemetry.javaagent.bootstrap.PatchLogger") -// // prevents conflict with library instrumentation - relocate("io.opentelemetry.instrumentation.api", "io.opentelemetry.javaagent.shaded.instrumentation.api") + + // prevents conflict with library instrumentation + relocate("io.opentelemetry.instrumentation.api", "org.hypertrace.io.opentelemetry.javaagent.shaded.instrumentation.api") //opentelemetry rewrite library instrumentation dependencies - relocate("io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation") { + relocate("io.opentelemetry.instrumentation", "org.hypertrace.io.opentelemetry.javaagent.shaded.instrumentation") { exclude("io.opentelemetry.javaagent.instrumentation.**") } // relocate OpenTelemetry API - 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.spi", "io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") - relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") - relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") - relocate("io.opentelemetry.extension.aws", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + relocate("io.opentelemetry.api", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.api") + relocate("io.opentelemetry.semconv", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") + relocate("io.opentelemetry.spi", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") + relocate("io.opentelemetry.context", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.context") + relocate("io.opentelemetry.extension.kotlin", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") + relocate("io.opentelemetry.extension.aws", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + + relocate("io.opentelemetry", "org.hypertrace.io.opentelemetry") } } diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index 0137a2f3..d99e6f57 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -17,41 +17,153 @@ dependencies { base.archivesBaseName = "hypertrace-agent" -tasks { - processResources { - val customizationShadowTask = project(":instrumentation").tasks.named("shadowJar") - val providerArchive = customizationShadowTask.get().archiveFile - from(zipTree(providerArchive)) { - into("inst") - rename("(^.*)\\.class$", "$1.classdata") +// Step 1: Extract instrumentation project's shadowJar into inst/ folder +tasks.register("extractCustomInstrumentationToInst") { + description = "Extracts instrumentation project's shadowJar into inst/ folder" + + val customizationShadowTask = project(":instrumentation").tasks.named("shadowJar") + val providerArchive = customizationShadowTask.get().archiveFile + + from(zipTree(providerArchive)) { + into("inst") + rename("(^.*)\\.class$", "$1.classdata") + } + + into("$buildDir/resources/main") + + exclude("**/META-INF/LICENSE") + dependsOn(customizationShadowTask) +} + +// Step 2: Extract OpenTelemetry Java Agent's inst/ files and rename .classdata to .class +tasks.register("extractOtelAgentJarInstClassdata") { + description = "Extracts OpenTelemetry Java Agent's .classdata files and renames them to .class" + + val otelJavaAgentJar = configurations.compileClasspath.get() + .filter { it.name.contains("opentelemetry-javaagent") } + .singleOrNull() ?: throw GradleException("OpenTelemetry Java Agent JAR not found") + + doFirst { + println("OpenTelemetry Java Agent JAR: $otelJavaAgentJar") + } + + from(zipTree(otelJavaAgentJar)) { + include("inst/**") + rename("(^.*)\\.classdata$", "$1.class") + } + + // Output to a temporary directory + into("$buildDir/tmp/otel-classdata-for-relocation") +} + +// Step 3: Move contents to inst/ folder with relocated paths +tasks.register("relocateOtelClassesToInst") { + description = "Relocates OpenTelemetry classes to inst/ folder with org.hypertrace prefix" + + dependsOn("extractOtelAgentJarInstClassdata") + + from("$buildDir/tmp/otel-classdata-for-relocation/inst") + + destinationDirectory.set(file("$buildDir/tmp/relocated-otel-classdata")) + archiveFileName.set("relocated-otel-classdata.jar") + + relocate("io.opentelemetry", "org.hypertrace.io.opentelemetry") + + eachFile { + path = "inst/org/hypertrace/$path" + } +} + +// Step 3b: Extract the relocated JAR +tasks.register("extractRelocatedOtelClasses") { + description = "Extracts relocated OpenTelemetry classes" + + dependsOn("relocateOtelClassesToInst") + + from(zipTree("$buildDir/tmp/relocated-otel-classdata/relocated-otel-classdata.jar")) + into("$buildDir/tmp/relocated-otel-classes") +} + +tasks.register("extractOtelInstrumentationToInst") { + description = "Removes empty directories from the relocated classes directory" + + dependsOn("extractRelocatedOtelClasses") + + doLast { + // Find and delete empty directories + val instDir = file("$buildDir/tmp/relocated-otel-classes") + if (instDir.exists()) { + deleteEmptyDirs(instDir) } - exclude("**/META-INF/LICENSE") - dependsOn(customizationShadowTask) } +} + +// Helper function to recursively delete empty directories +fun deleteEmptyDirs(dir: File) { + if (!dir.isDirectory) return + + val children = dir.listFiles() ?: return + + // Recursively process subdirectories + children.filter { it.isDirectory }.forEach { deleteEmptyDirs(it) } + + // Check if directory is empty after processing subdirectories + if (dir.listFiles()?.isEmpty() == true) { + dir.delete() + } +} + +// Step 4: Convert all .class files to .classdata and combine with instrumentation files +tasks.register("combineAndConvertToClassdata") { + description = "Combines all classes and converts to .classdata" + + dependsOn("extractCustomInstrumentationToInst", "extractOtelInstrumentationToInst") + + // include the relocated OpenTelemetry classes + from("$buildDir/tmp/relocated-otel-classes") { + rename("(^.*)\\.class$", "$1.classdata") + } + + // Output to the resources directory for inclusion in the final JAR + into("$buildDir/resources/main") + + // If there are conflicts, our instrumentation project files win + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +// Modify the existing processResources task to depend on our new task +tasks.named("processResources") { + dependsOn("combineAndConvertToClassdata") + exclude("**/META-INF/LICENSE") +} + +tasks { shadowJar { - relocate("com.blogspot.mydailyjava.weaklockfree", "io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree") + relocate("com.blogspot.mydailyjava.weaklockfree", "org.hypertrace.io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree") dependencies { exclude(dependency("org.codehaus.mojo:animal-sniffer-annotations")) exclude(dependency("javax.annotation:javax.annotation-api")) } - relocate("org.slf4j", "io.opentelemetry.javaagent.slf4j") - relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") - relocate("com.fasterxml.jackson", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.fasterxml.jackson") - relocate("org.yaml", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.org.yaml") + relocate("org.slf4j", "org.hypertrace.io.opentelemetry.javaagent.slf4j") + relocate("java.util.logging.Logger", "org.hypertrace.io.opentelemetry.javaagent.bootstrap.PatchLogger") + relocate("com.fasterxml.jackson", "org.hypertrace.io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.fasterxml.jackson") + relocate("org.yaml", "org.hypertrace.io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.org.yaml") // prevents conflict with library instrumentation - relocate("io.opentelemetry.instrumentation.api", "io.opentelemetry.javaagent.shaded.instrumentation.api") + relocate("io.opentelemetry.instrumentation.api", "org.hypertrace.io.opentelemetry.javaagent.shaded.instrumentation.api") // relocate OpenTelemetry API - 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.spi", "io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") - relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") - relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") - relocate("io.opentelemetry.extension.aws", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + relocate("io.opentelemetry.api", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.api") + relocate("io.opentelemetry.semconv", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") + relocate("io.opentelemetry.spi", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") + relocate("io.opentelemetry.context", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.context") + relocate("io.opentelemetry.extension.kotlin", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") + relocate("io.opentelemetry.extension.aws", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + // Shade everything else of io.opentelemetry into org.hypertrace.io.opentelemetry + relocate("io.opentelemetry", "org.hypertrace.io.opentelemetry") mergeServiceFiles { include("inst/META-INF/services/*") @@ -61,7 +173,7 @@ tasks { // Fix CVE-2024-7254, opentelemetry-javaagent brings in io.prometheus.metrics which uses deps of high vulnerability protobuf-java version // This was fixed in 2.x.x versions of opentelemetry-javaagent(which needs us to upgrade from 1.33.0) // TODO: Remove this exclusion after otel-javaagent upgrade which has CVE-2024-7254 fix - exclude("inst/io/prometheus/metrics/shaded/com_google_protobuf_3_21_7/**") + exclude("inst/org/hypertrace/io/prometheus/metrics/shaded/com_google_protobuf_3_21_7/**") exclude("**/module-info.class") manifest { attributes.put("Implementation-Title", "javaagent") @@ -69,7 +181,7 @@ tasks { attributes.put("OpenTelemetry-Instrumentation-Version", "${versions["opentelemetry_java_agent"]}") attributes.put("Implementation-Vendor", "Hypertrace.org") attributes.put("Implementation-Url", "https://github.com/hypertrace/javaagent") - attributes.put("Main-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent") + attributes.put("Main-Class", "org.hypertrace.io.opentelemetry.javaagent.OpenTelemetryAgent") attributes.put("Agent-Class", "org.hypertrace.agent.instrument.HypertraceAgent") attributes.put("Premain-Class", "org.hypertrace.agent.instrument.HypertraceAgent") attributes.put("Can-Redefine-Classes", true) diff --git a/tests-extension/build.gradle.kts b/tests-extension/build.gradle.kts index 1288e5ce..0710f6b8 100644 --- a/tests-extension/build.gradle.kts +++ b/tests-extension/build.gradle.kts @@ -36,14 +36,14 @@ tasks{ // relocate these in sync with // https://github.com/hypertrace/javaagent/blob/main/instrumentation/build.gradle.kts#L56-L82 - relocate("com.fasterxml.jackson", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.fasterxml.jackson") - relocate("com.google", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.google") - relocate("google.protobuf", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.google.protobuf") - relocate("org.checkerframework", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.checkerframework") // transitive dependency form ht-filter-api - relocate("org.yaml", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.org.yaml") // transitive dependency form ht-filter-api - relocate("com.blogspot.mydailyjava.weaklockfree", "io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree") // transitive dependency from ht-filter-api - relocate("org.slf4j", "io.opentelemetry.javaagent.slf4j") - relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") + relocate("com.fasterxml.jackson", "org.hypertrace.io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.fasterxml.jackson") + relocate("com.google", "org.hypertrace.io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.google") + relocate("google.protobuf", "org.hypertrace.io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.google.protobuf") + relocate("org.checkerframework", "org.hypertrace.io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.checkerframework") // transitive dependency form ht-filter-api + relocate("org.yaml", "org.hypertrace.io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.org.yaml") // transitive dependency form ht-filter-api + relocate("com.blogspot.mydailyjava.weaklockfree", "org.hypertrace.io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree") // transitive dependency from ht-filter-api + relocate("org.slf4j", "org.hypertrace.io.opentelemetry.javaagent.slf4j") + relocate("java.util.logging.Logger", "org.hypertrace.io.opentelemetry.javaagent.bootstrap.PatchLogger") relocate("okhttp3", "org.hypertrace.javaagent.filter.com.squareup.okhttp3") relocate("okio", "org.hypertrace.javaagent.filter.com.squareup.okio") // transitive dependency from okhttp @@ -51,13 +51,14 @@ tasks{ // relocate OpenTelemetry API in sync with // https://github.com/hypertrace/javaagent/blob/main/javaagent/build.gradle.kts#L58-L63 - 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.spi", "io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") - relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") - relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") - relocate("io.opentelemetry.extension.aws", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + relocate("io.opentelemetry.api", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.api") + relocate("io.opentelemetry.semconv", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") + relocate("io.opentelemetry.spi", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") + relocate("io.opentelemetry.context", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.context") + relocate("io.opentelemetry.extension.kotlin", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") + relocate("io.opentelemetry.extension.aws", "org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + relocate("io.opentelemetry", "org.hypertrace.io.opentelemetry") manifest { attributes.put("Implementation-Title", "test-filter-impl")