From 79eda093ed6ca3acd05bb972ebe752b8daace464 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 26 Apr 2024 14:32:44 +0300 Subject: [PATCH 1/6] Allow reading otel context from reactor ContextView --- .../reactor-3.1/javaagent/build.gradle.kts | 26 +++++-- ...tPropagationOperator34Instrumentation.java | 67 +++++++++++++++++++ ...gationOperator34InstrumentationModule.java | 35 ++++++++++ ...pagationOperatorInstrumentation34Test.java | 50 ++++++++++++++ .../reactor-3.1/library/build.gradle.kts | 13 +++- .../v3_1/ContextPropagationOperator.java | 15 +++++ .../reactor/v3_1/HooksTest.java | 2 +- .../reactor/v3_1/ReactorCoreTest.java | 15 +++-- 8 files changed, 209 insertions(+), 14 deletions(-) create mode 100644 instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34Instrumentation.java create mode 100644 instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34InstrumentationModule.java create mode 100644 instrumentation/reactor/reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java diff --git a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts index 6ee953f266f9..0a5902062d9d 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts +++ b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts @@ -19,8 +19,10 @@ tasks.withType().configureEach { } dependencies { + // we compile against 3.4.0, so we could use reactor.util.context.ContextView + // instrumentation is expected it to work with 3.1.0.RELEASE + compileOnly("io.projectreactor:reactor-core:3.4.0") implementation(project(":instrumentation:reactor:reactor-3.1:library")) - library("io.projectreactor:reactor-core:3.1.0.RELEASE") implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent")) @@ -30,14 +32,12 @@ dependencies { testInstrumentation(project(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent")) + testLibrary("io.projectreactor:reactor-core:3.1.0.RELEASE") testLibrary("io.projectreactor:reactor-test:3.1.0.RELEASE") testImplementation(project(":instrumentation-annotations-support-testing")) testImplementation(project(":instrumentation:reactor:reactor-3.1:testing")) testImplementation(project(":instrumentation-annotations")) testImplementation("io.opentelemetry:opentelemetry-extension-annotations") - - latestDepTestLibrary("io.projectreactor:reactor-core:3.4.+") - latestDepTestLibrary("io.projectreactor:reactor-test:3.4.+") } testing { @@ -46,7 +46,23 @@ testing { dependencies { implementation(project(":instrumentation:reactor:reactor-3.1:library")) implementation(project(":instrumentation-annotations")) - implementation("io.projectreactor:reactor-test:3.1.0.RELEASE") + if (findProperty("testLatestDeps") as Boolean) { + implementation("io.projectreactor:reactor-test:+") + } else { + implementation("io.projectreactor:reactor-test:3.1.0.RELEASE") + } + } + } + + val testReactor34 by registering(JvmTestSuite::class) { + dependencies { + implementation(project(":instrumentation:reactor:reactor-3.1:library")) + implementation(project(":instrumentation-annotations")) + if (findProperty("testLatestDeps") as Boolean) { + implementation("io.projectreactor:reactor-test:+") + } else { + implementation("io.projectreactor:reactor-test:3.4.0") + } } } } diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34Instrumentation.java b/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34Instrumentation.java new file mode 100644 index 000000000000..16b5e0b9c60b --- /dev/null +++ b/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34Instrumentation.java @@ -0,0 +1,67 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.reactor.v3_1.operator; + +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.isStatic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import application.io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.reactor.v3_1.ContextPropagationOperator; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class ContextPropagationOperator34Instrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named( + "application.io.opentelemetry.instrumentation.reactor.v3_1.ContextPropagationOperator"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod() + .and(isPublic()) + .and(isStatic()) + .and(named("getOpenTelemetryContextFromContextView")) + .and(takesArgument(0, named("reactor.util.context.ContextView"))) + .and(takesArgument(1, named("application.io.opentelemetry.context.Context"))) + .and(returns(named("application.io.opentelemetry.context.Context"))), + ContextPropagationOperator34Instrumentation.class.getName() + "$GetContextViewAdvice"); + } + + @SuppressWarnings("unused") + public static class GetContextViewAdvice { + @Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class) + public static boolean methodEnter() { + return false; + } + + @Advice.OnMethodExit(suppress = Throwable.class) + public static void methodExit( + @Advice.Argument(0) reactor.util.context.ContextView reactorContext, + @Advice.Argument(1) Context defaultContext, + @Advice.Return(readOnly = false) Context applicationContext) { + new Exception().printStackTrace(); + + io.opentelemetry.context.Context agentContext = + ContextPropagationOperator.getOpenTelemetryContextFromContextView(reactorContext, null); + if (agentContext == null) { + applicationContext = defaultContext; + } else { + applicationContext = AgentContextStorage.toApplicationContext(agentContext); + } + } + } +} diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34InstrumentationModule.java b/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34InstrumentationModule.java new file mode 100644 index 000000000000..05758ad5bd04 --- /dev/null +++ b/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34InstrumentationModule.java @@ -0,0 +1,35 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.reactor.v3_1.operator; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static java.util.Collections.singletonList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +/** Instrumentation that is applied only when reactor version is at least 3.4.0. */ +@AutoService(InstrumentationModule.class) +public class ContextPropagationOperator34InstrumentationModule extends InstrumentationModule { + + public ContextPropagationOperator34InstrumentationModule() { + super("reactor", "reactor-3.1", "reactor-context-propagation-operator"); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return hasClassesNamed( + "application.io.opentelemetry.context.Context", "reactor.util.context.ContextView"); + } + + @Override + public List typeInstrumentations() { + return singletonList(new ContextPropagationOperator34Instrumentation()); + } +} diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java b/instrumentation/reactor/reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java new file mode 100644 index 000000000000..a05519242b3f --- /dev/null +++ b/instrumentation/reactor/reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java @@ -0,0 +1,50 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.reactor.v3_1; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.reactor.v3_1.ContextPropagationOperator; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class ContextPropagationOperatorInstrumentation34Test { + + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Test + void storeAndGetContext() { + reactor.util.context.Context reactorContext = reactor.util.context.Context.empty(); + testing.runWithSpan( + "parent", + () -> { + reactor.util.context.Context newReactorContext = + ContextPropagationOperator.storeOpenTelemetryContext( + reactorContext, Context.current()); + Context otelContext = + ContextPropagationOperator.getOpenTelemetryContextFromContextView( + newReactorContext, null); + assertThat(otelContext).isNotNull(); + Span.fromContext(otelContext).setAttribute("foo", "bar"); + }); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("parent") + .hasKind(SpanKind.INTERNAL) + .hasNoParent() + .hasAttributes(attributeEntry("foo", "bar")))); + } +} diff --git a/instrumentation/reactor/reactor-3.1/library/build.gradle.kts b/instrumentation/reactor/reactor-3.1/library/build.gradle.kts index 5ec7deacdfa5..8b2da177a1c2 100644 --- a/instrumentation/reactor/reactor-3.1/library/build.gradle.kts +++ b/instrumentation/reactor/reactor-3.1/library/build.gradle.kts @@ -3,12 +3,19 @@ plugins { } dependencies { - library("io.projectreactor:reactor-core:3.1.0.RELEASE") + // we compile against 3.4.0, so we could use reactor.util.context.ContextView + // instrumentation is expected it to work with 3.1.0.RELEASE + compileOnly("io.projectreactor:reactor-core:3.4.0") + compileOnly(project(":muzzle")) // For @NoMuzzle implementation(project(":instrumentation-annotations-support")) + testLibrary("io.projectreactor:reactor-core:3.1.0.RELEASE") testLibrary("io.projectreactor:reactor-test:3.1.0.RELEASE") testImplementation(project(":instrumentation:reactor:reactor-3.1:testing")) +} - latestDepTestLibrary("io.projectreactor:reactor-core:3.4.+") - latestDepTestLibrary("io.projectreactor:reactor-test:3.4.+") +tasks { + withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) + } } diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java index 41e50f4f4ebd..3d554240c21b 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java @@ -27,6 +27,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.util.function.BiFunction; @@ -134,6 +135,20 @@ public static Context getOpenTelemetryContext( return context.getOrDefault(TRACE_CONTEXT_KEY, defaultTraceContext); } + /** + * Gets Trace {@link Context} from Reactor {@link reactor.util.context.ContextView}. + * + * @param contextView Reactor's context to get trace context from. + * @param defaultTraceContext Default value to be returned if no trace context is found on Reactor + * context. + * @return Trace context or default value. + */ + @NoMuzzle + public static Context getOpenTelemetryContextFromContextView( + reactor.util.context.ContextView contextView, Context defaultTraceContext) { + return contextView.getOrDefault(TRACE_CONTEXT_KEY, defaultTraceContext); + } + ContextPropagationOperator(boolean captureExperimentalSpanAttributes) { this.asyncOperationEndStrategy = ReactorAsyncOperationEndStrategy.builder() diff --git a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/HooksTest.java b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/HooksTest.java index 43256891396d..31aab80800fc 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/HooksTest.java +++ b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/HooksTest.java @@ -62,7 +62,7 @@ void testInvalidBlockUsage() throws InterruptedException { Disposable disposable = Mono.defer( () -> - Mono.fromCallable(callable).publishOn(Schedulers.elastic()).flatMap(Mono::just)) + Mono.fromCallable(callable).publishOn(Schedulers.single()).flatMap(Mono::just)) .subscribeOn(Schedulers.single()) .subscribe(); diff --git a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java index 1e419b0b962e..1d8b1d485684 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java +++ b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java @@ -160,13 +160,16 @@ void fluxInNonBlockingPublisherAssembly() { @Test void nestedNonBlocking() { + boolean testLatestDeps = Boolean.getBoolean("testLatestDeps"); int result = testing.runWithSpan( "parent", () -> Mono.defer( () -> { - Span.current().setAttribute("middle", "foo"); + if (!testLatestDeps) { + Span.current().setAttribute("middle", "foo"); + } return Mono.fromCallable( () -> { Span.current().setAttribute("inner", "bar"); @@ -183,10 +186,12 @@ void nestedNonBlocking() { trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasNoParent(), - span -> - span.hasName("middle") - .hasParent(trace.getSpan(0)) - .hasAttributes(attributeEntry("middle", "foo")), + span -> { + span.hasName("middle").hasParent(trace.getSpan(0)); + if (!testLatestDeps) { + span.hasAttributes(attributeEntry("middle", "foo")); + } + }, span -> span.hasName("inner") .hasParent(trace.getSpan(1)) From 8755830036cd485698b45d768d72ac122e4adaaf Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 26 Apr 2024 15:17:36 +0300 Subject: [PATCH 2/6] move instrumentation to separate module --- .../reactor-3.1/javaagent/build.gradle.kts | 12 ------- .../reactor-3.4/javaagent/build.gradle.kts | 34 +++++++++++++++++++ ...tPropagationOperator34Instrumentation.java | 3 +- ...gationOperator34InstrumentationModule.java | 5 ++- ...agationOperator34InstrumentationTest.java} | 8 +++-- settings.gradle.kts | 1 + 6 files changed, 44 insertions(+), 19 deletions(-) create mode 100644 instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts rename instrumentation/reactor/{reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1 => reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4}/operator/ContextPropagationOperator34Instrumentation.java (96%) rename instrumentation/reactor/{reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1 => reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4}/operator/ContextPropagationOperator34InstrumentationModule.java (83%) rename instrumentation/reactor/{reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java => reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java} (83%) diff --git a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts index 0a5902062d9d..b3ad61173c2d 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts +++ b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts @@ -53,18 +53,6 @@ testing { } } } - - val testReactor34 by registering(JvmTestSuite::class) { - dependencies { - implementation(project(":instrumentation:reactor:reactor-3.1:library")) - implementation(project(":instrumentation-annotations")) - if (findProperty("testLatestDeps") as Boolean) { - implementation("io.projectreactor:reactor-test:+") - } else { - implementation("io.projectreactor:reactor-test:3.4.0") - } - } - } } } diff --git a/instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts new file mode 100644 index 000000000000..52fc7efbbf5b --- /dev/null +++ b/instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("io.projectreactor") + module.set("reactor-core") + versions.set("[3.4.0.RELEASE,)") + extraDependency("io.opentelemetry:opentelemetry-api:1.0.0") + assertInverse.set(true) + excludeInstrumentationName("opentelemetry-api") + } +} + +dependencies { + library("io.projectreactor:reactor-core:3.4.0") + implementation(project(":instrumentation:reactor:reactor-3.1:library")) + + implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent")) + + compileOnly(project(":javaagent-tooling")) + compileOnly(project(":instrumentation-annotations-support")) + compileOnly(project(":opentelemetry-api-shaded-for-instrumenting", configuration = "shadow")) + + testInstrumentation(project(":instrumentation:reactor:reactor-3.1:javaagent")) + testInstrumentation(project(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent")) + + testLibrary("io.projectreactor:reactor-test:3.1.0.RELEASE") + testImplementation(project(":instrumentation-annotations-support-testing")) + testImplementation(project(":instrumentation:reactor:reactor-3.1:testing")) + testImplementation(project(":instrumentation-annotations")) + testImplementation("io.opentelemetry:opentelemetry-extension-annotations") +} diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34Instrumentation.java b/instrumentation/reactor/reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/operator/ContextPropagationOperator34Instrumentation.java similarity index 96% rename from instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34Instrumentation.java rename to instrumentation/reactor/reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/operator/ContextPropagationOperator34Instrumentation.java index 16b5e0b9c60b..4c4ab8e8bb7c 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34Instrumentation.java +++ b/instrumentation/reactor/reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/operator/ContextPropagationOperator34Instrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.reactor.v3_1.operator; +package io.opentelemetry.javaagent.instrumentation.reactor.v3_4.operator; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; @@ -53,7 +53,6 @@ public static void methodExit( @Advice.Argument(0) reactor.util.context.ContextView reactorContext, @Advice.Argument(1) Context defaultContext, @Advice.Return(readOnly = false) Context applicationContext) { - new Exception().printStackTrace(); io.opentelemetry.context.Context agentContext = ContextPropagationOperator.getOpenTelemetryContextFromContextView(reactorContext, null); diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34InstrumentationModule.java b/instrumentation/reactor/reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/operator/ContextPropagationOperator34InstrumentationModule.java similarity index 83% rename from instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34InstrumentationModule.java rename to instrumentation/reactor/reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/operator/ContextPropagationOperator34InstrumentationModule.java index 05758ad5bd04..cb9d6addf50b 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/operator/ContextPropagationOperator34InstrumentationModule.java +++ b/instrumentation/reactor/reactor-3.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/operator/ContextPropagationOperator34InstrumentationModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.reactor.v3_1.operator; +package io.opentelemetry.javaagent.instrumentation.reactor.v3_4.operator; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Collections.singletonList; @@ -14,12 +14,11 @@ import java.util.List; import net.bytebuddy.matcher.ElementMatcher; -/** Instrumentation that is applied only when reactor version is at least 3.4.0. */ @AutoService(InstrumentationModule.class) public class ContextPropagationOperator34InstrumentationModule extends InstrumentationModule { public ContextPropagationOperator34InstrumentationModule() { - super("reactor", "reactor-3.1", "reactor-context-propagation-operator"); + super("reactor", "reactor-3.4", "reactor-context-propagation-operator"); } @Override diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java b/instrumentation/reactor/reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java similarity index 83% rename from instrumentation/reactor/reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java rename to instrumentation/reactor/reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java index a05519242b3f..ceadc71e24a9 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/src/testReactor34/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/ContextPropagationOperatorInstrumentation34Test.java +++ b/instrumentation/reactor/reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.reactor.v3_1; +package io.opentelemetry.javaagent.instrumentation.reactor.v3_4; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; import static org.assertj.core.api.Assertions.assertThat; @@ -17,7 +17,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class ContextPropagationOperatorInstrumentation34Test { +class ContextPropagationOperator34InstrumentationTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); @@ -36,6 +36,10 @@ void storeAndGetContext() { newReactorContext, null); assertThat(otelContext).isNotNull(); Span.fromContext(otelContext).setAttribute("foo", "bar"); + Context otelContext2 = + ContextPropagationOperator.getOpenTelemetryContext(newReactorContext, null); + assertThat(otelContext2).isNotNull(); + Span.fromContext(otelContext2).setAttribute("foo", "bar"); }); testing.waitAndAssertTraces( diff --git a/settings.gradle.kts b/settings.gradle.kts index a192796f5c3f..26da77e94c29 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -459,6 +459,7 @@ include(":instrumentation:ratpack:ratpack-1.7:library") include(":instrumentation:reactor:reactor-3.1:javaagent") include(":instrumentation:reactor:reactor-3.1:library") include(":instrumentation:reactor:reactor-3.1:testing") +include(":instrumentation:reactor:reactor-3.4:javaagent") include(":instrumentation:reactor:reactor-kafka-1.0:javaagent") include(":instrumentation:reactor:reactor-kafka-1.0:testing") include(":instrumentation:reactor:reactor-netty:reactor-netty-0.9:javaagent") From 9b8b9cd83b7485e453ad1c315f74a2894ade2740 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 26 Apr 2024 16:26:14 +0300 Subject: [PATCH 3/6] fix build failure --- .../reactor/reactor-3.1/javaagent/build.gradle.kts | 1 + .../instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java | 4 ++-- .../reactor/reactor-3.4/javaagent/build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts index b3ad61173c2d..62f3d57a5fa3 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts +++ b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts @@ -14,6 +14,7 @@ muzzle { } tasks.withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) // TODO run tests both with and without experimental span attributes jvmArgs("-Dotel.instrumentation.reactor.experimental-span-attributes=true") } diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java b/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java index b090a74bea28..50b800417e8d 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java +++ b/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java @@ -88,7 +88,7 @@ void nested() { span -> span.hasName("inner-manual") .hasKind(SpanKind.INTERNAL) - .hasParent(trace.getSpan(1)) + .hasParent(trace.getSpan(Boolean.getBoolean("testLatestDeps") ? 0 : 1)) .hasAttributes(Attributes.empty()))); } @@ -130,7 +130,7 @@ void nestedFromCurrent() { span -> span.hasName("inner-manual") .hasKind(SpanKind.INTERNAL) - .hasParent(trace.getSpan(1)) + .hasParent(trace.getSpan(Boolean.getBoolean("testLatestDeps") ? 0 : 1)) .hasAttributes(Attributes.empty()))); } diff --git a/instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts index 52fc7efbbf5b..adc48103a8c9 100644 --- a/instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts +++ b/instrumentation/reactor/reactor-3.4/javaagent/build.gradle.kts @@ -6,7 +6,7 @@ muzzle { pass { group.set("io.projectreactor") module.set("reactor-core") - versions.set("[3.4.0.RELEASE,)") + versions.set("[3.4.0,)") extraDependency("io.opentelemetry:opentelemetry-api:1.0.0") assertInverse.set(true) excludeInstrumentationName("opentelemetry-api") From 5202771ec73fbe0b613f5e8171e3638281fa36b4 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 30 Apr 2024 10:12:40 +0300 Subject: [PATCH 4/6] improve test --- .../ContextPropagationOperator34InstrumentationTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instrumentation/reactor/reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java b/instrumentation/reactor/reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java index ceadc71e24a9..04c59624f9ac 100644 --- a/instrumentation/reactor/reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java +++ b/instrumentation/reactor/reactor-3.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_4/ContextPropagationOperator34InstrumentationTest.java @@ -39,7 +39,7 @@ void storeAndGetContext() { Context otelContext2 = ContextPropagationOperator.getOpenTelemetryContext(newReactorContext, null); assertThat(otelContext2).isNotNull(); - Span.fromContext(otelContext2).setAttribute("foo", "bar"); + Span.fromContext(otelContext2).setAttribute("foo2", "bar2"); }); testing.waitAndAssertTraces( @@ -49,6 +49,7 @@ void storeAndGetContext() { span.hasName("parent") .hasKind(SpanKind.INTERNAL) .hasNoParent() - .hasAttributes(attributeEntry("foo", "bar")))); + .hasAttributes( + attributeEntry("foo", "bar"), attributeEntry("foo2", "bar2")))); } } From 2d53bd150f383dc5c81b5b60d338fb88de22d4e6 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 1 May 2024 13:34:44 +0300 Subject: [PATCH 5/6] Update instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts Co-authored-by: Trask Stalnaker --- instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts index 62f3d57a5fa3..43ac9c7926c7 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts +++ b/instrumentation/reactor/reactor-3.1/javaagent/build.gradle.kts @@ -21,7 +21,7 @@ tasks.withType().configureEach { dependencies { // we compile against 3.4.0, so we could use reactor.util.context.ContextView - // instrumentation is expected it to work with 3.1.0.RELEASE + // instrumentation is tested against 3.1.0.RELEASE compileOnly("io.projectreactor:reactor-core:3.4.0") implementation(project(":instrumentation:reactor:reactor-3.1:library")) From 87458065117a87fa079c3deb39be32aafc9fdccb Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 1 May 2024 13:45:10 +0300 Subject: [PATCH 6/6] add comment --- .../instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java | 1 + .../instrumentation/reactor/v3_1/ReactorCoreTest.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java b/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java index 50b800417e8d..2e0b3b2f7ecf 100644 --- a/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java +++ b/instrumentation/reactor/reactor-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactor/v3_1/BaseMonoWithSpanTest.java @@ -88,6 +88,7 @@ void nested() { span -> span.hasName("inner-manual") .hasKind(SpanKind.INTERNAL) + // earliest tested and latest version behave differently .hasParent(trace.getSpan(Boolean.getBoolean("testLatestDeps") ? 0 : 1)) .hasAttributes(Attributes.empty()))); } diff --git a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java index 1d8b1d485684..cbc696656ab3 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java +++ b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorCoreTest.java @@ -167,6 +167,8 @@ void nestedNonBlocking() { () -> Mono.defer( () -> { + // earliest tested and latest version behave differently + // in latest dep test current span is "parent" not "middle" if (!testLatestDeps) { Span.current().setAttribute("middle", "foo"); }