Gradle cache will ignore bootstrap class path for tests (#1080)

* More attempts to fix cache misses

* Pressing Alt-Enter
This commit is contained in:
Nikita Salnikov-Tarnovski 2020-08-21 17:02:27 +03:00 committed by GitHub
parent c7267fff76
commit 2cdd3e3b95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 34 deletions

View File

@ -16,10 +16,9 @@
package io.opentelemetry.instrumentation.gradle;
import static java.util.stream.Collectors.toList;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.Callable;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
@ -27,9 +26,13 @@ import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.DuplicatesStrategy;
import org.gradle.api.plugins.JavaLibraryPlugin;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.api.tasks.testing.Test;
import org.gradle.jvm.tasks.Jar;
import org.gradle.process.CommandLineArgumentProvider;
import static java.util.stream.Collectors.toList;
/**
* {@link Plugin} to initialize projects that implement auto instrumentation using bytecode
@ -43,11 +46,11 @@ public class AutoInstrumentationPlugin implements Plugin<Project> {
* can't reference it directly since this file needs to be compiled before the other packages.
*/
public static final String[] BOOTSTRAP_PACKAGE_PREFIXES_COPY = {
"io.opentelemetry.javaagent.common.exec",
"io.opentelemetry.javaagent.slf4j",
"io.opentelemetry.javaagent.bootstrap",
"io.opentelemetry.javaagent.shaded",
"io.opentelemetry.instrumentation.auto.api",
"io.opentelemetry.javaagent.common.exec",
"io.opentelemetry.javaagent.slf4j",
"io.opentelemetry.javaagent.bootstrap",
"io.opentelemetry.javaagent.shaded",
"io.opentelemetry.instrumentation.auto.api",
};
// Aditional classes we need only for tests and aren't shared with the agent business logic.
@ -55,32 +58,31 @@ public class AutoInstrumentationPlugin implements Plugin<Project> {
static {
String[] testBS = {
"io.opentelemetry.instrumentation.api",
"io.opentelemetry.OpenTelemetry", // OpenTelemetry API
"io.opentelemetry.common", // OpenTelemetry API
"io.opentelemetry.context", // OpenTelemetry API (context prop)
"io.opentelemetry.correlationcontext", // OpenTelemetry API
"io.opentelemetry.internal", // OpenTelemetry API
"io.opentelemetry.metrics", // OpenTelemetry API
"io.opentelemetry.trace", // OpenTelemetry API
"io.grpc.Context", // OpenTelemetry API dependency
"io.grpc.Deadline", // OpenTelemetry API dependency
"io.grpc.PersistentHashArrayMappedTrie", // OpenTelemetry API dependency
"io.grpc.ThreadLocalContextStorage", // OpenTelemetry API dependency
"org.slf4j",
"ch.qos.logback",
// Tomcat's servlet classes must be on boostrap
// when running tomcat test
"javax.servlet.ServletContainerInitializer",
"javax.servlet.ServletContext"
"io.opentelemetry.instrumentation.api",
"io.opentelemetry.OpenTelemetry", // OpenTelemetry API
"io.opentelemetry.common", // OpenTelemetry API
"io.opentelemetry.context", // OpenTelemetry API (context prop)
"io.opentelemetry.correlationcontext", // OpenTelemetry API
"io.opentelemetry.internal", // OpenTelemetry API
"io.opentelemetry.metrics", // OpenTelemetry API
"io.opentelemetry.trace", // OpenTelemetry API
"io.grpc.Context", // OpenTelemetry API dependency
"io.grpc.Deadline", // OpenTelemetry API dependency
"io.grpc.PersistentHashArrayMappedTrie", // OpenTelemetry API dependency
"io.grpc.ThreadLocalContextStorage", // OpenTelemetry API dependency
"org.slf4j",
"ch.qos.logback",
// Tomcat's servlet classes must be on boostrap
// when running tomcat test
"javax.servlet.ServletContainerInitializer",
"javax.servlet.ServletContext"
};
TEST_BOOTSTRAP_PREFIXES =
Arrays.copyOf(
BOOTSTRAP_PACKAGE_PREFIXES_COPY,
BOOTSTRAP_PACKAGE_PREFIXES_COPY.length + testBS.length);
for (int i = 0; i < testBS.length; ++i) {
TEST_BOOTSTRAP_PREFIXES[i + BOOTSTRAP_PACKAGE_PREFIXES_COPY.length] = testBS[i];
}
System.arraycopy(testBS, 0, TEST_BOOTSTRAP_PREFIXES, BOOTSTRAP_PACKAGE_PREFIXES_COPY.length,
testBS.length);
for (int i = 0; i < TEST_BOOTSTRAP_PREFIXES.length; i++) {
TEST_BOOTSTRAP_PREFIXES[i] = TEST_BOOTSTRAP_PREFIXES[i].replace('.', '/');
}
@ -143,15 +145,28 @@ public class AutoInstrumentationPlugin implements Plugin<Project> {
});
task.dependsOn(bootstrapJar);
task.jvmArgs(
"-Xbootclasspath/a:"
+ new File(project.getBuildDir(), "libs/" + bootstrapJarName));
task.getJvmArgumentProviders().add(new BootstrapClasspath(
new File(project.getBuildDir(), "libs/" + bootstrapJarName)));
});
}
private static class BootstrapClasspath implements CommandLineArgumentProvider {
@Internal
File bootstrapJar;
public BootstrapClasspath(File bootstrapJar) {
this.bootstrapJar = bootstrapJar;
}
@Override
public Iterable<String> asArguments() {
return Collections.singleton("-Xbootclasspath/a:" + bootstrapJar.getAbsolutePath());
}
}
private static boolean isBootstrapClass(String filePath) {
for (int i = 0; i < TEST_BOOTSTRAP_PREFIXES.length; ++i) {
if (filePath.startsWith(TEST_BOOTSTRAP_PREFIXES[i])) {
for (String testBootstrapPrefix : TEST_BOOTSTRAP_PREFIXES) {
if (filePath.startsWith(testBootstrapPrefix)) {
return true;
}
}

View File

@ -15,4 +15,4 @@ muzzle {
dependencies {
library group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.0'
}
}