Skip to content

Commit 98d3b47

Browse files
committed
pr review
1 parent 9cf2cf0 commit 98d3b47

File tree

7 files changed

+59
-34
lines changed

7 files changed

+59
-34
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: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package io.opentelemetry.instrumentation.spring.web.v3_1;
77

88
import static java.util.Collections.emptyList;
9-
import static java.util.Objects.requireNonNull;
109

1110
import java.lang.invoke.MethodHandle;
1211
import java.lang.invoke.MethodHandles;
@@ -17,23 +16,22 @@
1716
import org.springframework.http.HttpHeaders;
1817

1918
class HeaderUtil {
20-
private static final MethodHandle GET_HEADERS;
19+
@Nullable private static final MethodHandle GET_HEADERS;
2120

2221
static {
2322
GET_HEADERS =
24-
nonNullHandle(
23+
firstAvailableHandle(
2524
findGetHeadersMethod(
2625
MethodType.methodType(List.class, String.class)), // since spring web 7.0
2726
() ->
2827
findGetHeadersMethod(
2928
MethodType.methodType(List.class, Object.class))); // before spring web 7.0
3029
}
3130

32-
private static MethodHandle nonNullHandle(
31+
@Nullable
32+
private static MethodHandle firstAvailableHandle(
3333
@Nullable MethodHandle first, Supplier<? extends MethodHandle> supplier) {
34-
return (first != null)
35-
? first
36-
: requireNonNull(supplier.get(), "Could not find suitable get method on HttpHeaders");
34+
return first != null ? first : supplier.get();
3735
}
3836

3937
@Nullable
@@ -45,20 +43,19 @@ private static MethodHandle findGetHeadersMethod(MethodType methodType) {
4543
}
4644
}
4745

48-
// before spring web 7.0 HttpHeaders implements Map<String, List<String>>, this triggers
49-
// errorprone BadInstanceof warning since errorpone is not aware that this instanceof check does
50-
// not pass with spring web 7.0+
5146
@SuppressWarnings("unchecked") // casting GET_HEADERS.invoke result
5247
static List<String> getHeader(HttpHeaders headers, String name) {
53-
try {
54-
List<String> result = (List<String>) GET_HEADERS.invoke(headers, name);
55-
if (result == null) {
56-
return emptyList();
48+
if (GET_HEADERS != null) {
49+
try {
50+
List<String> result = (List<String>) GET_HEADERS.invoke(headers, name);
51+
if (result != null) {
52+
return result;
53+
}
54+
} catch (Throwable t) {
55+
// ignore
5756
}
58-
return result;
59-
} catch (Throwable t) {
60-
throw new IllegalStateException(t);
6157
}
58+
return emptyList();
6259
}
6360

6461
private HeaderUtil() {}

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: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.lang.invoke.MethodHandles;
1212
import java.lang.invoke.MethodType;
1313
import java.util.List;
14+
import java.util.function.Supplier;
15+
import javax.annotation.Nullable;
1416
import org.springframework.http.HttpHeaders;
1517

1618
/**
@@ -19,31 +21,44 @@
1921
* guarantees are made.
2022
*/
2123
public final class HeaderUtil {
22-
private static final MethodHandle GET_HEADERS;
24+
25+
@Nullable private static final MethodHandle GET_HEADERS;
2326

2427
static {
25-
// since spring web 7.0
26-
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();
2741
}
2842

43+
@Nullable
2944
private static MethodHandle findGetHeadersMethod(MethodType methodType) {
3045
try {
31-
return MethodHandles.lookup().findVirtual(HttpHeaders.class, "getOrDefault", methodType);
46+
return MethodHandles.lookup().findVirtual(HttpHeaders.class, "get", methodType);
3247
} catch (Throwable t) {
3348
return null;
3449
}
3550
}
3651

37-
// before spring web 7.0 HttpHeaders implements Map<String, List<String>>, this triggers
38-
// errorprone BadInstanceof warning since errorpone is not aware that this instanceof check does
39-
// not pass with spring web 7.0+
4052
@SuppressWarnings("unchecked") // casting GET_HEADERS.invoke result
4153
public static List<String> getHeader(HttpHeaders headers, String name) {
42-
if (headers != null) {
54+
if (GET_HEADERS != null) {
4355
try {
44-
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+
}
4560
} catch (Throwable t) {
46-
throw new IllegalStateException(t);
61+
// ignore
4762
}
4863
}
4964
return emptyList();

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
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
99
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
10+
import io.opentelemetry.instrumentation.api.internal.Initializer;
1011
import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxClientTelemetryBuilder;
1112
import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxServerTelemetryBuilder;
1213
import java.util.function.Function;
@@ -40,6 +41,7 @@ private SpringWebfluxBuilderUtil() {}
4041
return serverBuilderExtractor;
4142
}
4243

44+
@Initializer
4345
public static void setServerBuilderExtractor(
4446
Function<
4547
SpringWebfluxServerTelemetryBuilder,
@@ -55,6 +57,7 @@ public static void setServerBuilderExtractor(
5557
return clientBuilderExtractor;
5658
}
5759

60+
@Initializer
5861
public static void setClientBuilderExtractor(
5962
Function<
6063
SpringWebfluxClientTelemetryBuilder,

0 commit comments

Comments
 (0)