Skip to content

Commit 83d1cad

Browse files
authored
Fix muzzle failure with webflux 7 (#15287)
1 parent 1f8fee5 commit 83d1cad

File tree

1 file changed

+35
-1
lines changed
  • instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal

1 file changed

+35
-1
lines changed

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@
88
import static java.util.Collections.emptyList;
99

1010
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;
1114
import java.util.List;
1215
import javax.annotation.Nullable;
16+
import org.springframework.http.HttpHeaders;
1317
import org.springframework.web.reactive.function.client.ClientRequest;
1418
import org.springframework.web.reactive.function.client.ClientResponse;
1519

@@ -21,6 +25,28 @@ public enum WebClientHttpAttributesGetter
2125
implements HttpClientAttributesGetter<ClientRequest, ClientResponse> {
2226
INSTANCE;
2327

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, List.class));
34+
if (methodHandle == null) {
35+
// up to webflux 7.0
36+
methodHandle =
37+
findGetHeadersMethod(MethodType.methodType(Object.class, Object.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, "getOrDefault", methodType);
45+
} catch (Throwable t) {
46+
return null;
47+
}
48+
}
49+
2450
@Override
2551
public String getUrlFull(ClientRequest request) {
2652
return request.url().toString();
@@ -32,8 +58,16 @@ public String getHttpRequestMethod(ClientRequest request) {
3258
}
3359

3460
@Override
61+
@SuppressWarnings("unchecked") // casting MethodHandle.invoke result
3562
public List<String> getHttpRequestHeader(ClientRequest request, String name) {
36-
return request.headers().getOrDefault(name, emptyList());
63+
if (GET_HEADERS != null) {
64+
try {
65+
return (List<String>) GET_HEADERS.invoke(request.headers(), name, emptyList());
66+
} catch (Throwable t) {
67+
// ignore
68+
}
69+
}
70+
return emptyList();
3771
}
3872

3973
@Override

0 commit comments

Comments
 (0)