diff --git a/build.gradle.kts b/build.gradle.kts index 4063cab8b..986f5ac58 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,8 +28,8 @@ subprojects { description = "Hypertrace OpenTelemetry Javaagent" extra.set("versions", mapOf( - "opentelemetry" to "0.14.1", - "opentelemetry_java_agent" to "0.14.0", + "opentelemetry" to "0.15.0", + "opentelemetry_java_agent" to "0.15.1", "byte_buddy" to "1.10.18" )) diff --git a/instrumentation/build.gradle.kts b/instrumentation/build.gradle.kts index 28a6c3be1..2e840ab6b 100644 --- a/instrumentation/build.gradle.kts +++ b/instrumentation/build.gradle.kts @@ -79,8 +79,10 @@ tasks { // relocate OpenTelemetry API relocate("io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api") + relocate("io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") relocate("io.opentelemetry.spi", "io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") + relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") relocate ("io.opentelemetry.extension.trace.propagation", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.trace.propagation") } } diff --git a/instrumentation/grpc-1.5/build.gradle.kts b/instrumentation/grpc-1.5/build.gradle.kts index 48fb2380e..128289d58 100644 --- a/instrumentation/grpc-1.5/build.gradle.kts +++ b/instrumentation/grpc-1.5/build.gradle.kts @@ -55,21 +55,38 @@ protobuf { } val versions: Map by extra +val grpcVersion = "1.5.0" dependencies { api("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-grpc-1.5:${versions["opentelemetry_java_agent"]}") api("io.opentelemetry.instrumentation:opentelemetry-grpc-1.5:${versions["opentelemetry_java_agent"]}") - compileOnly("io.grpc:grpc-core:1.5.0") - compileOnly("io.grpc:grpc-protobuf:1.5.0") - compileOnly("io.grpc:grpc-stub:1.5.0") - compileOnly("io.grpc:grpc-netty:1.5.0") + compileOnly("io.grpc:grpc-core:${grpcVersion}") + compileOnly("io.grpc:grpc-protobuf:${grpcVersion}") + compileOnly("io.grpc:grpc-stub:${grpcVersion}") + compileOnly("io.grpc:grpc-netty:${grpcVersion}") implementation("javax.annotation:javax.annotation-api:1.3.2") testImplementation(project(":testing-common")) - testImplementation("io.grpc:grpc-core:1.5.0") - testImplementation("io.grpc:grpc-protobuf:1.5.0") - testImplementation("io.grpc:grpc-stub:1.5.0") - testImplementation("io.grpc:grpc-netty:1.5.0") + testImplementation("io.grpc:grpc-core:${grpcVersion}") { + version { + strictly(grpcVersion) + } + } + testImplementation("io.grpc:grpc-protobuf:${grpcVersion}") { + version { + strictly(grpcVersion) + } + } + testImplementation("io.grpc:grpc-stub:${grpcVersion}") { + version { + strictly(grpcVersion) + } + } + testImplementation("io.grpc:grpc-netty:${grpcVersion}") { + version { + strictly(grpcVersion) + } + } } diff --git a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java index db37914fc..35a33d124 100644 --- a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java +++ b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java @@ -147,11 +147,13 @@ public static void available(InputStream inputStream, int available) { } SpanAndBuffer spanAndBuffer = GlobalObjectRegistry.inputStreamToSpanAndBufferMap.get(inputStream); - InputStreamUtils.addBody( - spanAndBuffer.span, - spanAndBuffer.attributeKey, - spanAndBuffer.byteArrayBuffer, - spanAndBuffer.charset); - GlobalObjectRegistry.inputStreamToSpanAndBufferMap.remove(inputStream); + if (spanAndBuffer != null) { + InputStreamUtils.addBody( + spanAndBuffer.span, + spanAndBuffer.attributeKey, + spanAndBuffer.byteArrayBuffer, + spanAndBuffer.charset); + GlobalObjectRegistry.inputStreamToSpanAndBufferMap.remove(inputStream); + } } } diff --git a/instrumentation/netty/netty-4.0/build.gradle.kts b/instrumentation/netty/netty-4.0/build.gradle.kts index e58c1e7a3..14f1f93b1 100644 --- a/instrumentation/netty/netty-4.0/build.gradle.kts +++ b/instrumentation/netty/netty-4.0/build.gradle.kts @@ -40,11 +40,48 @@ afterEvaluate{ } val versions: Map by extra +// version used by async-http-client:2.0.9 +val nettyVersion = "4.0.38.Final" dependencies { implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4.0:${versions["opentelemetry_java_agent"]}") - implementation("io.netty:netty-codec-http:4.0.0.Final") + compileOnly("io.netty:netty-codec-http:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + + testImplementation("io.netty:netty-codec-http:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-transport:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-common:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-codec:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-handler:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-buffer:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } testImplementation(project(":testing-common")) testImplementation("org.asynchttpclient:async-http-client:2.0.9") diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/NettyInstrumentationModule.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/NettyInstrumentationModule.java index 0e8c0b83b..52d102836 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/NettyInstrumentationModule.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/NettyInstrumentationModule.java @@ -16,11 +16,15 @@ package io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0; +import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; +import static net.bytebuddy.matcher.ElementMatchers.not; + import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Arrays; import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) public class NettyInstrumentationModule extends InstrumentationModule { @@ -34,6 +38,13 @@ public int getOrder() { return -1; } + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // Class added in 4.1.0 and not in 4.0.56 to avoid resolving this instrumentation completely + // when using 4.1. + return not(hasClassesNamed("io.netty.handler.codec.http.CombinedHttpHeaders")); + } + @Override public List typeInstrumentations() { return Arrays.asList(new NettyChannelPipelineInstrumentation()); diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyInstrumentationModule.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyInstrumentationModule.java index b66c9341f..e4c90cef3 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyInstrumentationModule.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyInstrumentationModule.java @@ -16,11 +16,14 @@ package io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1; +import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; + import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Arrays; import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) public class NettyInstrumentationModule extends InstrumentationModule { @@ -34,6 +37,13 @@ public int getOrder() { return -1; } + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // Class added in 4.1.0 and not in 4.0.56 to avoid resolving this instrumentation completely + // when using 4.0. + return hasClassesNamed("io.netty.handler.codec.http.CombinedHttpHeaders"); + } + @Override public List typeInstrumentations() { return Arrays.asList(new NettyChannelPipelineInstrumentation()); diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java index a83fd887b..cb12cdc53 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java @@ -18,8 +18,6 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import java.io.BufferedReader; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicBoolean; @@ -34,6 +32,7 @@ import org.hypertrace.agent.config.Config.AgentConfig; import org.hypertrace.agent.core.config.HypertraceConfig; import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -45,11 +44,11 @@ public class BodyCaptureAsyncListener implements AsyncListener { private final AtomicBoolean responseHandled; private final Span span; - private final ContextStore responseContextStore; + private final ContextStore responseContextStore; private final ContextStore streamContextStore; private final ContextStore writerContextStore; - private final ContextStore requestContextStore; + private final ContextStore requestContextStore; private final ContextStore inputStreamContextStore; private final ContextStore readerContextStore; @@ -58,10 +57,10 @@ public class BodyCaptureAsyncListener implements AsyncListener { public BodyCaptureAsyncListener( AtomicBoolean responseHandled, Span span, - ContextStore responseContextStore, + ContextStore responseContextStore, ContextStore streamContextStore, ContextStore writerContextStore, - ContextStore requestContextStore, + ContextStore requestContextStore, ContextStore inputStreamContextStore, ContextStore readerContextStore) { this.responseHandled = responseHandled; diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java index 19278be69..c7343939a 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java @@ -17,6 +17,7 @@ package io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.safeHasSuperType; +import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -28,8 +29,6 @@ import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.io.BufferedReader; import java.io.PrintWriter; @@ -51,6 +50,7 @@ import org.hypertrace.agent.config.Config.AgentConfig; import org.hypertrace.agent.core.config.HypertraceConfig; import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -60,9 +60,14 @@ public class Servlet31NoWrappingInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderOptimization() { + return hasClassesNamed("javax.servlet.Filter"); + } + @Override public ElementMatcher typeMatcher() { - return safeHasSuperType(namedOneOf("javax.servlet.Filter", "javax.servlet.http.HttpServlet")); + return safeHasSuperType(namedOneOf("javax.servlet.Filter", "javax.servlet.Servlet")); } @Override @@ -103,8 +108,8 @@ public static boolean start( && ContentTypeUtils.shouldCapture(contentType)) { // The HttpServletRequest instrumentation uses this to // enable the instrumentation - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class) - .put(httpRequest, new RequestStreamReaderHolder(currentSpan)); + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class) + .put(httpRequest, new SpanAndObjectPair(currentSpan)); } Utils.addSessionId(currentSpan, httpRequest); @@ -152,18 +157,17 @@ public static void exit( HttpServletRequest httpRequest = (HttpServletRequest) request; AgentConfig agentConfig = HypertraceConfig.get(); + // response context to capture body and clear the context + ContextStore responseContextStore = + InstrumentationContext.get(HttpServletResponse.class, SpanAndObjectPair.class); ContextStore outputStreamContextStore = InstrumentationContext.get(ServletOutputStream.class, BoundedByteArrayOutputStream.class); ContextStore writerContextStore = InstrumentationContext.get(PrintWriter.class, BoundedCharArrayWriter.class); - // response context to capture body and clear the context - ContextStore responseContextStore = - InstrumentationContext.get(HttpServletResponse.class, ResponseStreamWriterHolder.class); - // request context to clear body buffer - ContextStore requestContextStore = - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class); + ContextStore requestContextStore = + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class); ContextStore inputStreamContextStore = InstrumentationContext.get(ServletInputStream.class, ByteBufferSpanPair.class); ContextStore readerContextStore = diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java index a92acd13d..36a773ed7 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java @@ -19,10 +19,8 @@ import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletInputStreamInstrumentation; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletRequestInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletOutputStreamInstrumentation; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletResponseInstrumentation; import io.opentelemetry.javaagent.tooling.InstrumentationModule; @@ -32,6 +30,7 @@ import java.util.List; import java.util.Map; import net.bytebuddy.matcher.ElementMatcher; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -68,13 +67,12 @@ public List typeInstrumentations() { protected Map contextStore() { Map context = new HashMap<>(); // capture request body - context.put("javax.servlet.http.HttpServletRequest", RequestStreamReaderHolder.class.getName()); + context.put("javax.servlet.http.HttpServletRequest", SpanAndObjectPair.class.getName()); context.put("javax.servlet.ServletInputStream", ByteBufferSpanPair.class.getName()); context.put("java.io.BufferedReader", CharBufferSpanPair.class.getName()); // capture response body - context.put( - "javax.servlet.http.HttpServletResponse", ResponseStreamWriterHolder.class.getName()); + context.put("javax.servlet.http.HttpServletResponse", SpanAndObjectPair.class.getName()); context.put("javax.servlet.ServletOutputStream", BoundedByteArrayOutputStream.class.getName()); context.put("java.io.PrintWriter", BoundedCharArrayWriter.class.getName()); return context; diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java index 8e7baa82c..f102c4f60 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java @@ -18,8 +18,6 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; @@ -29,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -50,19 +49,19 @@ public static void addSessionId(Span span, HttpServletRequest httpRequest) { public static void captureResponseBody( Span span, HttpServletResponse httpServletResponse, - ContextStore responseContextStore, + ContextStore responseContextStore, ContextStore streamContextStore, ContextStore writerContextStore) { - ResponseStreamWriterHolder responseStreamWriterHolder = - responseContextStore.get(httpServletResponse); + SpanAndObjectPair responseStreamWriterHolder = responseContextStore.get(httpServletResponse); if (responseStreamWriterHolder == null) { return; } responseContextStore.put(httpServletResponse, null); - if (responseStreamWriterHolder.getServletOutputStream() != null) { - ServletOutputStream servletOutputStream = responseStreamWriterHolder.getServletOutputStream(); + if (responseStreamWriterHolder.getAssociatedObject() instanceof ServletOutputStream) { + ServletOutputStream servletOutputStream = + (ServletOutputStream) responseStreamWriterHolder.getAssociatedObject(); BoundedByteArrayOutputStream buffer = streamContextStore.get(servletOutputStream); if (buffer != null) { try { @@ -74,10 +73,8 @@ public static void captureResponseBody( } streamContextStore.put(servletOutputStream, null); } - } - - if (responseStreamWriterHolder.getPrintWriter() != null) { - PrintWriter printWriter = responseStreamWriterHolder.getPrintWriter(); + } else if (responseStreamWriterHolder.getAssociatedObject() instanceof PrintWriter) { + PrintWriter printWriter = (PrintWriter) responseStreamWriterHolder.getAssociatedObject(); BoundedCharArrayWriter buffer = writerContextStore.get(printWriter); if (buffer != null) { span.setAttribute(HypertraceSemanticAttributes.HTTP_RESPONSE_BODY, buffer.toString()); @@ -88,22 +85,22 @@ public static void captureResponseBody( public static void resetRequestBodyBuffers( HttpServletRequest httpServletRequest, - ContextStore requestContextStore, + ContextStore requestContextStore, ContextStore streamContextStore, ContextStore bufferedReaderContextStore) { - RequestStreamReaderHolder requestStreamReaderHolder = - requestContextStore.get(httpServletRequest); + SpanAndObjectPair requestStreamReaderHolder = requestContextStore.get(httpServletRequest); if (requestContextStore == null) { return; } requestContextStore.put(httpServletRequest, null); - if (requestStreamReaderHolder.getServletInputStream() != null) { - streamContextStore.put(requestStreamReaderHolder.getServletInputStream(), null); - } - if (requestStreamReaderHolder.getBufferedReader() != null) { - bufferedReaderContextStore.put(requestStreamReaderHolder.getBufferedReader(), null); + if (requestStreamReaderHolder.getAssociatedObject() instanceof ServletInputStream) { + streamContextStore.put( + (ServletInputStream) requestStreamReaderHolder.getAssociatedObject(), null); + } else if (requestStreamReaderHolder.getAssociatedObject() instanceof BufferedReader) { + bufferedReaderContextStore.put( + (BufferedReader) requestStreamReaderHolder.getAssociatedObject(), null); } } } diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java index ec8dbe4fc..f28019c98 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java @@ -37,6 +37,7 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher.Junction; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; import org.hypertrace.agent.core.instrumentation.buffer.CharBufferSpanPair; @@ -67,11 +68,11 @@ public Map, String> transfor static class ServletRequest_getInputStream_advice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static RequestStreamReaderHolder enter(@Advice.This ServletRequest servletRequest) { + public static SpanAndObjectPair enter(@Advice.This ServletRequest servletRequest) { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; // span is added in servlet/filter instrumentation if data capture is enabled - RequestStreamReaderHolder requestBufferWrapper = - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class) + SpanAndObjectPair requestBufferWrapper = + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class) .get(httpServletRequest); if (requestBufferWrapper == null) { return null; @@ -87,9 +88,9 @@ public static void exit( @Advice.This ServletRequest servletRequest, @Advice.Return ServletInputStream servletInputStream, @Advice.Thrown Throwable throwable, - @Advice.Enter RequestStreamReaderHolder requestStreamReaderHolder) { + @Advice.Enter SpanAndObjectPair spanAndObjectPair) { - if (requestStreamReaderHolder == null) { + if (spanAndObjectPair == null) { return; } @@ -111,26 +112,25 @@ public static void exit( } ByteBufferSpanPair bufferSpanPair = - Utils.createRequestByteBufferSpanPair( - httpServletRequest, requestStreamReaderHolder.getSpan()); + Utils.createRequestByteBufferSpanPair(httpServletRequest, spanAndObjectPair.getSpan()); contextStore.put(servletInputStream, bufferSpanPair); - requestStreamReaderHolder.setServletInputStream(servletInputStream); + spanAndObjectPair.setAssociatedObject(servletInputStream); } } static class ServletRequest_getReader_advice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static RequestStreamReaderHolder enter(@Advice.This ServletRequest servletRequest) { + public static SpanAndObjectPair enter(@Advice.This ServletRequest servletRequest) { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; - RequestStreamReaderHolder requestStreamReaderHolder = - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class) + SpanAndObjectPair spanAndObjectPair = + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class) .get(httpServletRequest); - if (requestStreamReaderHolder == null) { + if (spanAndObjectPair == null) { return null; } CallDepthThreadLocalMap.incrementCallDepth(ServletRequest.class); - return requestStreamReaderHolder; + return spanAndObjectPair; } @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) @@ -138,9 +138,9 @@ public static void exit( @Advice.This ServletRequest servletRequest, @Advice.Return BufferedReader reader, @Advice.Thrown Throwable throwable, - @Advice.Enter RequestStreamReaderHolder requestStreamReaderHolder) { + @Advice.Enter SpanAndObjectPair spanAndObjectPair) { - if (requestStreamReaderHolder == null) { + if (spanAndObjectPair == null) { return; } @@ -162,10 +162,9 @@ public static void exit( } CharBufferSpanPair bufferSpanPair = - Utils.createRequestCharBufferSpanPair( - httpServletRequest, requestStreamReaderHolder.getSpan()); + Utils.createRequestCharBufferSpanPair(httpServletRequest, spanAndObjectPair.getSpan()); contextStore.put(reader, bufferSpanPair); - requestStreamReaderHolder.setBufferedReader(reader); + spanAndObjectPair.setAssociatedObject(reader); } } } diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ResponseStreamWriterHolder.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ResponseStreamWriterHolder.java deleted file mode 100644 index 370aa47f1..000000000 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ResponseStreamWriterHolder.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response; - -import java.io.PrintWriter; -import javax.servlet.ServletOutputStream; - -public class ResponseStreamWriterHolder { - - private final ServletOutputStream servletOutputStream; - private final PrintWriter printWriter; - - public ResponseStreamWriterHolder(ServletOutputStream servletOutputStream) { - this.servletOutputStream = servletOutputStream; - this.printWriter = null; - } - - public ResponseStreamWriterHolder(PrintWriter printWriter) { - this.printWriter = printWriter; - this.servletOutputStream = null; - } - - public ServletOutputStream getServletOutputStream() { - return servletOutputStream; - } - - public PrintWriter getPrintWriter() { - return printWriter; - } -} diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java index 39e16956d..57c658f96 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java @@ -41,6 +41,7 @@ import net.bytebuddy.matcher.ElementMatcher.Junction; import org.hypertrace.agent.config.Config.AgentConfig; import org.hypertrace.agent.core.config.HypertraceConfig; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedBuffersFactory; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; @@ -124,8 +125,10 @@ public static void exit( Charset charset = ContentTypeCharsetUtils.toCharset(charsetStr); BoundedByteArrayOutputStream buffer = BoundedBuffersFactory.createStream(charset); contextStore.put(servletOutputStream, buffer); - InstrumentationContext.get(HttpServletResponse.class, ResponseStreamWriterHolder.class) - .put(httpServletResponse, new ResponseStreamWriterHolder(servletOutputStream)); + SpanAndObjectPair spanAndObjectPair = new SpanAndObjectPair(null); + spanAndObjectPair.setAssociatedObject(servletOutputStream); + InstrumentationContext.get(HttpServletResponse.class, SpanAndObjectPair.class) + .put(httpServletResponse, spanAndObjectPair); } } } @@ -179,8 +182,10 @@ public static void exit( BoundedCharArrayWriter writer = BoundedBuffersFactory.createWriter(); contextStore.put(printWriter, writer); - InstrumentationContext.get(HttpServletResponse.class, ResponseStreamWriterHolder.class) - .put(httpServletResponse, new ResponseStreamWriterHolder(printWriter)); + SpanAndObjectPair spanAndObjectPair = new SpanAndObjectPair(null); + spanAndObjectPair.setAssociatedObject(printWriter); + InstrumentationContext.get(HttpServletResponse.class, SpanAndObjectPair.class) + .put(httpServletResponse, spanAndObjectPair); } } } diff --git a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java index fb4712ae0..e0d16bea3 100644 --- a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java +++ b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java @@ -200,6 +200,7 @@ public static void exit( return; } + System.out.println("Capturing readLine"); if (line == null) { bufferSpanPair.captureBody(HypertraceSemanticAttributes.HTTP_REQUEST_BODY); } else { diff --git a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java index 1822dbe3f..1b868e039 100644 --- a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java +++ b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java @@ -21,6 +21,7 @@ import java.io.CharArrayReader; import java.io.IOException; import org.BufferedReaderPrintWriterContextAccess; +import org.TestBufferedReader; import org.hypertrace.agent.core.instrumentation.buffer.*; import org.hypertrace.agent.testing.AbstractInstrumenterTest; import org.junit.jupiter.api.Assertions; @@ -119,7 +120,7 @@ public void readLine() throws IOException { Span span = TEST_TRACER.spanBuilder(TEST_SPAN_NAME).startSpan(); BufferedReader bufferedReader = - new BufferedReader(new CharArrayReader((BODY + "\n").toCharArray())); + new TestBufferedReader(new CharArrayReader((BODY + "\n").toCharArray())); BoundedCharArrayWriter buffer = BoundedBuffersFactory.createWriter(); CharBufferSpanPair bufferSpanPair = new CharBufferSpanPair(span, buffer); diff --git a/instrumentation/servlet/servlet-rw/src/test/java/org/TestBufferedReader.java b/instrumentation/servlet/servlet-rw/src/test/java/org/TestBufferedReader.java new file mode 100644 index 000000000..2d28f5e90 --- /dev/null +++ b/instrumentation/servlet/servlet-rw/src/test/java/org/TestBufferedReader.java @@ -0,0 +1,34 @@ +/* + * Copyright The Hypertrace Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; + +public class TestBufferedReader extends BufferedReader { + + public TestBufferedReader(Reader in) { + super(in); + } + + @Override + public String readLine() throws IOException { + System.out.println("override readline"); + return super.readLine(); + } +} diff --git a/instrumentation/spark-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/sparkjava/SparkJavaBodyInstrumentationModule.java b/instrumentation/spark-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/sparkjava/SparkJavaBodyInstrumentationModule.java deleted file mode 100644 index 41f0828fb..000000000 --- a/instrumentation/spark-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/sparkjava/SparkJavaBodyInstrumentationModule.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.sparkjava; - -import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.Servlet31NoWrappingInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.Servlet31NoWrappingInstrumentationModule; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletInputStreamInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletRequestInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletOutputStreamInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletResponseInstrumentation; -import io.opentelemetry.javaagent.tooling.InstrumentationModule; -import io.opentelemetry.javaagent.tooling.TypeInstrumentation; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * {@code Spark.after} is not being called if a handler throws an exception. Exception handler - * {@code Spark.exception} cannot be used because it overrides user defined exception handlers. This - * might be fine as on exception there is usually not body send to users. - */ -@AutoService(InstrumentationModule.class) -public class SparkJavaBodyInstrumentationModule extends Servlet31NoWrappingInstrumentationModule { - - @Override - public int getOrder() { - return 1; - } - - @Override - public List typeInstrumentations() { - return Arrays.asList( - new SparkJavaBodyInstrumentation(), - new Servlet31NoWrappingInstrumentation(), - new ServletRequestInstrumentation(), - new ServletInputStreamInstrumentation(), - new ServletResponseInstrumentation(), - new ServletOutputStreamInstrumentation()); - } - - private static class SparkJavaBodyInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher typeMatcher() { - return named("spark.webserver.MatcherFilter").or(named("spark.http.matching.MatcherFilter")); - } - - @Override - public Map, String> transformers() { - return singletonMap( - namedOneOf("doFilter") - .and(takesArgument(0, named("javax.servlet.ServletRequest"))) - .and(takesArgument(1, named("javax.servlet.ServletResponse"))) - .and(isPublic()), - Servlet31NoWrappingInstrumentation.ServletAdvice.class.getName()); - } - } -} diff --git a/instrumentation/vertx-web-3.0/build.gradle.kts b/instrumentation/vertx-web-3.0/build.gradle.kts index cdb43b739..da22d8097 100644 --- a/instrumentation/vertx-web-3.0/build.gradle.kts +++ b/instrumentation/vertx-web-3.0/build.gradle.kts @@ -22,6 +22,8 @@ afterEvaluate{ } val versions: Map by extra +// version used by io.vertx:vertx-web:3.0.0 +val nettyVersion = "4.0.28.Final" dependencies { testImplementation(project(":testing-common")) @@ -29,5 +31,37 @@ dependencies { testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4.0:${versions["opentelemetry_java_agent"]}") testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-vertx-web-3.0:${versions["opentelemetry_java_agent"]}") testImplementation("io.vertx:vertx-web:3.0.0") + + + testImplementation("io.netty:netty-codec-http:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-transport:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-common:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-codec:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-handler:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } + testImplementation("io.netty:netty-buffer:${nettyVersion}") { + version { + strictly(nettyVersion) + } + } } diff --git a/javaagent-core/build.gradle.kts b/javaagent-core/build.gradle.kts index daab79fe9..14b3eb544 100644 --- a/javaagent-core/build.gradle.kts +++ b/javaagent-core/build.gradle.kts @@ -4,6 +4,7 @@ plugins { `java-library` idea id("com.google.protobuf") version "0.8.13" + id("org.hypertrace.publish-plugin") } protobuf { diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/RequestStreamReaderHolder.java b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/SpanAndObjectPair.java similarity index 50% rename from instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/RequestStreamReaderHolder.java rename to javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/SpanAndObjectPair.java index a2b8b252e..ef8f4f3ce 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/RequestStreamReaderHolder.java +++ b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/SpanAndObjectPair.java @@ -14,19 +14,16 @@ * limitations under the License. */ -package io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request; +package org.hypertrace.agent.core.instrumentation; import io.opentelemetry.api.trace.Span; -import java.io.BufferedReader; -import javax.servlet.ServletInputStream; -public class RequestStreamReaderHolder { +public class SpanAndObjectPair { private final Span span; - private ServletInputStream servletInputStream; - private BufferedReader bufferedReader; + private Object associatedObject; - public RequestStreamReaderHolder(Span span) { + public SpanAndObjectPair(Span span) { this.span = span; } @@ -34,19 +31,11 @@ public Span getSpan() { return span; } - public ServletInputStream getServletInputStream() { - return servletInputStream; + public Object getAssociatedObject() { + return associatedObject; } - public void setServletInputStream(ServletInputStream servletInputStream) { - this.servletInputStream = servletInputStream; - } - - public BufferedReader getBufferedReader() { - return bufferedReader; - } - - public void setBufferedReader(BufferedReader bufferedReader) { - this.bufferedReader = bufferedReader; + public void setAssociatedObject(Object associatedObject) { + this.associatedObject = associatedObject; } } diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index fd3339a61..3568330eb 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { // https://oss.jfrog.org/artifactory/oss-snapshot-local/io/opentelemetry/instrumentation/auto/ // https://dl.bintray.com/open-telemetry/maven/ implementation("io.opentelemetry.javaagent", "opentelemetry-javaagent", version = "${versions["opentelemetry_java_agent"]}", classifier = "all") - implementation(project(":javaagent-core")) implementation(project(":filter-api")) } @@ -50,16 +49,17 @@ tasks { } relocate("org.slf4j", "io.opentelemetry.javaagent.slf4j") - // TODO causes data not being reported -// relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") + relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") // prevents conflict with library instrumentation relocate("io.opentelemetry.instrumentation.api", "io.opentelemetry.javaagent.shaded.instrumentation.api") // relocate OpenTelemetry API relocate("io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api") + relocate("io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv") relocate("io.opentelemetry.spi", "io.opentelemetry.javaagent.shaded.io.opentelemetry.spi") relocate("io.opentelemetry.context", "io.opentelemetry.javaagent.shaded.io.opentelemetry.context") + relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") relocate("io.opentelemetry.extension.trace.propagation", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.trace.propagation") mergeServiceFiles { diff --git a/javaagent/src/main/java/org/hypertrace/agent/instrument/HypertraceAgent.java b/javaagent/src/main/java/org/hypertrace/agent/instrument/HypertraceAgent.java index c96f05d95..6dde821e0 100644 --- a/javaagent/src/main/java/org/hypertrace/agent/instrument/HypertraceAgent.java +++ b/javaagent/src/main/java/org/hypertrace/agent/instrument/HypertraceAgent.java @@ -16,28 +16,13 @@ package org.hypertrace.agent.instrument; -import com.google.common.annotations.VisibleForTesting; import io.opentelemetry.javaagent.OpenTelemetryAgent; import java.lang.instrument.Instrumentation; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import org.hypertrace.agent.config.Config.AgentConfig; -import org.hypertrace.agent.config.Config.PropagationFormat; -import org.hypertrace.agent.core.config.HypertraceConfig; public class HypertraceAgent { - // https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/sdk-environment-variables.md - private static final String OTEL_EXPORTER = "otel.exporter"; - private static final String OTEL_PROPAGATORS = "otel.propagators"; - private static final String OTEL_EXPORTER_ZIPKIN_ENDPOINT = "otel.exporter.zipkin.endpoint"; - private static final String OTEL_EXPORTER_ZIPKIN_SERVICE_NAME = - "otel.exporter.zipkin.service.name"; - private static final String OTEL_PROCESSOR_BATCH_MAX_QUEUE = "otel.bsp.max.queue.size"; - private static final String OTEL_DEFAULT_LOG_LEVEL = - "io.opentelemetry.javaagent.slf4j.simpleLogger.defaultLogLevel"; private static HypertraceAgent instance; @@ -64,34 +49,12 @@ public static void agentmain(String agentArgs, Instrumentation inst) { } instance = new HypertraceAgent(); - setDefaultConfig(); OpenTelemetryAgent.premain(agentArgs, inst); System.out.printf( "Hypertrace agent started, version: %s\n", HypertraceAgent.class.getPackage().getImplementationVersion()); } - /** Set default values to OTEL config. OTEL config has a higher precedence. */ - private static void setDefaultConfig() { - AgentConfig agentConfig = HypertraceConfig.get(); - OpenTelemetryConfig.setDefault(OTEL_EXPORTER, "zipkin"); - OpenTelemetryConfig.setDefault( - OTEL_EXPORTER_ZIPKIN_SERVICE_NAME, agentConfig.getServiceName().getValue()); - OpenTelemetryConfig.setDefault( - OTEL_PROPAGATORS, toOtelPropagators(agentConfig.getPropagationFormatsList())); - OpenTelemetryConfig.setDefault( - OTEL_EXPORTER_ZIPKIN_ENDPOINT, agentConfig.getReporting().getEndpoint().getValue()); - OpenTelemetryConfig.setDefault( - OTEL_EXPORTER_ZIPKIN_SERVICE_NAME, agentConfig.getServiceName().getValue()); - } - - @VisibleForTesting - static String toOtelPropagators(List propagationFormats) { - return propagationFormats.stream() - .map(v -> v.name().toLowerCase()) - .collect(Collectors.joining(",")); - } - // Expected format is "arg1=val1,arg2=val2,arg3=val3" private static Map parseAgentArgs(String agentArgs) { if (agentArgs == null) { diff --git a/javaagent/src/main/java/org/hypertrace/agent/instrument/OpenTelemetryConfig.java b/javaagent/src/main/java/org/hypertrace/agent/instrument/OpenTelemetryConfig.java deleted file mode 100644 index 202b7ed53..000000000 --- a/javaagent/src/main/java/org/hypertrace/agent/instrument/OpenTelemetryConfig.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.hypertrace.agent.instrument; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; - -final class OpenTelemetryConfig { - private static final String OTEL_CONF_FILE = "otel.trace.config"; - private static final Properties LOADED_OTEL_CONF_FILE = loadConfigurationFile(); - - private OpenTelemetryConfig() {} - - /** Set default value for a property in OTEL trace config. */ - static void setDefault(String property, String value) { - if (!isConfigured(property)) { - System.setProperty(property, value); - } - } - - private static boolean isConfigured(String propertyName) { - return System.getProperty(propertyName) != null - || System.getenv(toEnvVarName(propertyName)) != null - || LOADED_OTEL_CONF_FILE.containsKey(propertyName); - } - - private static String toEnvVarName(String propertyName) { - return propertyName.toUpperCase().replaceAll("\\.", "_"); - } - - // Taken from - // https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/9523f9ffe624f14a1fba1dbd40e0f7b489b005ae/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigInitializer.java#L51 - private static Properties loadConfigurationFile() { - Properties properties = new Properties(); - - // Reading from system property first and from env after - String configurationFilePath = System.getProperty(OTEL_CONF_FILE); - if (configurationFilePath == null) { - configurationFilePath = System.getenv(toEnvVarName(OTEL_CONF_FILE)); - } - if (configurationFilePath == null) { - return properties; - } - - // Normalizing tilde (~) paths for unix systems - configurationFilePath = - configurationFilePath.replaceFirst("^~", System.getProperty("user.home")); - - File configurationFile = new File(configurationFilePath); - if (!configurationFile.exists()) { - return properties; - } - - try (FileReader fileReader = new FileReader(configurationFile)) { - properties.load(fileReader); - } catch (IOException ignored) { - // OTel agent will log this error anyway - } - - return properties; - } -} diff --git a/otel-extensions/build.gradle.kts b/otel-extensions/build.gradle.kts index b952ba8b8..bb3e60584 100644 --- a/otel-extensions/build.gradle.kts +++ b/otel-extensions/build.gradle.kts @@ -8,6 +8,7 @@ dependencies { api(project(":filter-custom-opa")) compileOnly("io.opentelemetry:opentelemetry-sdk:${versions["opentelemetry"]}") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${versions["opentelemetry"]}-alpha") implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-spi:${versions["opentelemetry_java_agent"]}") implementation("org.slf4j:slf4j-api:1.7.30") diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceAgentConfiguration.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceAgentConfiguration.java new file mode 100644 index 000000000..82c0574c0 --- /dev/null +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceAgentConfiguration.java @@ -0,0 +1,67 @@ +/* + * Copyright The Hypertrace Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.hypertrace.agent.otel.extensions; + +import com.google.auto.service.AutoService; +import com.google.common.annotations.VisibleForTesting; +import io.opentelemetry.javaagent.spi.config.PropertySource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.hypertrace.agent.config.Config.AgentConfig; +import org.hypertrace.agent.config.Config.PropagationFormat; +import org.hypertrace.agent.core.config.HypertraceConfig; + +@AutoService(PropertySource.class) +public class HypertraceAgentConfiguration implements PropertySource { + + // https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/sdk-environment-variables.md + private static final String OTEL_TRACE_EXPORTER = "otel.trace.exporter"; + private static final String OTEL_METRICS_EXPORTER = "otel.metrics.exporter"; + private static final String OTEL_PROPAGATORS = "otel.propagators"; + private static final String OTEL_EXPORTER_ZIPKIN_ENDPOINT = "otel.exporter.zipkin.endpoint"; + private static final String OTEL_EXPORTER_ZIPKIN_SERVICE_NAME = + "otel.exporter.zipkin.service.name"; + private static final String OTEL_PROCESSOR_BATCH_MAX_QUEUE = "otel.bsp.max.queue.size"; + private static final String OTEL_DEFAULT_LOG_LEVEL = + "io.opentelemetry.javaagent.slf4j.simpleLogger.defaultLogLevel"; + + @Override + public Map getProperties() { + AgentConfig agentConfig = HypertraceConfig.get(); + + Map configProperties = new HashMap<>(); + configProperties.put(OTEL_TRACE_EXPORTER, "zipkin"); + configProperties.put( + OTEL_EXPORTER_ZIPKIN_SERVICE_NAME, agentConfig.getServiceName().getValue()); + configProperties.put( + OTEL_EXPORTER_ZIPKIN_ENDPOINT, agentConfig.getReporting().getEndpoint().getValue()); + configProperties.put( + OTEL_PROPAGATORS, toOtelPropagators(agentConfig.getPropagationFormatsList())); + // metrics are not reported + configProperties.put(OTEL_METRICS_EXPORTER, "none"); + return configProperties; + } + + @VisibleForTesting + static String toOtelPropagators(List propagationFormats) { + return propagationFormats.stream() + .map(v -> v.name().toLowerCase()) + .collect(Collectors.joining(",")); + } +} diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceResourceProvider.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceResourceProvider.java index 0dc458282..2ed6e2627 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceResourceProvider.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceResourceProvider.java @@ -21,19 +21,23 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.sdk.resources.ResourceAttributes; import io.opentelemetry.sdk.resources.ResourceProvider; +import org.hypertrace.agent.config.Config.AgentConfig; +import org.hypertrace.agent.core.config.HypertraceConfig; @AutoService(ResourceProvider.class) public class HypertraceResourceProvider extends ResourceProvider { private final CgroupsReader cgroupsReader = new CgroupsReader(); + private final AgentConfig agentConfig = HypertraceConfig.get(); @Override protected Attributes getAttributes() { AttributesBuilder builder = Attributes.builder(); String containerId = this.cgroupsReader.readContainerId(); if (containerId != null && !containerId.isEmpty()) { - builder.put(ResourceAttributes.CONTAINER_ID.getKey(), containerId); + builder.put(ResourceAttributes.CONTAINER_ID, containerId); } + builder.put(ResourceAttributes.SERVICE_NAME, agentConfig.getServiceName().getValue()); return builder.build(); } } diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/processor/HypertraceTracerCustomizer.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/processor/HypertraceTracerCustomizer.java index 67319295d..eabc659fa 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/processor/HypertraceTracerCustomizer.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/processor/HypertraceTracerCustomizer.java @@ -17,8 +17,8 @@ package org.hypertrace.agent.otel.extensions.processor; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.spi.TracerCustomizer; -import io.opentelemetry.sdk.trace.SdkTracerManagement; +import io.opentelemetry.sdk.autoconfigure.spi.SdkTracerProviderConfigurer; +import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; /** * This is a workaround to add container ID tags to spans when Zipkin exporter is used. Zipkin @@ -28,14 +28,11 @@ *

Remove this once we migrate to OTEL exporter * https://github.com/hypertrace/javaagent/issues/132 */ -@AutoService(TracerCustomizer.class) -public class HypertraceTracerCustomizer implements TracerCustomizer { +@AutoService(SdkTracerProviderConfigurer.class) +public class HypertraceTracerCustomizer implements SdkTracerProviderConfigurer { @Override - public void configure(SdkTracerManagement tracerManagement) { - String exporter = System.getProperty("otel.exporter"); - if (exporter != null && exporter.contains("zipkin")) { - tracerManagement.addSpanProcessor(new AddTagsSpanProcessor()); - } + public void configure(SdkTracerProviderBuilder tracerProvider) { + tracerProvider.addSpanProcessor(new AddTagsSpanProcessor()); } } diff --git a/javaagent/src/test/java/org/hypertrace/agent/instrument/HypertraceAgentTest.java b/otel-extensions/src/test/java/org/hypertrace/agent/otel/extensions/HypertraceAgentConfigurationTest.java similarity index 82% rename from javaagent/src/test/java/org/hypertrace/agent/instrument/HypertraceAgentTest.java rename to otel-extensions/src/test/java/org/hypertrace/agent/otel/extensions/HypertraceAgentConfigurationTest.java index addda9d70..80853e88c 100644 --- a/javaagent/src/test/java/org/hypertrace/agent/instrument/HypertraceAgentTest.java +++ b/otel-extensions/src/test/java/org/hypertrace/agent/otel/extensions/HypertraceAgentConfigurationTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.hypertrace.agent.instrument; +package org.hypertrace.agent.otel.extensions; import java.util.Arrays; import java.util.List; @@ -22,12 +22,13 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class HypertraceAgentTest { +public class HypertraceAgentConfigurationTest { @Test public void propagationFormatList() { List formats = Arrays.asList(PropagationFormat.B3, PropagationFormat.TRACECONTEXT); - Assertions.assertEquals("b3,tracecontext", HypertraceAgent.toOtelPropagators(formats)); + Assertions.assertEquals( + "b3,tracecontext", HypertraceAgentConfiguration.toOtelPropagators(formats)); } } diff --git a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/AbstractSmokeTest.java b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/AbstractSmokeTest.java index 60d8a9fc9..470204f00 100644 --- a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/AbstractSmokeTest.java +++ b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/AbstractSmokeTest.java @@ -49,7 +49,7 @@ public abstract class AbstractSmokeTest { private static final Logger log = LoggerFactory.getLogger(OpenTelemetryStorage.class); private static final String OTEL_COLLECTOR_IMAGE = "otel/opentelemetry-collector:latest"; private static final String MOCK_BACKEND_IMAGE = - "open-telemetry-docker-dev.bintray.io/java/smoke-fake-backend:latest"; + "ghcr.io/open-telemetry/java-test-containers:smoke-fake-backend-20201128.1734635"; private static final String NETWORK_ALIAS_OTEL_COLLECTOR = "collector"; private static final String NETWORK_ALIAS_OTEL_MOCK_STORAGE = "storage"; private static final String OTEL_EXPORTER_ENDPOINT = @@ -132,7 +132,7 @@ GenericContainer createAppUnderTest(int jdk) { MountableFile.forClasspathResource("/ht-config.yaml"), "/etc/ht-config.yaml") .withEnv("JAVA_TOOL_OPTIONS", "-javaagent:/javaagent.jar") .withEnv("HT_CONFIG_FILE", "/etc/ht-config.yaml") - .withEnv("OTEL_BSP_MAX_EXPORT_BATCH", "1") + .withEnv("OTEL_BSP_MAX_EXPORT_BATCH_SIZE", "1") .withEnv("OTEL_BSP_SCHEDULE_DELAY", "10") .withEnv("HT_REPORTING_ENDPOINT", OTEL_EXPORTER_ENDPOINT); } diff --git a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java index 4944e1404..d2ec97101 100644 --- a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java +++ b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java @@ -40,7 +40,9 @@ public class SpringBootSmokeTest extends AbstractSmokeTest { @Override protected String getTargetImage(int jdk) { - return "open-telemetry-docker-dev.bintray.io/java/smoke-springboot-jdk" + jdk + ":latest"; + return "ghcr.io/open-telemetry/java-test-containers:smoke-springboot-jdk" + + jdk + + "-20210209.550405798"; } private static GenericContainer app; @@ -62,11 +64,13 @@ static synchronized void afterEach() { } @Test - public void get() throws IOException { + public void get() throws IOException, InterruptedException { String url = String.format("http://localhost:%d/greeting", app.getMappedPort(8080)); Request request = new Request.Builder().url(url).get().build(); - Response response = client.newCall(request).execute(); + try (Response response = client.newCall(request).execute()) { + Assertions.assertEquals(response.body().string(), "Hi!"); + } ArrayList traces = new ArrayList<>(waitForTraces()); Object currentAgentVersion = @@ -93,7 +97,6 @@ public void get() throws IOException { .getValue() .getStringValue()); - Assertions.assertEquals(response.body().string(), "Hi!"); Assertions.assertEquals(1, countSpansByName(traces, "/greeting")); Assertions.assertEquals(1, countSpansByName(traces, "webcontroller.greeting")); Assertions.assertTrue( diff --git a/testing-common/build.gradle.kts b/testing-common/build.gradle.kts index 9ee829f06..8a9d89d51 100644 --- a/testing-common/build.gradle.kts +++ b/testing-common/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { api("io.opentelemetry:opentelemetry-api:${versions["opentelemetry"]}") api("io.opentelemetry:opentelemetry-sdk:${versions["opentelemetry"]}") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${versions["opentelemetry"]}-alpha") api("com.squareup.okhttp3:okhttp:4.9.0") implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-spi:${versions["opentelemetry_java_agent"]}") diff --git a/testing-common/src/main/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java b/testing-common/src/main/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java index 262e86cc7..9731504a7 100644 --- a/testing-common/src/main/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java +++ b/testing-common/src/main/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java @@ -22,8 +22,6 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.javaagent.spi.ComponentInstaller; import io.opentelemetry.javaagent.tooling.AgentInstaller; -import io.opentelemetry.javaagent.tooling.config.ConfigInitializer; -import io.opentelemetry.sdk.OpenTelemetrySdk; import java.io.IOException; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; @@ -57,11 +55,10 @@ public abstract class AbstractInstrumenterTest { */ public static final InMemoryExporter TEST_WRITER = new InMemoryExporter();; - protected static final Tracer TEST_TRACER; + protected static Tracer TEST_TRACER; private static final Instrumentation INSTRUMENTATION; static { - ConfigInitializer.initialize(); // always run with the thread propagation debugger to help track down sporadic test failures System.setProperty("otel.threadPropagationDebugger", "true"); System.setProperty("otel.internal.failOnContextLeak", "true"); @@ -74,8 +71,6 @@ public abstract class AbstractInstrumenterTest { ((Logger) LoggerFactory.getLogger("io.opentelemetry")).setLevel(Level.DEBUG); COMPONENT_INSTALLER = new TestOpenTelemetryInstaller(TEST_WRITER); - OpenTelemetrySdk.getGlobalTracerManagement().addSpanProcessor(TEST_WRITER); - TEST_TRACER = GlobalOpenTelemetry.getTracer("io.opentelemetry.auto"); } private static ClassFileTransformer classFileTransformer; @@ -95,6 +90,9 @@ public static void beforeAll() { AgentInstaller.installBytebuddyAgent( INSTRUMENTATION, Collections.singleton(COMPONENT_INSTALLER)); } + if (TEST_TRACER == null) { + TEST_TRACER = GlobalOpenTelemetry.getTracer("io.opentelemetry.auto"); + } } @BeforeEach diff --git a/testing-common/src/main/java/org/hypertrace/agent/testing/TestOpenTelemetryInstaller.java b/testing-common/src/main/java/org/hypertrace/agent/testing/TestOpenTelemetryInstaller.java index cad52aa97..34d1d5a2e 100644 --- a/testing-common/src/main/java/org/hypertrace/agent/testing/TestOpenTelemetryInstaller.java +++ b/testing-common/src/main/java/org/hypertrace/agent/testing/TestOpenTelemetryInstaller.java @@ -32,10 +32,13 @@ public TestOpenTelemetryInstaller(SpanProcessor spanProcessor) { } @Override - public void afterByteBuddyAgent() { + public void beforeByteBuddyAgent() { OpenTelemetrySdk.builder() .setTracerProvider(SdkTracerProvider.builder().addSpanProcessor(spanProcessor).build()) .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) .buildAndRegisterGlobal(); } + + @Override + public void afterByteBuddyAgent() {} }