diff --git a/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebHttpAttributesGetter.java b/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebHttpAttributesGetter.java index 9f5446e510e4..481469051e3c 100644 --- a/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebHttpAttributesGetter.java +++ b/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebHttpAttributesGetter.java @@ -23,7 +23,7 @@ enum SpringWebHttpAttributesGetter @Nullable private static final MethodHandle GET_STATUS_CODE; @Nullable private static final MethodHandle STATUS_CODE_VALUE; - @Nullable private static final MethodHandle GET_HEADERS; + private static final MethodHandle GET_HEADERS; static { MethodHandles.Lookup lookup = MethodHandles.publicLookup(); @@ -58,21 +58,24 @@ enum SpringWebHttpAttributesGetter GET_STATUS_CODE = getStatusCode; STATUS_CODE_VALUE = statusCodeValue; + GET_HEADERS = + isSpring7OrNewer() + ? findGetHeadersMethod(MethodType.methodType(List.class, String.class)) + : findGetHeadersMethod(MethodType.methodType(List.class, Object.class)); + } - // since spring web 7.0 - MethodHandle methodHandle = - findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class)); - if (methodHandle == null) { - // up to spring web 7.0 - methodHandle = - findGetHeadersMethod(MethodType.methodType(Object.class, Object.class, Object.class)); + private static boolean isSpring7OrNewer() { + try { + Class.forName("org.springframework.core.Nullness"); + return true; + } catch (ClassNotFoundException e) { + return false; } - GET_HEADERS = methodHandle; } private static MethodHandle findGetHeadersMethod(MethodType methodType) { try { - return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType); + return MethodHandles.lookup().findVirtual(HttpHeaders.class, "get", methodType); } catch (Throwable t) { return null; } @@ -95,15 +98,16 @@ public List getHttpRequestHeader(HttpRequest httpRequest, String name) { } @SuppressWarnings("unchecked") // casting MethodHandle.invoke result - private static List getHeader(HttpHeaders headers, String name) { - if (GET_HEADERS != null) { - try { - return (List) GET_HEADERS.invoke(headers, name, emptyList()); - } catch (Throwable t) { - // ignore + static List getHeader(HttpHeaders headers, String name) { + try { + List result = (List) GET_HEADERS.invoke(headers, name); + if (result == null) { + return emptyList(); } + return result; + } catch (Throwable t) { + throw new IllegalStateException(t); } - return emptyList(); } @Override diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/HeaderUtil.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/HeaderUtil.java index a1647d4f1526..336d484a5359 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/HeaderUtil.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/HeaderUtil.java @@ -11,42 +11,46 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.List; -import javax.annotation.Nullable; import org.springframework.http.HttpHeaders; class HeaderUtil { - @Nullable private static final MethodHandle GET_HEADERS; + private static final MethodHandle GET_HEADERS; static { - // since spring web 7.0 - MethodHandle methodHandle = - findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class)); - if (methodHandle == null) { - // up to spring web 7.0 - methodHandle = - findGetHeadersMethod(MethodType.methodType(Object.class, Object.class, Object.class)); + GET_HEADERS = + isSpring7OrNewer() + ? findGetHeadersMethod(MethodType.methodType(List.class, String.class)) + : findGetHeadersMethod(MethodType.methodType(List.class, Object.class)); + } + + private static boolean isSpring7OrNewer() { + try { + Class.forName("org.springframework.core.Nullness"); + return true; + } catch (ClassNotFoundException e) { + return false; } - GET_HEADERS = methodHandle; } private static MethodHandle findGetHeadersMethod(MethodType methodType) { try { - return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType); + return MethodHandles.lookup().findVirtual(HttpHeaders.class, "get", methodType); } catch (Throwable t) { - return null; + throw new IllegalStateException(t); } } @SuppressWarnings("unchecked") // casting MethodHandle.invoke result static List getHeader(HttpHeaders headers, String name) { - if (GET_HEADERS != null) { - try { - return (List) GET_HEADERS.invoke(headers, name, emptyList()); - } catch (Throwable t) { - // ignore + try { + List result = (List) GET_HEADERS.invoke(headers, name); + if (result == null) { + return emptyList(); } + return result; + } catch (Throwable t) { + throw new IllegalStateException(t); } - return emptyList(); } private HeaderUtil() {} 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 b8b61bf6e5e4..eb13a258901c 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 @@ -28,22 +28,26 @@ public enum WebClientHttpAttributesGetter 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 = + isSpring7OrNewer() + ? findGetHeadersMethod(MethodType.methodType(List.class, String.class)) + : findGetHeadersMethod(MethodType.methodType(List.class, Object.class)); + } + + private static boolean isSpring7OrNewer() { + try { + Class.forName("org.springframework.core.Nullness"); + return true; + } catch (ClassNotFoundException e) { + return false; } - GET_HEADERS = methodHandle; } private static MethodHandle findGetHeadersMethod(MethodType methodType) { try { - return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType); + return MethodHandles.lookup().findVirtual(HttpHeaders.class, "get", methodType); } catch (Throwable t) { - return null; + throw new IllegalStateException(t); } } @@ -60,14 +64,15 @@ public String getHttpRequestMethod(ClientRequest request) { @Override @SuppressWarnings("unchecked") // casting MethodHandle.invoke result public List getHttpRequestHeader(ClientRequest request, String name) { - if (GET_HEADERS != null) { - try { - return (List) GET_HEADERS.invoke(request.headers(), name, emptyList()); - } catch (Throwable t) { - // ignore + try { + List result = (List) GET_HEADERS.invoke(request.headers(), name); + if (result == null) { + return emptyList(); } + return result; + } catch (Throwable t) { + throw new IllegalStateException(t); } - return emptyList(); } @Override