Change the default javaagent artifact to have exporters (#4106)

* Change default javaagent to all, introduce slim

* Update release builds

* Update examples build

* Update benchmark-overhead

* Update benchmark-e2e

* Update docs where ok pre-release

* Update misc

* Fix references to fullJavaagentJar

* Fix it

* Delete doc for pre-1.0 releases

* Attach backwards compatible "all" artifact to releases

* Comment

* Comment

* guessing

* fix

* Update version

* Add otlp/grpc exporter to slim artifact

* Fix comment
This commit is contained in:
Trask Stalnaker 2021-10-02 11:28:11 -07:00 committed by GitHub
parent ff0bf0a8f3
commit cfdc4ac7e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 80 additions and 42 deletions

View File

@ -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

View File

@ -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

View File

@ -32,7 +32,7 @@ java -version
and then you can find the java agent artifact at
`javaagent/build/libs/opentelemetry-javaagent-<version>-all.jar`.
`javaagent/build/libs/opentelemetry-javaagent-<version>.jar`.
### IntelliJ setup and troubleshooting

View File

@ -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<ShadowJar>("fullJavaagentJar").archivePath}")
jvmArgs("-Dio.opentelemetry.smoketest.agent.shadowJar.path=${project(":javaagent").tasks.getByName<ShadowJar>("shadowJar").archivePath}")
}
}
}

View File

@ -79,9 +79,9 @@ public class AgentBenchmark {
.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);

View File

@ -39,7 +39,7 @@ tasks {
val jmhStartFlightRecording = gradle.startParameter.projectProperties.get("jmh.startFlightRecording")
named<JMHTask>("jmh") {
val shadowTask = project(":javaagent").tasks.named<ShadowJar>("fullJavaagentJar").get()
val shadowTask = project(":javaagent").tasks.named<ShadowJar>("shadowJar").get()
inputs.files(layout.files(shadowTask))
// note: without an exporter, toSpanData() won't even be called

View File

@ -43,7 +43,7 @@ public class AgentResolver {
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,

View File

@ -35,7 +35,7 @@ public class LatestAgentSnapshotResolver {
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 @@ public class LatestAgentSnapshotResolver {
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();
}

View File

@ -56,7 +56,7 @@ tasks {
}
named("jmh") {
dependsOn(":javaagent:fullJavaagentJar")
dependsOn(":javaagent:shadowJar")
}
}

View File

@ -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-<version>-all.jar -jar app.jar
java -agentlib:jdwp="transport=dt_socket,server=y,suspend=y,address=5000" -javaagent:opentelemetry-javaagent-<version>.jar -jar app.jar
```

View File

@ -72,7 +72,7 @@ still access helper classes from bootstrap classloader.
### Agent jar structure
If you now look inside
`javaagent/build/libs/opentelemetry-javaagent-<version>-all.jar`, you will see the
`javaagent/build/libs/opentelemetry-javaagent-<version>.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)

View File

@ -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.

View File

@ -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() {

View File

@ -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) {

View File

@ -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:

View File

@ -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)
isolateClasses(relocateExporterSlimLibs.get().outputs.files)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
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<Test>().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<MavenPublication>("maven") {
artifact(fullJavaagentJar)
artifact(slimShadowJar)
}
}
}

View File

@ -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<ShadowJar>("fullJavaagentJar").get()
val shadowTask = project(":javaagent").tasks.named<ShadowJar>("shadowJar").get()
inputs.files(layout.files(shadowTask))
doFirst {