import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { id "com.github.johnrengelman.shadow" } description = 'Auto instrumentation agent' apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/version.gradle" apply from: "$rootDir/gradle/publish.gradle" configurations { shadowInclude } jar { manifest { attributes( "Main-Class": "io.opentelemetry.auto.bootstrap.AgentBootstrap", "Agent-Class": "io.opentelemetry.auto.bootstrap.AgentBootstrap", "Premain-Class": "io.opentelemetry.auto.bootstrap.AgentBootstrap", "Can-Redefine-Classes": true, "Can-Retransform-Classes": true, ) } } CopySpec isolateSpec(Collection sourceTasks) { return copySpec { from(sourceTasks.collect { zipTree(it.archiveFile) }) { // important to keep prefix 'inst' short, as it is prefixed to lots of strings in runtime mem 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' } } } //Includes everything needed for OOTB experience shadowJar { def sourceTasks = [project(':instrumentation').tasks.shadowJar, project(':auto-exporters').tasks.shadowJar] dependsOn sourceTasks with isolateSpec(sourceTasks) } //Includes instrumentations, but not exporters task lightShadow(type: ShadowJar) { from sourceSets.main.output def sourceTasks = [project(':instrumentation').tasks.shadowJar] dependsOn sourceTasks with isolateSpec(sourceTasks) } publishing { publications { maven(MavenPublication) { artifact lightShadow } } } tasks.withType(ShadowJar).configureEach { configurations = [project.configurations.shadowInclude] mergeServiceFiles() manifest { inheritFrom project.tasks.jar.manifest } exclude '**/module-info.class' // Prevents conflict with other SLF4J instances. Important for premain. relocate 'org.slf4j', 'io.opentelemetry.auto.slf4j' // rewrite dependencies calling Logger.getLogger relocate 'java.util.logging.Logger', 'io.opentelemetry.auto.bootstrap.PatchLogger' // prevents conflict with library instrumentation relocate 'io.opentelemetry.instrumentation.api', 'io.opentelemetry.auto.shaded.instrumentation.api' // relocate OpenTelemetry API relocate "io.opentelemetry.OpenTelemetry", "io.opentelemetry.auto.shaded.io.opentelemetry.OpenTelemetry" relocate "io.opentelemetry.common", "io.opentelemetry.auto.shaded.io.opentelemetry.common" relocate "io.opentelemetry.context", "io.opentelemetry.auto.shaded.io.opentelemetry.context" relocate "io.opentelemetry.correlationcontext", "io.opentelemetry.auto.shaded.io.opentelemetry.correlationcontext" relocate "io.opentelemetry.internal", "io.opentelemetry.auto.shaded.io.opentelemetry.internal" relocate "io.opentelemetry.metrics", "io.opentelemetry.auto.shaded.io.opentelemetry.metrics" relocate "io.opentelemetry.trace", "io.opentelemetry.auto.shaded.io.opentelemetry.trace" // relocate OpenTelemetry API dependency relocate "io.grpc", "io.opentelemetry.auto.shaded.io.grpc" } dependencies { testImplementation project(':auto-bootstrap') testImplementation project(':auto-api') testImplementation project(':library-api') testImplementation project(':utils:test-utils') testImplementation deps.testLogging testImplementation deps.guava testImplementation 'io.opentracing.contrib.dropwizard:dropwizard-opentracing:0.2.2' shadowInclude project(path: ':auto-bootstrap') } tasks.withType(Test).configureEach { // Multi-threaded logging seems to be causing deadlocks with Gradle's log capture. // jvmArgs "-Dio.opentelemetry.auto.slf4j.simpleLogger.defaultLogLevel=debug" // jvmArgs "-Dorg.slf4j.simpleLogger.defaultLogLevel=debug" doFirst { // Defining here to allow jacoco to be first on the command line. jvmArgs "-javaagent:${shadowJar.archivePath}" } testLogging { events "started" } dependsOn shadowJar }