Skip to content

Commit 7dde47e

Browse files
committed
fix
1 parent 7a9453b commit 7dde47e

File tree

2 files changed

+57
-14
lines changed
  • instrumentation/spring
    • spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal
    • spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1

2 files changed

+57
-14
lines changed

instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/HeaderUtil.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.instrumentation.spring.web.v3_1;
6+
package io.opentelemetry.instrumentation.spring.webflux.v5_3;
77

88
import static java.util.Collections.emptyList;
99

1010
import java.lang.invoke.MethodHandle;
1111
import java.lang.invoke.MethodHandles;
1212
import java.lang.invoke.MethodType;
1313
import java.util.List;
14-
import java.util.Map;
1514
import javax.annotation.Nullable;
1615
import org.springframework.http.HttpHeaders;
1716

@@ -20,7 +19,14 @@ class HeaderUtil {
2019

2120
static {
2221
// since spring web 7.0
23-
GET_HEADERS = findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class));
22+
MethodHandle methodHandle =
23+
findGetHeadersMethod(MethodType.methodType(List.class, String.class));
24+
if (methodHandle == null) {
25+
// up to spring web 7.0
26+
methodHandle =
27+
findGetHeadersMethod(MethodType.methodType(List.class, Object.class));
28+
}
29+
GET_HEADERS = methodHandle;
2430
}
2531

2632
private static MethodHandle findGetHeadersMethod(MethodType methodType) {
@@ -31,18 +37,15 @@ private static MethodHandle findGetHeadersMethod(MethodType methodType) {
3137
}
3238
}
3339

34-
// before spring web 7.0 HttpHeaders implements Map<String, List<String>>, this triggers
35-
// errorprone BadInstanceof warning since errorpone is not aware that this instanceof check does
36-
// not pass with spring web 7.0+
37-
@SuppressWarnings({"unchecked", "BadInstanceof"})
40+
@SuppressWarnings("unchecked") // casting MethodHandle.invoke result
3841
static List<String> getHeader(HttpHeaders headers, String name) {
39-
if (headers instanceof Map) {
40-
// before spring web 7.0
41-
return ((Map<String, List<String>>) headers).getOrDefault(name, emptyList());
42-
} else if (GET_HEADERS != null) {
43-
// spring web 7.0
42+
if (GET_HEADERS != null) {
4443
try {
45-
return (List<String>) GET_HEADERS.invoke(headers, name, emptyList());
44+
List<String> result = (List<String>) GET_HEADERS.invoke(headers, name);
45+
if (result == null) {
46+
return emptyList();
47+
}
48+
return result;
4649
} catch (Throwable t) {
4750
// ignore
4851
}

instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/WebClientHttpAttributesGetter.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@
55

66
package io.opentelemetry.instrumentation.spring.webflux.v5_3.internal;
77

8+
import static java.util.Collections.emptyList;
9+
810
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter;
11+
import java.lang.invoke.MethodHandle;
12+
import java.lang.invoke.MethodHandles;
13+
import java.lang.invoke.MethodType;
914
import java.util.List;
1015
import javax.annotation.Nullable;
16+
import org.springframework.http.HttpHeaders;
1117
import org.springframework.web.reactive.function.client.ClientRequest;
1218
import org.springframework.web.reactive.function.client.ClientResponse;
1319

@@ -19,6 +25,28 @@ public enum WebClientHttpAttributesGetter
1925
implements HttpClientAttributesGetter<ClientRequest, ClientResponse> {
2026
INSTANCE;
2127

28+
private static final MethodHandle GET_HEADERS;
29+
30+
static {
31+
// since webflux 7.0
32+
MethodHandle methodHandle =
33+
findGetHeadersMethod(MethodType.methodType(List.class, String.class));
34+
if (methodHandle == null) {
35+
// up to webflux 7.0
36+
methodHandle =
37+
findGetHeadersMethod(MethodType.methodType(List.class, Object.class));
38+
}
39+
GET_HEADERS = methodHandle;
40+
}
41+
42+
private static MethodHandle findGetHeadersMethod(MethodType methodType) {
43+
try {
44+
return MethodHandles.lookup().findVirtual(HttpHeaders.class, "get", methodType);
45+
} catch (Throwable t) {
46+
return null;
47+
}
48+
}
49+
2250
@Override
2351
public String getUrlFull(ClientRequest request) {
2452
return request.url().toString();
@@ -30,8 +58,20 @@ public String getHttpRequestMethod(ClientRequest request) {
3058
}
3159

3260
@Override
61+
@SuppressWarnings("unchecked") // casting MethodHandle.invoke result
3362
public List<String> getHttpRequestHeader(ClientRequest request, String name) {
34-
return HeaderUtil.getHeader(request.headers(), name);
63+
if (GET_HEADERS != null) {
64+
try {
65+
List<String> result = (List<String>) GET_HEADERS.invoke(request, name);
66+
if (result == null) {
67+
return emptyList();
68+
}
69+
return result;
70+
} catch (Throwable t) {
71+
// ignore
72+
}
73+
}
74+
return emptyList();
3575
}
3676

3777
@Override

0 commit comments

Comments
 (0)