From 02b421ccd98ce3c1e1e8659aaa0ccd1c991e4eed Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Fri, 22 Jan 2021 15:38:17 +0200 Subject: [PATCH 1/4] No more gradle warnings --- gradle.properties | 2 ++ gradle/instrumentation.gradle | 11 ++++++++++- javaagent-api/javaagent-api.gradle | 8 ++++++++ javaagent-tooling/javaagent-tooling.gradle | 2 ++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0b5e135ed3cc..e7ed03a2ec0a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,3 +5,5 @@ org.gradle.priority=low # Gradle default is 256m which causes issues with our build - https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m + +org.gradle.warning.mode=fail diff --git a/gradle/instrumentation.gradle b/gradle/instrumentation.gradle index 88a661ab325e..3c868cde5837 100644 --- a/gradle/instrumentation.gradle +++ b/gradle/instrumentation.gradle @@ -23,6 +23,13 @@ if (projectDir.name == 'javaagent') { archivesBaseName = projectDir.parentFile.name } +configurations { + byteBuddyRuntime { + canBeConsumed = false + canBeResolved = true + } +} + afterEvaluate { dependencies { compileOnly project(':instrumentation-api') @@ -46,11 +53,13 @@ afterEvaluate { testImplementation project(':utils:test-utils') testImplementation deps.testcontainers + + byteBuddyRuntime(project(path: ":javaagent-tooling", configuration: 'instrumentationMuzzle')) } def pluginName = 'io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin' new ByteBuddyPluginConfigurator(project, sourceSets.main, pluginName, - project(':javaagent-tooling').configurations.instrumentationMuzzle + configurations.runtimeClasspath + configurations.byteBuddyRuntime + configurations.runtimeClasspath ).configure() } diff --git a/javaagent-api/javaagent-api.gradle b/javaagent-api/javaagent-api.gradle index b607f6b85a05..aef2605c6f35 100644 --- a/javaagent-api/javaagent-api.gradle +++ b/javaagent-api/javaagent-api.gradle @@ -35,3 +35,11 @@ dependencies { testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.6.0' testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.18.1' } + +sourcesJar { + /* + We have two javacc config above. They both generate some overlapping files, e.g. ParseException.java. + As they both add generated files to sources, this results in duplicating files. + */ + duplicatesStrategy = DuplicatesStrategy.INCLUDE +} diff --git a/javaagent-tooling/javaagent-tooling.gradle b/javaagent-tooling/javaagent-tooling.gradle index 597f281f7f77..b0c9abfff373 100644 --- a/javaagent-tooling/javaagent-tooling.gradle +++ b/javaagent-tooling/javaagent-tooling.gradle @@ -10,6 +10,8 @@ minimumInstructionCoverage = 0 configurations { // classpath used by the instrumentation muzzle plugin instrumentationMuzzle { + canBeConsumed = true + canBeResolved = false extendsFrom implementation } } From da88e498e3298b85a40b7fa384064564001127a3 Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Fri, 22 Jan 2021 15:58:34 +0200 Subject: [PATCH 2/4] No more gradle warnings --- .../src/main/resources/META-INF/gradle-plugins/muzzle.properties | 1 - 1 file changed, 1 deletion(-) delete mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/muzzle.properties diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/muzzle.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/muzzle.properties deleted file mode 100644 index 61b482e54a86..000000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/muzzle.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=MuzzlePlugin From b42e2fab4b4f7e800e9c157f9e4dda3dad3f98c7 Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Fri, 22 Jan 2021 18:28:42 +0200 Subject: [PATCH 3/4] Let's try again --- buildSrc/src/main/groovy/MuzzlePlugin.groovy | 40 +++++++++---------- gradle/instrumentation.gradle | 13 ++++-- .../javaagent-bootstrap.gradle | 9 +++++ 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/buildSrc/src/main/groovy/MuzzlePlugin.groovy b/buildSrc/src/main/groovy/MuzzlePlugin.groovy index bbee6e4508bd..c9760f4d264d 100644 --- a/buildSrc/src/main/groovy/MuzzlePlugin.groovy +++ b/buildSrc/src/main/groovy/MuzzlePlugin.groovy @@ -73,8 +73,8 @@ class MuzzlePlugin implements Plugin { doLast { if (!project.muzzle.directives.any { it.assertPass }) { 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) + ClassLoader userCL = createCompileDepsClassLoader(project) + ClassLoader instrumentationCL = createInstrumentationClassloader(project) Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.tooling.muzzle.matcher.MuzzleGradlePluginUtil') .getMethod('assertInstrumentationMuzzled', ClassLoader.class, ClassLoader.class, boolean.class) assertionMethod.invoke(null, instrumentationCL, userCL, true) @@ -86,7 +86,7 @@ class MuzzlePlugin implements Plugin { group = 'Muzzle' description = "Print references created by instrumentation muzzle" doLast { - ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject) + ClassLoader instrumentationCL = createInstrumentationClassloader(project) Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.tooling.muzzle.matcher.MuzzleGradlePluginUtil') .getMethod('printMuzzleReferences', ClassLoader.class) assertionMethod.invoke(null, instrumentationCL) @@ -125,15 +125,15 @@ class MuzzlePlugin implements Plugin { project.getLogger().info("configured $muzzleDirective") if (muzzleDirective.coreJdk) { - runAfter = addMuzzleTask(muzzleDirective, null, project, runAfter, bootstrapProject, toolingProject) + runAfter = addMuzzleTask(muzzleDirective, null, project, runAfter) } else { muzzleDirectiveToArtifacts(muzzleDirective, system, session).collect() { Artifact singleVersion -> - runAfter = addMuzzleTask(muzzleDirective, singleVersion, project, runAfter, bootstrapProject, toolingProject) + runAfter = addMuzzleTask(muzzleDirective, singleVersion, project, runAfter) } if (muzzleDirective.assertInverse) { inverseOf(muzzleDirective, system, session).collect() { MuzzleDirective inverseDirective -> muzzleDirectiveToArtifacts(inverseDirective, system, session).collect() { Artifact singleVersion -> - runAfter = addMuzzleTask(inverseDirective, singleVersion, project, runAfter, bootstrapProject, toolingProject) + runAfter = addMuzzleTask(inverseDirective, singleVersion, project, runAfter) } } } @@ -142,14 +142,14 @@ class MuzzlePlugin implements Plugin { } } - private static ClassLoader getOrCreateToolingLoader(Project toolingProject) { + private static ClassLoader getOrCreateToolingLoader(Project project) { synchronized (TOOLING_LOADER) { ClassLoader toolingLoader = TOOLING_LOADER.get() if (toolingLoader == null) { Set urls = new HashSet<>() - toolingProject.getLogger().info('creating classpath for auto-tooling') - for (File f : toolingProject.sourceSets.main.runtimeClasspath.getFiles()) { - toolingProject.getLogger().info('--' + f) + project.getLogger().info('creating classpath for auto-tooling') + for (File f : project.configurations.toolingRuntime.getFiles()) { + project.getLogger().info('--' + f) urls.add(f.toURI().toURL()) } def loader = new URLClassLoader(urls.toArray(new URL[0]), ClassLoader.platformClassLoader) @@ -164,7 +164,7 @@ class MuzzlePlugin implements Plugin { /** * Create a classloader with core agent classes and project instrumentation on the classpath. */ - private static ClassLoader createInstrumentationClassloader(Project project, Project toolingProject) { + private static ClassLoader createInstrumentationClassloader(Project project) { project.getLogger().info("Creating instrumentation classpath for: " + project.getName()) Set urls = new HashSet<>() for (File f : project.sourceSets.main.runtimeClasspath.getFiles()) { @@ -172,20 +172,20 @@ class MuzzlePlugin implements Plugin { urls.add(f.toURI().toURL()) } - return new URLClassLoader(urls.toArray(new URL[0]), getOrCreateToolingLoader(toolingProject)) + return new URLClassLoader(urls.toArray(new URL[0]), getOrCreateToolingLoader(project)) } /** * Create a classloader with all compile-time dependencies on the classpath */ - private static ClassLoader createCompileDepsClassLoader(Project project, Project bootstrapProject) { + private static ClassLoader createCompileDepsClassLoader(Project project) { List userUrls = new ArrayList<>() project.getLogger().info("Creating compile-time classpath for: " + project.getName()) for (File f : project.configurations.compileOnly.getFiles()) { project.getLogger().info('--' + f) userUrls.add(f.toURI().toURL()) } - for (File f : bootstrapProject.sourceSets.main.runtimeClasspath.getFiles()) { + for (File f : project.configurations.bootstrapRuntime.getFiles()) { project.getLogger().info('--' + f) userUrls.add(f.toURI().toURL()) } @@ -195,7 +195,7 @@ class MuzzlePlugin implements Plugin { /** * Create a classloader with dependencies for a single muzzle task. */ - private static ClassLoader createClassLoaderForTask(Project project, Project bootstrapProject, String muzzleTaskName) { + private static ClassLoader createClassLoaderForTask(Project project, String muzzleTaskName) { List userUrls = new ArrayList<>() project.getLogger().info("Creating task classpath") @@ -204,7 +204,7 @@ class MuzzlePlugin implements Plugin { userUrls.add(jarFile.toURI().toURL()) } - for (File f : bootstrapProject.sourceSets.main.runtimeClasspath.getFiles()) { + for (File f : project.configurations.bootstrapRuntime.getFiles()) { project.getLogger().info("-- Added to instrumentation bootstrap classpath: $f") userUrls.add(f.toURI().toURL()) } @@ -334,12 +334,10 @@ class MuzzlePlugin implements Plugin { * @param versionArtifact version to assert against. * @param instrumentationProject instrumentation being asserted against. * @param runAfter Task which runs before the new muzzle task. - * @param bootstrapProject Agent bootstrap project. - * @param toolingProject Agent tooling project. * * @return The created muzzle task. */ - private static Task addMuzzleTask(MuzzleDirective muzzleDirective, Artifact versionArtifact, Project instrumentationProject, Task runAfter, Project bootstrapProject, Project toolingProject) { + private static Task addMuzzleTask(MuzzleDirective muzzleDirective, Artifact versionArtifact, Project instrumentationProject, Task runAfter) { def taskName if (muzzleDirective.coreJdk) { taskName = "muzzle-Assert$muzzleDirective" @@ -368,7 +366,7 @@ class MuzzlePlugin implements Plugin { def muzzleTask = instrumentationProject.task(taskName) { dependsOn(instrumentationProject.configurations.named("runtimeClasspath")) doLast { - ClassLoader instrumentationCL = createInstrumentationClassloader(instrumentationProject, toolingProject) + ClassLoader instrumentationCL = createInstrumentationClassloader(instrumentationProject) def ccl = Thread.currentThread().contextClassLoader def bogusLoader = new SecureClassLoader() { @Override @@ -378,7 +376,7 @@ class MuzzlePlugin implements Plugin { } Thread.currentThread().contextClassLoader = bogusLoader - ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName) + ClassLoader userCL = createClassLoaderForTask(instrumentationProject, taskName) try { // find all instrumenters, get muzzle, and assert Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.tooling.muzzle.matcher.MuzzleGradlePluginUtil') diff --git a/gradle/instrumentation.gradle b/gradle/instrumentation.gradle index 3c868cde5837..545ee34ccff7 100644 --- a/gradle/instrumentation.gradle +++ b/gradle/instrumentation.gradle @@ -24,7 +24,12 @@ if (projectDir.name == 'javaagent') { } configurations { - byteBuddyRuntime { + toolingRuntime { + canBeConsumed = false + canBeResolved = true + } + + bootstrapRuntime { canBeConsumed = false canBeResolved = true } @@ -54,12 +59,14 @@ afterEvaluate { testImplementation deps.testcontainers - byteBuddyRuntime(project(path: ":javaagent-tooling", configuration: 'instrumentationMuzzle')) + toolingRuntime(project(path: ":javaagent-tooling", configuration: 'instrumentationMuzzle')) + + bootstrapRuntime(project(path: ":javaagent-bootstrap", configuration: 'instrumentationMuzzle')) } def pluginName = 'io.opentelemetry.javaagent.tooling.muzzle.collector.MuzzleCodeGenerationPlugin' new ByteBuddyPluginConfigurator(project, sourceSets.main, pluginName, - configurations.byteBuddyRuntime + configurations.runtimeClasspath + configurations.toolingRuntime + configurations.runtimeClasspath ).configure() } diff --git a/javaagent-bootstrap/javaagent-bootstrap.gradle b/javaagent-bootstrap/javaagent-bootstrap.gradle index 92a5de2f8699..62b4c7965480 100644 --- a/javaagent-bootstrap/javaagent-bootstrap.gradle +++ b/javaagent-bootstrap/javaagent-bootstrap.gradle @@ -7,6 +7,15 @@ apply from: "$rootDir/gradle/publish.gradle" minimumBranchCoverage = 0.0 minimumInstructionCoverage = 0.0 +configurations { + // classpath used by the instrumentation muzzle plugin + instrumentationMuzzle { + canBeConsumed = true + canBeResolved = false + extendsFrom implementation + } +} + dependencies { api deps.opentelemetryApi api deps.opentelemetryApiMetrics From ea82b689cfb6926d599fac717688ae8f47a5d9b7 Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Fri, 22 Jan 2021 19:16:58 +0200 Subject: [PATCH 4/4] No more gradle warnings --- buildSrc/src/main/groovy/MuzzlePlugin.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/groovy/MuzzlePlugin.groovy b/buildSrc/src/main/groovy/MuzzlePlugin.groovy index c9760f4d264d..aac8c19e1ca1 100644 --- a/buildSrc/src/main/groovy/MuzzlePlugin.groovy +++ b/buildSrc/src/main/groovy/MuzzlePlugin.groovy @@ -181,7 +181,7 @@ class MuzzlePlugin implements Plugin { private static ClassLoader createCompileDepsClassLoader(Project project) { List userUrls = new ArrayList<>() project.getLogger().info("Creating compile-time classpath for: " + project.getName()) - for (File f : project.configurations.compileOnly.getFiles()) { + for (File f : project.configurations.compileClasspath.getFiles()) { project.getLogger().info('--' + f) userUrls.add(f.toURI().toURL()) }