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-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/HeaderUtil.java similarity index 59% rename from instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/HeaderUtil.java rename to instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/HeaderUtil.java index a1647d4f1526..1c330993cd66 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-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/HeaderUtil.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.spring.webflux.v5_3; +package io.opentelemetry.instrumentation.spring.web.v3_1; import static java.util.Collections.emptyList; @@ -11,6 +11,7 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.List; +import java.util.Map; import javax.annotation.Nullable; import org.springframework.http.HttpHeaders; @@ -19,14 +20,7 @@ class HeaderUtil { 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 = methodHandle; + GET_HEADERS = findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class)); } private static MethodHandle findGetHeadersMethod(MethodType methodType) { @@ -37,9 +31,16 @@ private static MethodHandle findGetHeadersMethod(MethodType methodType) { } } - @SuppressWarnings("unchecked") // casting MethodHandle.invoke result + // before spring web 7.0 HttpHeaders implements Map>, this triggers + // errorprone BadInstanceof warning since errorpone is not aware that this instanceof check does + // not pass with spring web 7.0+ + @SuppressWarnings({"unchecked", "BadInstanceof"}) static List getHeader(HttpHeaders headers, String name) { - if (GET_HEADERS != null) { + if (headers instanceof Map) { + // before spring web 7.0 + return ((Map>) headers).getOrDefault(name, emptyList()); + } else if (GET_HEADERS != null) { + // spring web 7.0 try { return (List) GET_HEADERS.invoke(headers, name, emptyList()); } catch (Throwable t) { 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..8ef59a409fee 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 @@ -5,15 +5,12 @@ package io.opentelemetry.instrumentation.spring.web.v3_1; -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.http.HttpRequest; import org.springframework.http.client.ClientHttpResponse; @@ -23,7 +20,6 @@ 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; static { MethodHandles.Lookup lookup = MethodHandles.publicLookup(); @@ -58,24 +54,6 @@ enum SpringWebHttpAttributesGetter GET_STATUS_CODE = getStatusCode; STATUS_CODE_VALUE = statusCodeValue; - - // 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 = methodHandle; - } - - private static MethodHandle findGetHeadersMethod(MethodType methodType) { - try { - return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType); - } catch (Throwable t) { - return null; - } } @Override @@ -91,19 +69,7 @@ public String getUrlFull(HttpRequest httpRequest) { @Override public List getHttpRequestHeader(HttpRequest httpRequest, String name) { - return getHeader(httpRequest.getHeaders(), 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 - } - } - return emptyList(); + return HeaderUtil.getHeader(httpRequest.getHeaders(), name); } @Override @@ -125,7 +91,7 @@ public Integer getHttpResponseStatusCode( @Override public List getHttpResponseHeader( HttpRequest httpRequest, ClientHttpResponse clientHttpResponse, String name) { - return getHeader(clientHttpResponse.getHeaders(), name); + return HeaderUtil.getHeader(clientHttpResponse.getHeaders(), name); } @Override diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxServerHttpAttributesGetter.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxServerHttpAttributesGetter.java index da12d0eb1b25..acf2909a9fcf 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxServerHttpAttributesGetter.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxServerHttpAttributesGetter.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.spring.webflux.v5_3; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter; +import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.HeaderUtil; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxTextMapGetter.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxTextMapGetter.java index e1f0f88c8155..fe973696de77 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxTextMapGetter.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/WebfluxTextMapGetter.java @@ -8,6 +8,7 @@ import static java.util.Collections.emptyIterator; import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.HeaderUtil; import java.util.Iterator; import javax.annotation.Nullable; import org.springframework.web.server.ServerWebExchange; diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/HeaderUtil.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/HeaderUtil.java new file mode 100644 index 000000000000..59ab9d3a7c21 --- /dev/null +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/HeaderUtil.java @@ -0,0 +1,59 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.webflux.v5_3.internal; + +import static java.util.Collections.emptyList; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.List; +import java.util.Map; +import javax.annotation.Nullable; +import org.springframework.http.HttpHeaders; + +/** + * This class is internal and experimental. Its APIs are unstable and can change at any time. Its + * APIs (or a version of them) may be promoted to the public stable API in the future, but no + * guarantees are made. + */ +public final class HeaderUtil { + @Nullable private static final MethodHandle GET_HEADERS; + + static { + // since spring web 7.0 + GET_HEADERS = findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class)); + } + + private static MethodHandle findGetHeadersMethod(MethodType methodType) { + try { + return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType); + } catch (Throwable t) { + return null; + } + } + + // before spring web 7.0 HttpHeaders implements Map>, this triggers + // errorprone BadInstanceof warning since errorpone is not aware that this instanceof check does + // not pass with spring web 7.0+ + @SuppressWarnings({"unchecked", "BadInstanceof"}) + public static List getHeader(HttpHeaders headers, String name) { + if (headers instanceof Map) { + // before spring web 7.0 + return ((Map>) headers).getOrDefault(name, emptyList()); + } else if (GET_HEADERS != null) { + // spring web 7.0 + try { + return (List) GET_HEADERS.invoke(headers, name, emptyList()); + } catch (Throwable t) { + // ignore + } + } + 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..cb5bfbc8c75c 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 @@ -5,15 +5,9 @@ package io.opentelemetry.instrumentation.spring.webflux.v5_3.internal; -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; @@ -25,28 +19,6 @@ 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(); @@ -58,16 +30,8 @@ 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 - } - } - return emptyList(); + return HeaderUtil.getHeader(request.headers(), name); } @Override