diff --git a/dd-java-agent/instrumentation/spring-webflux/src/main/java8/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientAdvice.java b/dd-java-agent/instrumentation/spring-webflux/src/main/java8/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientAdvice.java index b11096450a..30d2a42582 100644 --- a/dd-java-agent/instrumentation/spring-webflux/src/main/java8/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientAdvice.java +++ b/dd-java-agent/instrumentation/spring-webflux/src/main/java8/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientAdvice.java @@ -11,13 +11,18 @@ public class DefaultWebClientAdvice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Thrown final Throwable throwable, - @Advice.This final ExchangeFunction exchangeFunction, - @Advice.Argument(0) final ClientRequest clientRequest, - @Advice.Return(readOnly = false) Mono mono) { + @Advice.Thrown final Throwable throwable, + @Advice.This final ExchangeFunction exchangeFunction, + @Advice.Argument(0) final ClientRequest clientRequest, + @Advice.Return(readOnly = false) Mono mono) { if (throwable == null - && mono != null - && !clientRequest.headers().keySet().contains("x-datadog-trace-id")) { + && mono != null + // The response of the org.springframework.web.reactive.function.client.ExchangeFunction.exchange method is + // replaced by a decorator that in turn also calls the + // org.springframework.web.reactive.function.client.ExchangeFunction.exchange method. If the original return value + // is already decorated (we detect this if the "x-datadog-trace-id" is added), the result is not decorated again + // to avoid StackOverflowErrors. + && !clientRequest.headers().keySet().contains("x-datadog-trace-id")) { mono = new TracingClientResponseMono(clientRequest, exchangeFunction, GlobalTracer.get()); } }