diff --git a/.github/workflows/patch-release-build.yml b/.github/workflows/patch-release-build.yml index 62ff939825a6..05c429157b7c 100644 --- a/.github/workflows/patch-release-build.yml +++ b/.github/workflows/patch-release-build.yml @@ -273,6 +273,18 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: javaagent/build/libs/opentelemetry-javaagent-${{ github.event.inputs.version }}-all.jar + asset_path: javaagent/build/libs/opentelemetry-javaagent-${{ github.event.inputs.version }}.jar + asset_name: opentelemetry-javaagent.jar + asset_content_type: application/java-archive + + # TODO (trask) delete this after the 1.7.0 release (to make sure it is used for any 1.6.x patches) + - name: Upload Release Asset (backwards compatible "all" artifact) + id: upload-release-asset + uses: actions/upload-release-asset@v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: javaagent/build/libs/opentelemetry-javaagent-${{ github.event.inputs.version }}.jar asset_name: opentelemetry-javaagent-all.jar asset_content_type: application/java-archive diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 4d64dfc93774..48995525a809 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -181,6 +181,18 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: javaagent/build/libs/opentelemetry-javaagent-${{ github.event.inputs.version }}-all.jar + asset_path: javaagent/build/libs/opentelemetry-javaagent-${{ github.event.inputs.version }}.jar + asset_name: opentelemetry-javaagent.jar + asset_content_type: application/java-archive + + # TODO (trask) delete this after the 1.7.0 release + - name: Upload Release Asset (backwards compatible "all" artifact) + id: upload-release-asset + uses: actions/upload-release-asset@v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: javaagent/build/libs/opentelemetry-javaagent-${{ github.event.inputs.version }}.jar asset_name: opentelemetry-javaagent-all.jar asset_content_type: application/java-archive diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f3912b474bf8..8b7148227e56 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,7 +32,7 @@ java -version and then you can find the java agent artifact at -`javaagent/build/libs/opentelemetry-javaagent--all.jar`. +`javaagent/build/libs/opentelemetry-javaagent-.jar`. ### IntelliJ setup and troubleshooting diff --git a/benchmark-e2e/build.gradle.kts b/benchmark-e2e/build.gradle.kts index 507cce9a7990..20d65fccb971 100644 --- a/benchmark-e2e/build.gradle.kts +++ b/benchmark-e2e/build.gradle.kts @@ -14,11 +14,11 @@ dependencies { tasks { test { - dependsOn(":javaagent:fullJavaagentJar") + dependsOn(":javaagent:shadowJar") maxParallelForks = 2 doFirst { - jvmArgs("-Dio.opentelemetry.smoketest.agent.shadowJar.path=${project(":javaagent").tasks.getByName("fullJavaagentJar").archivePath}") + jvmArgs("-Dio.opentelemetry.smoketest.agent.shadowJar.path=${project(":javaagent").tasks.getByName("shadowJar").archivePath}") } } } diff --git a/benchmark-e2e/src/main/java/io/opentelemetry/e2ebenchmark/AgentBenchmark.java b/benchmark-e2e/src/main/java/io/opentelemetry/e2ebenchmark/AgentBenchmark.java index dff1554a4d9c..5b524fae2e9f 100644 --- a/benchmark-e2e/src/main/java/io/opentelemetry/e2ebenchmark/AgentBenchmark.java +++ b/benchmark-e2e/src/main/java/io/opentelemetry/e2ebenchmark/AgentBenchmark.java @@ -79,9 +79,9 @@ private void runBenchmark() throws InterruptedException { .withLogConsumer(new Slf4jLogConsumer(logger)) .withNetworkAliases("app") .withCopyFileToContainer( - MountableFile.forHostPath(agentPath), "/opentelemetry-javaagent-all.jar") + MountableFile.forHostPath(agentPath), "/opentelemetry-javaagent.jar") .withEnv("OTEL_EXPORTER_OTLP_ENDPOINT", "collector:4317") - .withEnv("JAVA_TOOL_OPTIONS", "-javaagent:/opentelemetry-javaagent-all.jar") + .withEnv("JAVA_TOOL_OPTIONS", "-javaagent:/opentelemetry-javaagent.jar") .withExposedPorts(8080); containers.add(app); diff --git a/benchmark-overhead-jmh/build.gradle.kts b/benchmark-overhead-jmh/build.gradle.kts index 72a10b6592c6..9e11c695d78d 100644 --- a/benchmark-overhead-jmh/build.gradle.kts +++ b/benchmark-overhead-jmh/build.gradle.kts @@ -39,7 +39,7 @@ tasks { val jmhStartFlightRecording = gradle.startParameter.projectProperties.get("jmh.startFlightRecording") named("jmh") { - val shadowTask = project(":javaagent").tasks.named("fullJavaagentJar").get() + val shadowTask = project(":javaagent").tasks.named("shadowJar").get() inputs.files(layout.files(shadowTask)) // note: without an exporter, toSpanData() won't even be called diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/agents/AgentResolver.java b/benchmark-overhead/src/test/java/io/opentelemetry/agents/AgentResolver.java index d03e9d67c550..f117c4a9e7b0 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/agents/AgentResolver.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/agents/AgentResolver.java @@ -43,7 +43,7 @@ private Path downloadAgent(URL agentUrl) throws Exception { OkHttpClient client = new OkHttpClient(); Response response = client.newCall(request).execute(); byte[] raw = response.body().bytes(); - Path path = Paths.get(".", "opentelemetry-javaagent-all.jar"); + Path path = Paths.get(".", "opentelemetry-javaagent.jar"); Files.write( path, raw, diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/agents/LatestAgentSnapshotResolver.java b/benchmark-overhead/src/test/java/io/opentelemetry/agents/LatestAgentSnapshotResolver.java index a38d27289781..3f2d5fe7c31f 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/agents/LatestAgentSnapshotResolver.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/agents/LatestAgentSnapshotResolver.java @@ -35,7 +35,7 @@ Optional resolve() throws IOException { String latestFilename = fetchLatestFilename(version); String url = BASE_URL + "/" + version + "/" + latestFilename; byte[] jarBytes = fetchBodyBytesFrom(url); - Path path = Paths.get(".", "opentelemetry-javaagent-SNAPSHOT-all.jar"); + Path path = Paths.get(".", "opentelemetry-javaagent-SNAPSHOT.jar"); Files.write( path, jarBytes, @@ -55,11 +55,12 @@ private String fetchLatestFilename(String version) throws IOException { elem -> { String classifier = $(elem).child("classifier").content(); String extension = $(elem).child("extension").content(); + // TODO (trask) this needs to be updated now that no more "all" artifact return "all".equals(classifier) && "jar".equals(extension); }) .map(e -> $(e).child("value").content()) .findFirst() - .map(value -> "opentelemetry-javaagent-" + value + "-all.jar") + .map(value -> "opentelemetry-javaagent-" + value + ".jar") .orElseThrow(); } diff --git a/benchmark/build.gradle.kts b/benchmark/build.gradle.kts index 79317e748687..45238f05d349 100644 --- a/benchmark/build.gradle.kts +++ b/benchmark/build.gradle.kts @@ -56,7 +56,7 @@ tasks { } named("jmh") { - dependsOn(":javaagent:fullJavaagentJar") + dependsOn(":javaagent:shadowJar") } } diff --git a/docs/contributing/debugging.md b/docs/contributing/debugging.md index 692ad9ab5c47..ffb83cc15ce5 100644 --- a/docs/contributing/debugging.md +++ b/docs/contributing/debugging.md @@ -33,5 +33,5 @@ The following example shows remote debugger configuration. The breakpoints should work in any code except ByteBuddy advice methods. ```bash -java -agentlib:jdwp="transport=dt_socket,server=y,suspend=y,address=5000" -javaagent:opentelemetry-javaagent--all.jar -jar app.jar +java -agentlib:jdwp="transport=dt_socket,server=y,suspend=y,address=5000" -javaagent:opentelemetry-javaagent-.jar -jar app.jar ``` diff --git a/docs/contributing/javaagent-jar-components.md b/docs/contributing/javaagent-jar-components.md index 985b270b77f2..eead89dd00c4 100644 --- a/docs/contributing/javaagent-jar-components.md +++ b/docs/contributing/javaagent-jar-components.md @@ -72,7 +72,7 @@ still access helper classes from bootstrap classloader. ### Agent jar structure If you now look inside -`javaagent/build/libs/opentelemetry-javaagent--all.jar`, you will see the +`javaagent/build/libs/opentelemetry-javaagent-.jar`, you will see the following "clusters" of classes: Available in the system class loader: @@ -94,7 +94,7 @@ during creation of `javaagent` jar file by Shadow Gradle plugin Available in the agent class loader: - `inst/` - contains `javaagent-tooling` and `javaagent-extension-api` modules and `instrumentation` submodules, loaded and isolated inside `AgentClassLoader`. - Including OpenTelemetry SDK (and the built-in exporters when using the `-all` artifact). + Includes the OpenTelemetry SDK. ![Agent initialization sequence](initialization-sequence.svg) [Image source](https://docs.google.com/drawings/d/1GHAcJ8AOaf_v2Ip82cQD9dN0mtvSk2C1B11KfwV2U8o) diff --git a/docs/manual-instrumentation.md b/docs/manual-instrumentation.md index de18e348090f..4374e3be5c06 100644 --- a/docs/manual-instrumentation.md +++ b/docs/manual-instrumentation.md @@ -18,11 +18,6 @@ or they might want to manually create spans for their own custom code. # Dependencies -> :warning: prior to version 1.0.0, `opentelemetry-javaagent-all.jar` -only supports manual instrumentation using the `opentelemetry-api` version with the same version -number as the Java agent you are using. Starting with 1.0.0, the Java agent will start supporting -multiple (1.0.0+) versions of `opentelemetry-api`. - You'll need to add a dependency on the `opentelemetry-api` library to get started; if you intend to use the `@WithSpan` annotation, also include the `opentelemetry-extension-annotations` dependency. diff --git a/examples/distro/agent/build.gradle b/examples/distro/agent/build.gradle index b1adb6210ad8..81d45d116f4a 100644 --- a/examples/distro/agent/build.gradle +++ b/examples/distro/agent/build.gradle @@ -13,7 +13,7 @@ configurations { dependencies { customShadow project(path: ":custom", configuration: "shadow") customShadow project(path: ":instrumentation", configuration: "shadow") - implementation "io.opentelemetry.javaagent:opentelemetry-javaagent:${versions.opentelemetryJavaagent}:all" + implementation "io.opentelemetry.javaagent:opentelemetry-javaagent:${versions.opentelemetryJavaagent}" } CopySpec isolateSpec() { diff --git a/examples/extension/build.gradle b/examples/extension/build.gradle index e511a980aeec..91b510b68176 100644 --- a/examples/extension/build.gradle +++ b/examples/extension/build.gradle @@ -92,7 +92,7 @@ dependencies { testRuntimeOnly("ch.qos.logback:logback-classic:1.2.3") //Otel Java instrumentation that we use and extend during integration tests - otel("io.opentelemetry.javaagent:opentelemetry-javaagent:${versions.opentelemetryJavaagent}:all") + otel("io.opentelemetry.javaagent:opentelemetry-javaagent:${versions.opentelemetryJavaagent}") //TODO remove when start using io.opentelemetry.instrumentation.javaagent-instrumentation plugin add("codegen", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions.opentelemetryJavaagentAlpha}") @@ -111,7 +111,7 @@ task agentManifest(type: Copy) { //The location of extension directory inside agent jar is hard-coded in the agent source code task extendedAgent(type: Jar) { dependsOn agentManifest - archiveFileName = "opentelemetry-javaagent-all.jar" + archiveFileName = "opentelemetry-javaagent.jar" manifest.from "$buildDir/META-INF/MANIFEST.MF" from zipTree(configurations.otel.singleFile) from(tasks.shadowJar.archiveFile) { diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts index 3ba12aca15b5..26215202ab79 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts @@ -11,8 +11,8 @@ plugins { // TODO write a smoke test that does the following: // -// docker run --mount 'type=bind,src=$AGENT_PATH,dst=/opentelemetry-javaagent-all.jar' -// -e JAVA_TOOL_OPTIONS=-javaagent:/opentelemetry-javaagent-all.jar +// docker run --mount 'type=bind,src=$AGENT_PATH,dst=/opentelemetry-javaagent.jar' +// -e JAVA_TOOL_OPTIONS=-javaagent:/opentelemetry-javaagent.jar // wso2/wso2ei-business-process:6.5.0 // // without this instrumentation, the following error will appear in the docker logs: diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index 8187c981721a..6dfdded223a8 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -35,9 +35,14 @@ val exporterLibs by configurations.creating { isCanBeResolved = true isCanBeConsumed = false } +// this configuration collects just exporter libs for slim artifact (also placed in the agent classloader & isolated from the instrumented application) +val exporterSlimLibs by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} // exclude dependencies that are to be placed in bootstrap from agent libs - they won't be added to inst/ -listOf(javaagentLibs, exporterLibs).forEach { +listOf(javaagentLibs, exporterLibs, exporterSlimLibs).forEach { it.run { exclude("org.slf4j") exclude("io.opentelemetry", "opentelemetry-api") @@ -73,6 +78,10 @@ dependencies { exporterLibs(project(":javaagent-exporters")) + exporterSlimLibs("io.opentelemetry:opentelemetry-exporter-otlp") + exporterSlimLibs("io.opentelemetry:opentelemetry-exporter-otlp-metrics") + exporterSlimLibs("io.grpc:grpc-okhttp:1.41.0") + // We only have compileOnly dependencies on these to make sure they don't leak into POMs. licenseReportDependencies("com.github.ben-manes.caffeine:caffeine") { isTransitive = false @@ -143,12 +152,23 @@ tasks { archiveFileName.set("exporterLibs-relocated.jar") } - // Includes instrumentations, but not exporters + val relocateExporterSlimLibs by registering(ShadowJar::class) { + configurations = listOf(exporterSlimLibs) + + archiveFileName.set("exporterSlimLibs-relocated.jar") + } + + // Includes everything needed for OOTB experience val shadowJar by existing(ShadowJar::class) { configurations = listOf(bootstrapLibs) - dependsOn(relocateJavaagentLibs) + // without an explicit dependency on jar here, :javaagent:test fails on CI because :javaagent:jar + // runs after :javaagent:shadowJar and loses (at least) the manifest entries + dependsOn(jar, relocateJavaagentLibs, relocateExporterLibs) isolateClasses(relocateJavaagentLibs.get().outputs.files) + isolateClasses(relocateExporterLibs.get().outputs.files) + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE archiveClassifier.set("") @@ -164,17 +184,15 @@ tasks { } } - // Includes everything needed for OOTB experience - val fullJavaagentJar by registering(ShadowJar::class) { + // Includes instrumentations plus the OTLP/gRPC exporters + val slimShadowJar by registering(ShadowJar::class) { configurations = listOf(bootstrapLibs) - dependsOn(relocateJavaagentLibs, relocateExporterLibs) + dependsOn(relocateJavaagentLibs, relocateExporterSlimLibs) isolateClasses(relocateJavaagentLibs.get().outputs.files) - isolateClasses(relocateExporterLibs.get().outputs.files) - - duplicatesStrategy = DuplicatesStrategy.EXCLUDE + isolateClasses(relocateExporterSlimLibs.get().outputs.files) - archiveClassifier.set("all") + archiveClassifier.set("slim") manifest { attributes(shadowJar.get().manifest.attributes) @@ -207,18 +225,18 @@ tasks { } assemble { - dependsOn(shadowJar, fullJavaagentJar, baseJavaagentJar) + dependsOn(shadowJar, slimShadowJar, baseJavaagentJar) } withType().configureEach { - dependsOn(fullJavaagentJar) - inputs.file(fullJavaagentJar.get().archiveFile) + dependsOn(shadowJar) + inputs.file(shadowJar.get().archiveFile) jvmArgs("-Dotel.javaagent.debug=true") doFirst { // Defining here to allow jacoco to be first on the command line. - jvmArgs("-javaagent:${fullJavaagentJar.get().archiveFile.get().asFile}") + jvmArgs("-javaagent:${shadowJar.get().archiveFile.get().asFile}") } testLogging { @@ -237,7 +255,7 @@ tasks { publishing { publications { named("maven") { - artifact(fullJavaagentJar) + artifact(slimShadowJar) } } } diff --git a/smoke-tests/build.gradle.kts b/smoke-tests/build.gradle.kts index 80b275261fbf..e5288f98c02d 100644 --- a/smoke-tests/build.gradle.kts +++ b/smoke-tests/build.gradle.kts @@ -43,7 +43,7 @@ dependencies { tasks { test { - inputs.files(project(":javaagent").tasks.getByName("fullJavaagentJar").outputs.files) + inputs.files(project(":javaagent").tasks.getByName("shadowJar").outputs.files) testLogging.showStandardStreams = true @@ -78,7 +78,7 @@ tasks { } } - val shadowTask = project(":javaagent").tasks.named("fullJavaagentJar").get() + val shadowTask = project(":javaagent").tasks.named("shadowJar").get() inputs.files(layout.files(shadowTask)) doFirst {