Skip to content

Commit 9aad1e6

Browse files
authored
fix graal native image - improvement (open-telemetry#15306)
1 parent 6e79031 commit 9aad1e6

File tree

11 files changed

+74
-36
lines changed

11 files changed

+74
-36
lines changed

instrumentation/spring/spring-web/spring-web-3.1/library/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
plugins {
22
id("otel.library-instrumentation")
3+
id("otel.nullaway-conventions")
34
}
45

56
dependencies {

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

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,46 @@
1111
import java.lang.invoke.MethodHandles;
1212
import java.lang.invoke.MethodType;
1313
import java.util.List;
14-
import java.util.Map;
14+
import java.util.function.Supplier;
1515
import javax.annotation.Nullable;
1616
import org.springframework.http.HttpHeaders;
1717

1818
class HeaderUtil {
1919
@Nullable private static final MethodHandle GET_HEADERS;
2020

2121
static {
22-
// since spring web 7.0
23-
GET_HEADERS = findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class));
22+
GET_HEADERS =
23+
firstAvailableHandle(
24+
findGetHeadersMethod(
25+
MethodType.methodType(List.class, String.class)), // since spring web 7.0
26+
() ->
27+
findGetHeadersMethod(
28+
MethodType.methodType(List.class, Object.class))); // before spring web 7.0
2429
}
2530

31+
@Nullable
32+
private static MethodHandle firstAvailableHandle(
33+
@Nullable MethodHandle first, Supplier<? extends MethodHandle> supplier) {
34+
return first != null ? first : supplier.get();
35+
}
36+
37+
@Nullable
2638
private static MethodHandle findGetHeadersMethod(MethodType methodType) {
2739
try {
28-
return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType);
40+
return MethodHandles.lookup().findVirtual(HttpHeaders.class, "get", methodType);
2941
} catch (Throwable t) {
3042
return null;
3143
}
3244
}
3345

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"})
46+
@SuppressWarnings("unchecked") // casting GET_HEADERS.invoke result
3847
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
48+
if (GET_HEADERS != null) {
4449
try {
45-
return (List<String>) GET_HEADERS.invoke(headers, name, emptyList());
50+
List<String> result = (List<String>) GET_HEADERS.invoke(headers, name);
51+
if (result != null) {
52+
return result;
53+
}
4654
} catch (Throwable t) {
4755
// ignore
4856
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
66
package io.opentelemetry.instrumentation.spring.web.v3_1;
77

88
import io.opentelemetry.context.propagation.TextMapSetter;
9+
import javax.annotation.Nullable;
910
import org.springframework.http.HttpRequest;
1011

1112
enum HttpRequestSetter implements TextMapSetter<HttpRequest> {
1213
INSTANCE;
1314

1415
@Override
15-
public void set(HttpRequest httpRequest, String key, String value) {
16+
public void set(@Nullable HttpRequest httpRequest, String key, String value) {
17+
if (httpRequest == null) {
18+
return;
19+
}
1620
httpRequest.getHeaders().set(key, value);
1721
}
1822
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public List<String> getHttpRequestHeader(HttpRequest httpRequest, String name) {
7373
}
7474

7575
@Override
76+
@Nullable
7677
public Integer getHttpResponseStatusCode(
7778
HttpRequest httpRequest, ClientHttpResponse clientHttpResponse, @Nullable Throwable error) {
7879

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.instrumentation.spring.web.v3_1.internal;
77

88
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
9+
import io.opentelemetry.instrumentation.api.internal.Initializer;
910
import io.opentelemetry.instrumentation.spring.web.v3_1.SpringWebTelemetryBuilder;
1011
import java.util.function.Function;
1112
import org.springframework.http.HttpRequest;
@@ -31,6 +32,7 @@ private WebTelemetryUtil() {}
3132
return builderExtractor;
3233
}
3334

35+
@Initializer
3436
public static void setBuilderExtractor(
3537
Function<
3638
SpringWebTelemetryBuilder,

instrumentation/spring/spring-webflux/spring-webflux-5.3/library/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
plugins {
22
id("otel.library-instrumentation")
3+
id("otel.nullaway-conventions")
34
}
45

56
dependencies {

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1111
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
1212
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource;
13+
import javax.annotation.Nullable;
1314
import org.reactivestreams.Subscription;
1415
import org.springframework.core.Ordered;
1516
import org.springframework.http.server.reactive.ServerHttpResponse;
@@ -115,7 +116,7 @@ public void onComplete() {
115116
actual.onComplete();
116117
}
117118

118-
private void onTerminal(Context currentContext, Throwable t) {
119+
private void onTerminal(Context currentContext, @Nullable Throwable t) {
119120
ServerHttpResponse response = exchange.getResponse();
120121
if (response.isCommitted()) {
121122
end(currentContext, t);
@@ -128,13 +129,16 @@ private void onTerminal(Context currentContext, Throwable t) {
128129
}
129130
}
130131

131-
private void end(Context currentContext, Throwable t) {
132+
private void end(Context currentContext, @Nullable Throwable t) {
132133
// Update HTTP route now, because during instrumenter.start()
133134
// the HTTP route isn't available from the exchange attributes, but is afterwards
134135
HttpServerRoute.update(
135136
currentContext,
136137
HttpServerRouteSource.CONTROLLER,
137-
(context, exchange) -> WebfluxServerHttpAttributesGetter.INSTANCE.getHttpRoute(exchange),
138+
(context, exchange) ->
139+
exchange == null
140+
? null
141+
: WebfluxServerHttpAttributesGetter.INSTANCE.getHttpRoute(exchange),
138142
exchange);
139143
instrumenter.end(currentContext, exchange, exchange, t);
140144
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ enum WebfluxServerHttpAttributesGetter
2222
implements HttpServerAttributesGetter<ServerWebExchange, ServerWebExchange> {
2323
INSTANCE;
2424

25-
private static final MethodHandle GET_RAW_STATUS_CODE;
26-
private static final MethodHandle GET_STATUS_CODE;
27-
private static final MethodHandle STATUS_CODE_VALUE;
25+
@Nullable private static final MethodHandle GET_RAW_STATUS_CODE;
26+
@Nullable private static final MethodHandle GET_STATUS_CODE;
27+
@Nullable private static final MethodHandle STATUS_CODE_VALUE;
2828

2929
static {
3030
MethodHandle getRawStatusCode = null;
@@ -61,6 +61,7 @@ enum WebfluxServerHttpAttributesGetter
6161
STATUS_CODE_VALUE = statusCodeValue;
6262
}
6363

64+
@Nullable
6465
private static Integer getStatusCode(ServerHttpResponse response) {
6566
if (GET_RAW_STATUS_CODE != null) {
6667
try {

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

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.lang.invoke.MethodHandles;
1212
import java.lang.invoke.MethodType;
1313
import java.util.List;
14-
import java.util.Map;
14+
import java.util.function.Supplier;
1515
import javax.annotation.Nullable;
1616
import org.springframework.http.HttpHeaders;
1717

@@ -21,33 +21,42 @@
2121
* guarantees are made.
2222
*/
2323
public final class HeaderUtil {
24+
2425
@Nullable private static final MethodHandle GET_HEADERS;
2526

2627
static {
27-
// since spring web 7.0
28-
GET_HEADERS = findGetHeadersMethod(MethodType.methodType(List.class, String.class, List.class));
28+
GET_HEADERS =
29+
firstAvailableHandle(
30+
findGetHeadersMethod(
31+
MethodType.methodType(List.class, String.class)), // since spring web 7.0
32+
() ->
33+
findGetHeadersMethod(
34+
MethodType.methodType(List.class, Object.class))); // before spring web 7.0
35+
}
36+
37+
@Nullable
38+
private static MethodHandle firstAvailableHandle(
39+
@Nullable MethodHandle first, Supplier<? extends MethodHandle> supplier) {
40+
return first != null ? first : supplier.get();
2941
}
3042

43+
@Nullable
3144
private static MethodHandle findGetHeadersMethod(MethodType methodType) {
3245
try {
33-
return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType);
46+
return MethodHandles.lookup().findVirtual(HttpHeaders.class, "get", methodType);
3447
} catch (Throwable t) {
3548
return null;
3649
}
3750
}
3851

39-
// before spring web 7.0 HttpHeaders implements Map<String, List<String>>, this triggers
40-
// errorprone BadInstanceof warning since errorpone is not aware that this instanceof check does
41-
// not pass with spring web 7.0+
42-
@SuppressWarnings({"unchecked", "BadInstanceof"})
52+
@SuppressWarnings("unchecked") // casting GET_HEADERS.invoke result
4353
public static List<String> getHeader(HttpHeaders headers, String name) {
44-
if (headers instanceof Map) {
45-
// before spring web 7.0
46-
return ((Map<String, List<String>>) headers).getOrDefault(name, emptyList());
47-
} else if (GET_HEADERS != null) {
48-
// spring web 7.0
54+
if (GET_HEADERS != null) {
4955
try {
50-
return (List<String>) GET_HEADERS.invoke(headers, name, emptyList());
56+
List<String> result = (List<String>) GET_HEADERS.invoke(headers, name);
57+
if (result != null) {
58+
return result;
59+
}
5160
} catch (Throwable t) {
5261
// ignore
5362
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
66
package io.opentelemetry.instrumentation.spring.webflux.v5_3.internal;
77

88
import io.opentelemetry.context.propagation.TextMapSetter;
9+
import javax.annotation.Nullable;
910
import org.springframework.web.reactive.function.client.ClientRequest;
1011

1112
enum HttpHeadersSetter implements TextMapSetter<ClientRequest.Builder> {
1213
INSTANCE;
1314

1415
@Override
15-
public void set(ClientRequest.Builder carrier, String key, String value) {
16+
public void set(@Nullable ClientRequest.Builder carrier, String key, String value) {
17+
if (carrier == null) {
18+
return;
19+
}
1620
carrier.headers(httpHeaders -> httpHeaders.set(key, value));
1721
}
1822
}

0 commit comments

Comments
 (0)