From cdc63bd13060d909ad05f844ad0f23736680ba59 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Mon, 28 Apr 2025 16:20:16 +0200 Subject: [PATCH] Do not inspect reactor context when not needed --- .../reactor/core/ContextSpanHelper.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/ContextSpanHelper.java b/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/ContextSpanHelper.java index ed184afd022..4f7e075f49f 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/ContextSpanHelper.java +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/ContextSpanHelper.java @@ -4,16 +4,37 @@ import datadog.trace.bootstrap.instrumentation.api.WithAgentSpan; import javax.annotation.Nullable; import reactor.core.CoreSubscriber; +import reactor.core.publisher.Mono; import reactor.util.context.Context; public class ContextSpanHelper { + + private static final Class MONO_WITH_CONTEXT_CLASS = findMonoWithContextClass(); + private static final String DD_SPAN_KEY = "dd.span"; + private static Class findMonoWithContextClass() { + final ClassLoader classLoader = Mono.class.getClassLoader(); + // 3.4+ + try { + return Class.forName( + "reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber", false, classLoader); + } catch (Throwable ignored) { + } + // < 3.4 + try { + return Class.forName( + "reactor.core.publisher.FluxContextStart$ContextStartSubscriber", false, classLoader); + } catch (Throwable ignored) { + } + return null; + } + private ContextSpanHelper() {} @Nullable public static AgentSpan extractSpanFromSubscriberContext(final CoreSubscriber subscriber) { - if (subscriber == null) { + if (MONO_WITH_CONTEXT_CLASS == null || !MONO_WITH_CONTEXT_CLASS.isInstance(subscriber)) { return null; } Context context = null;