diff --git a/build.gradle.kts b/build.gradle.kts index c0a9603f1..3136a24cf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,9 +32,9 @@ subprojects { description = "Hypertrace OpenTelemetry Javaagent" extra.set("versions", mapOf( - "opentelemetry" to "1.4.1", - "opentelemetry_java_agent" to "1.4.1-alpha", - "opentelemetry_java_agent_all" to "1.4.1", + "opentelemetry" to "1.5.0", + "opentelemetry_java_agent" to "1.5.3-alpha", + "opentelemetry_java_agent_all" to "1.5.3", "byte_buddy" to "1.11.2", "slf4j" to "1.7.30" )) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 9d183b568..baacc941e 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -28,6 +28,8 @@ dependencies { implementation(gradleApi()) implementation(localGroovy()) + implementation("io.opentelemetry.instrumentation.muzzle-generation:io.opentelemetry.instrumentation.muzzle-generation.gradle.plugin:0.7.0") + implementation("io.opentelemetry.instrumentation.muzzle-check:io.opentelemetry.instrumentation.muzzle-check.gradle.plugin:0.7.0") implementation("com.github.jengelman.gradle.plugins:shadow:6.0.0") implementation("org.eclipse.aether", "aether-connector-basic", "1.1.0") implementation("org.eclipse.aether", "aether-transport-http", "1.1.0") diff --git a/buildSrc/src/main/groovy/MuzzlePlugin.groovy b/buildSrc/src/main/groovy/MuzzlePlugin.groovy index bbee6e450..9fc5fcade 100644 --- a/buildSrc/src/main/groovy/MuzzlePlugin.groovy +++ b/buildSrc/src/main/groovy/MuzzlePlugin.groovy @@ -3,6 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ + +import org.gradle.api.file.FileCollection + import java.lang.reflect.Method import java.security.SecureClassLoader import java.util.concurrent.atomic.AtomicReference @@ -31,6 +34,8 @@ import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.model.ObjectFactory +import java.util.stream.StreamSupport + /** * muzzle task plugin which runs muzzle validation against a range of dependencies. */ @@ -75,7 +80,7 @@ class MuzzlePlugin implements Plugin { project.getLogger().info('No muzzle pass directives configured. Asserting pass against instrumentation compile-time dependencies') ClassLoader userCL = createCompileDepsClassLoader(project, bootstrapProject) ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject) - Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.tooling.muzzle.matcher.MuzzleGradlePluginUtil') + Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil') .getMethod('assertInstrumentationMuzzled', ClassLoader.class, ClassLoader.class, boolean.class) assertionMethod.invoke(null, instrumentationCL, userCL, true) } @@ -87,7 +92,7 @@ class MuzzlePlugin implements Plugin { description = "Print references created by instrumentation muzzle" doLast { ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject) - Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.tooling.muzzle.matcher.MuzzleGradlePluginUtil') + Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil') .getMethod('printMuzzleReferences', ClassLoader.class) assertionMethod.invoke(null, instrumentationCL) } @@ -167,7 +172,8 @@ class MuzzlePlugin implements Plugin { private static ClassLoader createInstrumentationClassloader(Project project, Project toolingProject) { project.getLogger().info("Creating instrumentation classpath for: " + project.getName()) Set urls = new HashSet<>() - for (File f : project.sourceSets.main.runtimeClasspath.getFiles()) { + FileCollection classpath = project.sourceSets.main.runtimeClasspath + toolingProject.configurations.named("instrumentationMuzzle").get() + StreamSupport.stream(classpath.spliterator(), false).forEach { f -> project.getLogger().info('--' + f) urls.add(f.toURI().toURL()) } @@ -370,18 +376,11 @@ class MuzzlePlugin implements Plugin { doLast { ClassLoader instrumentationCL = createInstrumentationClassloader(instrumentationProject, toolingProject) def ccl = Thread.currentThread().contextClassLoader - def bogusLoader = new SecureClassLoader() { - @Override - String toString() { - return "bogus" - } - - } - Thread.currentThread().contextClassLoader = bogusLoader + Thread.currentThread().contextClassLoader = instrumentationCL ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName) try { // find all instrumenters, get muzzle, and assert - Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.tooling.muzzle.matcher.MuzzleGradlePluginUtil') + Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil') .getMethod('assertInstrumentationMuzzled', ClassLoader.class, ClassLoader.class, boolean.class) assertionMethod.invoke(null, instrumentationCL, userCL, muzzleDirective.assertPass) } finally { @@ -389,7 +388,7 @@ class MuzzlePlugin implements Plugin { } for (Thread thread : Thread.getThreads()) { - if (thread.contextClassLoader == bogusLoader || thread.contextClassLoader == instrumentationCL || thread.contextClassLoader == userCL) { + if (thread.contextClassLoader == instrumentationCL || thread.contextClassLoader == userCL) { throw new GradleException("Task $taskName has spawned a thread: $thread with classloader $thread.contextClassLoader. This will prevent GC of dynamic muzzle classes. Aborting muzzle run.") } } diff --git a/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/bytebuddy/ClasspathByteBuddyPlugin.java b/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/bytebuddy/ClasspathByteBuddyPlugin.java index 88ac19583..8cfa3c0e0 100644 --- a/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/bytebuddy/ClasspathByteBuddyPlugin.java +++ b/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/bytebuddy/ClasspathByteBuddyPlugin.java @@ -60,15 +60,15 @@ public boolean matches(TypeDescription typeDefinitions) { private static Plugin pluginFromClassPath( Iterable classPath, File sourceDirectory, String className) { try { - ClassLoader classLoader = classLoaderFromClassPath(classPath, sourceDirectory); + URLClassLoader classLoader = classLoaderFromClassPath(classPath, sourceDirectory); Class clazz = Class.forName(className, false, classLoader); - return (Plugin) clazz.getDeclaredConstructor().newInstance(); + return (Plugin) clazz.getDeclaredConstructor(URLClassLoader.class).newInstance(classLoader); } catch (Exception e) { throw new RuntimeException("Failed to create ByteBuddy plugin instance", e); } } - private static ClassLoader classLoaderFromClassPath( + private static URLClassLoader classLoaderFromClassPath( Iterable classPath, File sourceDirectory) { List urls = new ArrayList<>(); urls.add(fileAsUrl(sourceDirectory)); diff --git a/instrumentation/apache-httpasyncclient-4.1/build.gradle.kts b/instrumentation/apache-httpasyncclient-4.1/build.gradle.kts index e253a135e..0b2efdf19 100644 --- a/instrumentation/apache-httpasyncclient-4.1/build.gradle.kts +++ b/instrumentation/apache-httpasyncclient-4.1/build.gradle.kts @@ -19,7 +19,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/apache-httpclient-4.0/build.gradle.kts b/instrumentation/apache-httpclient-4.0/build.gradle.kts index 52474043a..176b9669e 100644 --- a/instrumentation/apache-httpclient-4.0/build.gradle.kts +++ b/instrumentation/apache-httpclient-4.0/build.gradle.kts @@ -31,7 +31,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/grpc-1.6/build.gradle.kts b/instrumentation/grpc-1.6/build.gradle.kts index a0be3d79d..626d84989 100644 --- a/instrumentation/grpc-1.6/build.gradle.kts +++ b/instrumentation/grpc-1.6/build.gradle.kts @@ -23,7 +23,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/grpc-shaded-netty-1.9/build.gradle.kts b/instrumentation/grpc-shaded-netty-1.9/build.gradle.kts index 363a96a6b..b43fe7d12 100644 --- a/instrumentation/grpc-shaded-netty-1.9/build.gradle.kts +++ b/instrumentation/grpc-shaded-netty-1.9/build.gradle.kts @@ -17,7 +17,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/java-streams/build.gradle.kts b/instrumentation/java-streams/build.gradle.kts index a1b79f60b..516070c72 100644 --- a/instrumentation/java-streams/build.gradle.kts +++ b/instrumentation/java-streams/build.gradle.kts @@ -14,7 +14,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/jaxrs-client-2.0/build.gradle.kts b/instrumentation/jaxrs-client-2.0/build.gradle.kts index 51700cdf5..8cfb5509d 100644 --- a/instrumentation/jaxrs-client-2.0/build.gradle.kts +++ b/instrumentation/jaxrs-client-2.0/build.gradle.kts @@ -24,7 +24,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/netty/netty-4.0/build.gradle.kts b/instrumentation/netty/netty-4.0/build.gradle.kts index 6067cea5c..1dd9687e3 100644 --- a/instrumentation/netty/netty-4.0/build.gradle.kts +++ b/instrumentation/netty/netty-4.0/build.gradle.kts @@ -34,7 +34,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } @@ -45,6 +45,7 @@ val nettyVersion = "4.0.38.Final" dependencies { implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4.0:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4-common:${versions["opentelemetry_java_agent"]}") compileOnly("io.netty:netty-codec-http:${nettyVersion}") { version { strictly(nettyVersion) diff --git a/instrumentation/netty/netty-4.1/build.gradle.kts b/instrumentation/netty/netty-4.1/build.gradle.kts index bfa2a8a00..42b1e2eb9 100644 --- a/instrumentation/netty/netty-4.1/build.gradle.kts +++ b/instrumentation/netty/netty-4.1/build.gradle.kts @@ -34,7 +34,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } @@ -43,6 +43,7 @@ val versions: Map by extra dependencies { implementation("io.opentelemetry.instrumentation:opentelemetry-netty-4.1:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4-common:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4.1:${versions["opentelemetry_java_agent"]}") library("io.netty:netty-codec-http:4.1.0.Final") diff --git a/instrumentation/okhttp/okhttp-3.0/build.gradle.kts b/instrumentation/okhttp/okhttp-3.0/build.gradle.kts index 121eca9fc..3d45208df 100644 --- a/instrumentation/okhttp/okhttp-3.0/build.gradle.kts +++ b/instrumentation/okhttp/okhttp-3.0/build.gradle.kts @@ -17,7 +17,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/servlet/servlet-3.0/build.gradle.kts b/instrumentation/servlet/servlet-3.0/build.gradle.kts index d6272cd52..ee013d4cd 100644 --- a/instrumentation/servlet/servlet-3.0/build.gradle.kts +++ b/instrumentation/servlet/servlet-3.0/build.gradle.kts @@ -22,7 +22,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/servlet/servlet-rw/build.gradle.kts b/instrumentation/servlet/servlet-rw/build.gradle.kts index a1b79f60b..516070c72 100644 --- a/instrumentation/servlet/servlet-rw/build.gradle.kts +++ b/instrumentation/servlet/servlet-rw/build.gradle.kts @@ -14,7 +14,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/spark-2.3/build.gradle.kts b/instrumentation/spark-2.3/build.gradle.kts index 1b731f44f..36f98c0f7 100644 --- a/instrumentation/spark-2.3/build.gradle.kts +++ b/instrumentation/spark-2.3/build.gradle.kts @@ -17,7 +17,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/undertow/undertow-1.4/build.gradle.kts b/instrumentation/undertow/undertow-1.4/build.gradle.kts index 5bb1c6c11..ee9859a06 100644 --- a/instrumentation/undertow/undertow-1.4/build.gradle.kts +++ b/instrumentation/undertow/undertow-1.4/build.gradle.kts @@ -17,7 +17,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/undertow/undertow-servlet-1.4/build.gradle.kts b/instrumentation/undertow/undertow-servlet-1.4/build.gradle.kts index 5519cef33..822398780 100644 --- a/instrumentation/undertow/undertow-servlet-1.4/build.gradle.kts +++ b/instrumentation/undertow/undertow-servlet-1.4/build.gradle.kts @@ -17,7 +17,7 @@ muzzle { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } diff --git a/instrumentation/vertx/vertx-web-3.0/build.gradle.kts b/instrumentation/vertx/vertx-web-3.0/build.gradle.kts index 5d7fe3232..5542cb4c6 100644 --- a/instrumentation/vertx/vertx-web-3.0/build.gradle.kts +++ b/instrumentation/vertx/vertx-web-3.0/build.gradle.kts @@ -8,7 +8,7 @@ plugins { afterEvaluate{ io.opentelemetry.instrumentation.gradle.bytebuddy.ByteBuddyPluginConfigurator(project, sourceSets.main.get(), - "io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin", + io.opentelemetry.javaagent.muzzle.generation.MuzzleCodeGenerationPlugin::class.java.name, project(":javaagent-tooling").configurations["instrumentationMuzzle"] + configurations.runtimeClasspath ).configure() } @@ -28,6 +28,7 @@ val nettyVersion = "4.0.28.Final" dependencies { implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-vertx-web-3.0:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-vertx-http-client-3.0:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-vertx-http-client-common:${versions["opentelemetry_java_agent"]}") library("io.vertx:vertx-web:3.0.0") testImplementation(testFixtures(project(":testing-common"))) diff --git a/javaagent-tooling/build.gradle.kts b/javaagent-tooling/build.gradle.kts index 2b09558f1..401c165bd 100644 --- a/javaagent-tooling/build.gradle.kts +++ b/javaagent-tooling/build.gradle.kts @@ -11,9 +11,14 @@ val instrumentationMuzzle by configurations.creating { val versions: Map by extra +repositories { + gradlePluginPortal() +} + dependencies { api("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions["opentelemetry_java_agent"]}") api("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:${versions["opentelemetry_java_agent"]}") + instrumentationMuzzle("io.opentelemetry.instrumentation:gradle-plugins:0.7.0") instrumentationMuzzle("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}") instrumentationMuzzle("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}") instrumentationMuzzle("net.bytebuddy:byte-buddy:1.11.2")