diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/WebClientHttpAttributesGetter.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/WebClientHttpAttributesGetter.java index 80c75f68a61d..b8b61bf6e5e4 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/WebClientHttpAttributesGetter.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/WebClientHttpAttributesGetter.java @@ -8,8 +8,12 @@ import static java.util.Collections.emptyList; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.util.List; import javax.annotation.Nullable; +import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; @@ -21,6 +25,28 @@ public enum WebClientHttpAttributesGetter implements HttpClientAttributesGetter { INSTANCE; + private static final MethodHandle GET_HEADERS; + + static { + // since webflux 7.0 + MethodHandle methodHandle = + findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class)); + if (methodHandle == null) { + // up to webflux 7.0 + methodHandle = + findGetHeadersMethod(MethodType.methodType(Object.class, Object.class, Object.class)); + } + GET_HEADERS = methodHandle; + } + + private static MethodHandle findGetHeadersMethod(MethodType methodType) { + try { + return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType); + } catch (Throwable t) { + return null; + } + } + @Override public String getUrlFull(ClientRequest request) { return request.url().toString(); @@ -32,8 +58,16 @@ public String getHttpRequestMethod(ClientRequest request) { } @Override + @SuppressWarnings("unchecked") // casting MethodHandle.invoke result public List getHttpRequestHeader(ClientRequest request, String name) { - return request.headers().getOrDefault(name, emptyList()); + if (GET_HEADERS != null) { + try { + return (List) GET_HEADERS.invoke(request.headers(), name, emptyList()); + } catch (Throwable t) { + // ignore + } + } + return emptyList(); } @Override