Skip to content

Commit

Permalink
Upgrade otel 1 10 (#357)
Browse files Browse the repository at this point in the history
* ⬆️ upgrade otel

* ♻️ update servlet-common packaging

* ♻️ update HttpStatusConverter package location'

* ♻️ update TestOpenTelemetryInstaller to be an AgentListener

* ➕ add new deps to the testing bootstrap

* ➕ add logging exporter to classpath explicitly for tests

* ♻️ fix initialization in instrumentation tests

* ➕ add servlet-common bootstrap to test runtime for servlet projects

* ♻️ refactor MuzzlePlugin to handle refactor of MuzzleGradlePluginUtil to kotlin companion object'

* 🐛 fix muzzle check for instrumentation modules that need the servlet-common bootstrap

* ⬆️ upgrade byte buddy

* 🐛 fix expected metric name for otlp exporter exported'

* 🐛 disable assertions failing due to upstream bug
  • Loading branch information
ryandens authored Jan 24, 2022
1 parent 7cb15a9 commit d94a530
Show file tree
Hide file tree
Showing 20 changed files with 144 additions and 101 deletions.
10 changes: 5 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ subprojects {
extra.set("versions", mapOf(
// when updating these values, some values must also be updated in buildSrc as this map
// cannot be accessed there
"opentelemetry" to "1.9.1",
"opentelemetry" to "1.10.0",
"opentelemetry_proto" to "0.11.0-alpha",
"opentelemetry_java_agent" to "1.9.2-alpha",
"opentelemetry_java_agent_all" to "1.9.2",
"opentelemetry_gradle_plugin" to "1.9.2-alpha",
"byte_buddy" to "1.11.22",
"opentelemetry_java_agent" to "1.10.0-alpha",
"opentelemetry_java_agent_all" to "1.10.0",
"opentelemetry_gradle_plugin" to "1.10.0-alpha",
"byte_buddy" to "1.12.6",
"slf4j" to "1.7.30"
))

Expand Down
6 changes: 3 additions & 3 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ repositories {
dependencies {
implementation(gradleApi())
implementation(localGroovy())
val otelInstrumentationVersion = "1.9.2-alpha"
val otelInstrumentationVersion = "1.10.0-alpha"
implementation("io.opentelemetry.javaagent:opentelemetry-muzzle:$otelInstrumentationVersion")
implementation("io.opentelemetry.instrumentation.muzzle-generation:io.opentelemetry.instrumentation.muzzle-generation.gradle.plugin:$otelInstrumentationVersion")
implementation("io.opentelemetry.instrumentation.muzzle-check:io.opentelemetry.instrumentation.muzzle-check.gradle.plugin:$otelInstrumentationVersion")
Expand All @@ -40,10 +40,10 @@ dependencies {
implementation("org.ow2.asm", "asm", "9.1")
implementation("org.ow2.asm", "asm-tree", "9.1")
implementation("org.apache.httpcomponents:httpclient:4.5.10")
implementation("net.bytebuddy:byte-buddy-gradle-plugin:1.11.22") {
implementation("net.bytebuddy:byte-buddy-gradle-plugin:1.12.6") {
exclude(group = "net.bytebuddy", module = "byte-buddy")
}
implementation("net.bytebuddy:byte-buddy-dep:1.11.22")
implementation("net.bytebuddy:byte-buddy-dep:1.12.6")

testImplementation("org.spockframework", "spock-core", "1.3-groovy-2.5")
testImplementation("org.codehaus.groovy", "groovy-all", "2.5.8")
Expand Down
39 changes: 25 additions & 14 deletions buildSrc/src/main/groovy/MuzzlePlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
*/


import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil
import org.gradle.api.file.FileCollection
import org.gradle.api.file.RegularFile
import org.gradle.api.tasks.bundling.AbstractArchiveTask

import java.lang.reflect.Method
import java.security.SecureClassLoader
import java.util.concurrent.atomic.AtomicReference
import java.util.function.Predicate
import java.util.regex.Pattern
Expand Down Expand Up @@ -72,6 +74,13 @@ class MuzzlePlugin implements Plugin<Project> {
// compileMuzzle compiles all projects required to run muzzle validation.
// Not adding group and description to keep this task from showing in `gradle tasks`.
def compileMuzzle = project.task('compileMuzzle')
def muzzleBootstrap = project.configurations.create("muzzleBootstrap")
muzzleBootstrap.setCanBeConsumed(false)
muzzleBootstrap.setCanBeResolved(true)
def shadowMuzzleBootstrap = project.tasks.create("shadowMuzzleBootstrap", ShadowJar.class) {
configurations = [muzzleBootstrap]
archiveFileName.set("bootstrap-for-muzzle-check.jar")
}
def muzzle = project.task('muzzle') {
group = 'Muzzle'
description = "Run instrumentation muzzle on compile time dependencies"
Expand All @@ -80,21 +89,18 @@ class MuzzlePlugin implements Plugin<Project> {
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.muzzle.matcher.MuzzleGradlePluginUtil')
.getMethod('assertInstrumentationMuzzled', ClassLoader.class, ClassLoader.class, boolean.class)
assertionMethod.invoke(null, instrumentationCL, userCL, true)
MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, true)
}
println "Muzzle executing for $project"
}
dependsOn(shadowMuzzleBootstrap)
}
def printReferences = project.task('printMuzzleReferences') {
group = 'Muzzle'
description = "Print references created by instrumentation muzzle"
doLast {
ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject)
Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil')
.getMethod('printMuzzleReferences', ClassLoader.class)
assertionMethod.invoke(null, instrumentationCL)
MuzzleGradlePluginUtil.@Companion.printMuzzleReferences(instrumentationCL)
}
}
project.tasks.compileMuzzle.dependsOn(bootstrapProject.tasks.compileJava)
Expand Down Expand Up @@ -201,7 +207,7 @@ class MuzzlePlugin implements Plugin<Project> {
/**
* 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, Project bootstrapProject, String muzzleTaskName, RegularFile shadowMuzzleArchiveFile) {
List<URL> userUrls = new ArrayList<>()

project.getLogger().info("Creating task classpath")
Expand All @@ -214,6 +220,9 @@ class MuzzlePlugin implements Plugin<Project> {
project.getLogger().info("-- Added to instrumentation bootstrap classpath: $f")
userUrls.add(f.toURI().toURL())
}
if (shadowMuzzleArchiveFile != null) {
userUrls.add(shadowMuzzleArchiveFile.asFile.toURI().toURL())
}
return new URLClassLoader(userUrls.toArray(new URL[0]), ClassLoader.platformClassLoader)
}

Expand Down Expand Up @@ -377,12 +386,14 @@ class MuzzlePlugin implements Plugin<Project> {
ClassLoader instrumentationCL = createInstrumentationClassloader(instrumentationProject, toolingProject)
def ccl = Thread.currentThread().contextClassLoader
Thread.currentThread().contextClassLoader = instrumentationCL
ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName)
def shadowMuzzleTask = project.tasks.findByName("shadowMuzzleBootstrap") as AbstractArchiveTask
RegularFile shadowMuzzleArchiveFile
if (shadowMuzzleTask != null) {
shadowMuzzleArchiveFile = shadowMuzzleTask.getArchiveFile().get()
}
ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName, shadowMuzzleArchiveFile)
try {
// find all instrumenters, get muzzle, and assert
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)
MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, muzzleDirective.assertPass)
} finally {
Thread.currentThread().contextClassLoader = ccl
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.AttributeKeys;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.DataCaptureUtils;
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyClientSingletons;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.AttributeKeys;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.DataCaptureUtils;
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.NettyServerSingletons;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.AttributeKeys;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.DataCaptureUtils;
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyClientSingletons;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.AttributeKeys;
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.DataCaptureUtils;
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.NettyServerSingletons;
Expand Down
4 changes: 3 additions & 1 deletion instrumentation/servlet/servlet-3.0/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,14 @@ afterEvaluate{
val versions: Map<String, String> by extra

dependencies {
implementation("io.opentelemetry.instrumentation:opentelemetry-servlet-common:${versions["opentelemetry_java_agent"]}")
implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common:${versions["opentelemetry_java_agent"]}")
implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}") // Servlet3Accessor
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}")
testImplementation("io.opentelemetry.javaagent:opentelemetry-muzzle:${versions["opentelemetry_java_agent"]}")
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}")
compileOnly("javax.servlet:javax.servlet-api:3.1.0")
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
muzzleBootstrap("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")

testImplementation(project(":instrumentation:servlet:servlet-rw"))
testImplementation(testFixtures(project(":testing-common")) as ProjectDependency) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.instrumentation.api.field.VirtualField;
import io.opentelemetry.instrumentation.servlet.ServletAsyncListener;
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.Utils;
import io.opentelemetry.javaagent.instrumentation.servlet.ServletAsyncListener;
import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons;
import java.io.BufferedReader;
import java.io.PrintWriter;
Expand Down
3 changes: 3 additions & 0 deletions instrumentation/spark-2.3/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

plugins {
`java-library`
id("net.bytebuddy.byte-buddy")
Expand Down Expand Up @@ -30,6 +31,8 @@ dependencies {
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-spark-2.3:${versions["opentelemetry_java_agent"]}")
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}")
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-jetty-8.0:${versions["opentelemetry_java_agent"]}")
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
muzzleBootstrap("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")

compileOnly("com.sparkjava:spark-core:2.3")

Expand Down
1 change: 1 addition & 0 deletions instrumentation/struts-2.3/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ dependencies {
exclude(group = "org.eclipse.jetty", module = "jetty-server")
}
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}")
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
testImplementation("org.apache.struts:struts2-core:2.3.1")
testImplementation("org.apache.struts:struts2-json-plugin:2.3.1")
testImplementation("org.eclipse.jetty:jetty-server:8.0.0.v20110901")
Expand Down
1 change: 1 addition & 0 deletions instrumentation/undertow/undertow-1.4/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ dependencies {
testImplementation("io.undertow:undertow-servlet:2.0.0.Final")
testRuntimeOnly(project(":instrumentation:servlet:servlet-3.0"))
testRuntimeOnly(project(":instrumentation:undertow:undertow-servlet-1.4"))
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
}

2 changes: 1 addition & 1 deletion javaagent-tooling/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ dependencies {
instrumentationMuzzle("io.opentelemetry.instrumentation:gradle-plugins:${versions["opentelemetry_gradle_plugin"]}")
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-dep:1.11.22")
instrumentationMuzzle("net.bytebuddy:byte-buddy-dep:1.12.6")
instrumentationMuzzle("com.google.auto.service:auto-service:1.0")
instrumentationMuzzle("org.slf4j:slf4j-api:${versions["slf4j"]}")
}
Original file line number Diff line number Diff line change
Expand Up @@ -174,9 +174,13 @@ public void postJson() throws IOException, InterruptedException {

ArrayList<ExportMetricsServiceRequest> metrics = new ArrayList<>(waitForMetrics());
Assertions.assertTrue(hasMetricNamed("otlp.exporter.seen", metrics));
Assertions.assertTrue(hasMetricNamed("otlp.exported.exported", metrics));
Assertions.assertTrue(hasMetricNamed("otlp.exporter.exported", metrics));
/*
These metrics stopped being reported in OTEL SDK 1.10.0, due to a bug in the OpenTelemetry SDK
Autoconfigure project https://github.com/open-telemetry/opentelemetry-java/issues/4109
Assertions.assertTrue(hasMetricNamed("processedSpans", metrics));
Assertions.assertTrue(hasMetricNamed("queueSize", metrics));
*/
Assertions.assertTrue(hasMetricNamed("runtime.jvm.gc.count", metrics));
Assertions.assertTrue(hasMetricNamed("runtime.jvm.gc.time", metrics));
Assertions.assertTrue(hasMetricNamed("runtime.jvm.memory.pool", metrics));
Expand Down
2 changes: 2 additions & 0 deletions testing-bootstrap/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ dependencies {
api("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}")
api("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}")
api("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:${versions["opentelemetry_java_agent"]}")
api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal:${versions["opentelemetry_java_agent"]}")
api("io.opentelemetry:opentelemetry-exporter-otlp:${versions["opentelemetry"]}")
implementation(project(":javaagent-core"))
implementation(project(":filter-api"))

Expand Down
1 change: 1 addition & 0 deletions testing-common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ dependencies {
testFixturesCompileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${versions["opentelemetry"]}-alpha")
testFixturesApi("com.squareup.okhttp3:okhttp:4.9.0")
testFixturesApi("com.squareup.okhttp3:logging-interceptor:4.9.0")
testFixturesImplementation("io.opentelemetry:opentelemetry-exporter-logging:${versions["opentelemetry"]}")
testFixturesImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}")
testFixturesImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions["opentelemetry_java_agent"]}") {
constraints {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder;
import io.opentelemetry.javaagent.extension.AgentListener;
import io.opentelemetry.javaagent.tooling.AgentInstaller;
import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
Expand All @@ -47,8 +47,6 @@ public abstract class AbstractInstrumenterTest {
private static final org.slf4j.Logger log =
LoggerFactory.getLogger(AbstractInstrumenterTest.class);

private static final AgentListener COMPONENT_INSTALLER;

/**
* For test runs, agent's global tracer will report to this list writer.
*
Expand All @@ -72,8 +70,6 @@ public abstract class AbstractInstrumenterTest {
// TODO causes Caused by: java.lang.ClassCastException
((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).setLevel(Level.WARN);
((Logger) LoggerFactory.getLogger("io.opentelemetry")).setLevel(Level.DEBUG);

COMPONENT_INSTALLER = new TestOpenTelemetryInstaller(TEST_WRITER);
}

private static ClassFileTransformer classFileTransformer;
Expand All @@ -88,10 +84,30 @@ public abstract class AbstractInstrumenterTest {

@BeforeAll
public static void beforeAll() {
/*
* OpenTelemetry moved the initialization of some agent primitives to the OTEL class
* OpenTelemetryAgent which does not get used in the scope of these tests. To remove this
* workaround, we should adopt their testing pattern leveraging the agent-for-teseting artifact
* and the AgentInstrumentationExtension for JUnit.
*/
TestAgentStarter testAgentStarter = new TestAgentStarter();
try {
Class<?> agentInitializerClass =
ClassLoader.getSystemClassLoader()
.loadClass("io.opentelemetry.javaagent.bootstrap.AgentInitializer");
Field agentClassLoaderField = agentInitializerClass.getDeclaredField("agentClassLoader");
agentClassLoaderField.setAccessible(true);
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
agentClassLoaderField.set(null, systemClassLoader);
Field agentStarterField = agentInitializerClass.getDeclaredField("agentStarter");
agentStarterField.setAccessible(true);
agentStarterField.set(null, testAgentStarter);
} catch (Throwable t) {
throw new AssertionError("Could not access agent classLoader", t);
}
if (classFileTransformer == null) {
classFileTransformer =
AgentInstaller.installBytebuddyAgent(
INSTRUMENTATION, Collections.singleton(COMPONENT_INSTALLER));
AgentInstaller.installBytebuddyAgent(INSTRUMENTATION, Collections.emptyList());
}
if (TEST_TRACER == null) {
TEST_TRACER = GlobalOpenTelemetry.getTracer("io.opentelemetry.auto");
Expand Down
Loading

0 comments on commit d94a530

Please sign in to comment.