From 0043efa164d8beb7455892f81f366bb50ffe64d0 Mon Sep 17 00:00:00 2001 From: Johan Vandeweerd Date: Fri, 7 Jun 2019 12:45:20 +0200 Subject: [PATCH] Add documentation on conditions when DefaultWebClientAdvice is not applied --- .../client/DefaultWebClientAdvice.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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()); } }