diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/ExecutionBoundPublisherInstrumentation.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/ExecutionBoundPublisherInstrumentation.java new file mode 100644 index 000000000000..0d30ac5c972d --- /dev/null +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/ExecutionBoundPublisherInstrumentation.java @@ -0,0 +1,45 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.ratpack; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.reactivestreams.Subscriber; + +public class ExecutionBoundPublisherInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return namedOneOf( + "ratpack.exec.internal.ExecutionBoundPublisher", + "ratpack.exec.internal.DefaultExecution$ExecutionBoundPublisher"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + named("subscribe").and(takesArgument(0, named("org.reactivestreams.Subscriber"))), + this.getClass().getName() + "$SubscribeAdvice"); + } + + @SuppressWarnings("unused") + public static class SubscribeAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void wrap( + @Advice.Argument(value = 0, readOnly = false) Subscriber subscriber) { + subscriber = new TracingSubscriber<>(subscriber, Java8BytecodeBridge.currentContext()); + } + } +} diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackInstrumentationModule.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackInstrumentationModule.java index 1ba8efc192bc..e51c5c4a75c8 100644 --- a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackInstrumentationModule.java +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackInstrumentationModule.java @@ -33,6 +33,7 @@ public List typeInstrumentations() { new ContinuationStreamInstrumentation(), new DefaultExecutionInstrumentation(), new DefaultExecStarterInstrumentation(), + new ExecutionBoundPublisherInstrumentation(), new ServerErrorHandlerInstrumentation(), new ServerRegistryInstrumentation()); } diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingSubscriber.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingSubscriber.java new file mode 100644 index 000000000000..ef9474959e61 --- /dev/null +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingSubscriber.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.ratpack; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +public final class TracingSubscriber implements Subscriber { + private final Subscriber delegate; + private final Context context; + + public TracingSubscriber(Subscriber delegate, Context context) { + this.delegate = delegate; + this.context = context; + } + + @Override + public void onSubscribe(Subscription subscription) { + try (Scope ignore = context.makeCurrent()) { + delegate.onSubscribe(subscription); + } + } + + @Override + public void onNext(T t) { + try (Scope ignore = context.makeCurrent()) { + delegate.onNext(t); + } + } + + @Override + public void onError(Throwable throwable) { + try (Scope ignore = context.makeCurrent()) { + delegate.onError(throwable); + } + } + + @Override + public void onComplete() { + try (Scope ignore = context.makeCurrent()) { + delegate.onComplete(); + } + } +} diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy index 40ae557a9400..87dc2848b1ff 100644 --- a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy @@ -24,10 +24,4 @@ class RatpackForkedHttpServerTest extends AbstractRatpackForkedHttpServerTest im boolean testHttpPipelining() { false } - - @Override - boolean testPostStream() { - // controller span is parent of onNext span which is not expected - Boolean.getBoolean("testLatestDeps") - } } diff --git a/instrumentation/ratpack/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy b/instrumentation/ratpack/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy index 3b81fe793697..d147b637cca2 100644 --- a/instrumentation/ratpack/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy +++ b/instrumentation/ratpack/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy @@ -235,6 +235,9 @@ abstract class AbstractRatpackHttpServerTest extends HttpServerTest