From 8a3ecab929a6eca393dcc8ffc0067fd42d02b9c3 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 3 Dec 2025 08:52:49 +0100 Subject: [PATCH 1/4] add nullaway to spring --- .../spring/spring-web/spring-web-3.1/javaagent/build.gradle.kts | 1 + .../spring/spring-web/spring-web-6.0/javaagent/build.gradle.kts | 1 + .../spring/web/v6_0/RestTemplateInstrumentation.java | 1 + 3 files changed, 3 insertions(+) diff --git a/instrumentation/spring/spring-web/spring-web-3.1/javaagent/build.gradle.kts b/instrumentation/spring/spring-web/spring-web-3.1/javaagent/build.gradle.kts index e30a83d7f5b9..4fd303392401 100644 --- a/instrumentation/spring/spring-web/spring-web-3.1/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-web/spring-web-3.1/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.nullaway-conventions") } muzzle { diff --git a/instrumentation/spring/spring-web/spring-web-6.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-web/spring-web-6.0/javaagent/build.gradle.kts index 04ec70b85d5a..e13597245558 100644 --- a/instrumentation/spring/spring-web/spring-web-6.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-web/spring-web-6.0/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.nullaway-conventions") } muzzle { diff --git a/instrumentation/spring/spring-web/spring-web-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/web/v6_0/RestTemplateInstrumentation.java b/instrumentation/spring/spring-web/spring-web-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/web/v6_0/RestTemplateInstrumentation.java index 1fb1923f69d6..8d01384f126f 100644 --- a/instrumentation/spring/spring-web/spring-web-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/web/v6_0/RestTemplateInstrumentation.java +++ b/instrumentation/spring/spring-web/spring-web-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/web/v6_0/RestTemplateInstrumentation.java @@ -37,6 +37,7 @@ public void transform(TypeTransformer transformer) { public static class UrlTemplateAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) + @Nullable public static Scope onEnter(@Advice.Argument(1) String uriTemplate) { if (uriTemplate != null) { String path = UrlParser.getPath(uriTemplate); From defea92cf2997369a2647c2112cb84dc751d3eec Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 3 Dec 2025 10:39:35 +0100 Subject: [PATCH 2/4] add nullaway to spring --- .../api/semconv/http/HttpServerRoute.java | 5 +++-- .../spring-webflux-5.0/javaagent/build.gradle.kts | 1 + .../spring/webflux/v5_0/server/AdviceUtils.java | 2 +- .../spring/webflux/v5_0/server/RouteOnSuccess.java | 1 + .../webflux/v5_0/server/WebfluxSingletons.java | 3 +++ .../spring-webmvc-3.1/javaagent/build.gradle.kts | 1 + .../webmvc/v3_1/SpringWebMvcServerSpanNaming.java | 3 +++ .../spring-webmvc-5.3/library/build.gradle.kts | 1 + .../spring/webmvc/v5_3/HttpRouteSupport.java | 5 ++++- .../webmvc/v5_3/JavaxHttpServletRequestGetter.java | 12 ++++++++++-- .../webmvc/v5_3/internal/SpringMvcBuilderUtil.java | 2 ++ .../spring-webmvc-6.0/javaagent/build.gradle.kts | 1 + .../webmvc/v6_0/SpringWebMvcServerSpanNaming.java | 3 +++ .../spring-webmvc-6.0/library/build.gradle.kts | 1 + .../spring/webmvc/v6_0/HttpRouteSupport.java | 5 ++++- .../webmvc/v6_0/JakartaHttpServletRequestGetter.java | 12 ++++++++++-- .../webmvc/v6_0/internal/SpringMvcBuilderUtil.java | 2 ++ .../spring-webmvc-common/javaagent/build.gradle.kts | 1 + .../spring/spring-ws-2.0/javaagent/build.gradle.kts | 1 + 19 files changed, 53 insertions(+), 9 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java index 01227b5c5ff7..b3f0cc841a4e 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java @@ -57,7 +57,8 @@ private HttpServerRoute() {} * strictly lower priority than the provided {@link HttpServerRouteSource}, and the passed value * is non-null. */ - public static void update(Context context, HttpServerRouteSource source, String httpRoute) { + public static void update(Context context, HttpServerRouteSource source, + @Nullable String httpRoute) { update(context, source, ConstantAdapter.INSTANCE, httpRoute); } @@ -75,7 +76,7 @@ public static void update( Context context, HttpServerRouteSource source, HttpServerRouteGetter httpRouteGetter, - T arg1) { + @Nullable T arg1) { update(context, source, OneArgAdapter::get, arg1, httpRouteGetter); } diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/build.gradle.kts index 8dd2bf8eabc1..11a996ddbe62 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.nullaway-conventions") } muzzle { diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/AdviceUtils.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/AdviceUtils.java index a7af1a299f34..9f43cc757c5e 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/AdviceUtils.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/AdviceUtils.java @@ -50,7 +50,7 @@ public static Mono wrapMono(Mono mono, Context context) { @FunctionalInterface interface OnSpanEnd { - void end(Throwable throwable); + void end(@Nullable Throwable throwable); } private static class ContextMono extends Mono { diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/RouteOnSuccess.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/RouteOnSuccess.java index aab075ec214f..22d93845d66c 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/RouteOnSuccess.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/RouteOnSuccess.java @@ -32,6 +32,7 @@ public void accept(HandlerFunction handler) { HttpServerRoute.update(Context.current(), HttpServerRouteSource.CONTROLLER, route); } + @Nullable private static String parsePredicateString(RouterFunction routerFunction) { String routerFunctionString = routerFunction.toString(); // Router functions containing lambda predicates should not end up in span tags since they are diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java index 5e08e970db70..bc57cf8f7f34 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java @@ -39,6 +39,9 @@ public static Instrumenter instrumenter() { public static HttpServerRouteGetter httpRouteGetter() { return (context, exchange) -> { + if (exchange == null) { + return null; + } Object bestPatternObj = exchange.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); if (bestPatternObj == null) { return null; diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/build.gradle.kts b/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/build.gradle.kts index 70b3c9f0ddac..0961b2a2851a 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.nullaway-conventions") } muzzle { diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v3_1/SpringWebMvcServerSpanNaming.java b/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v3_1/SpringWebMvcServerSpanNaming.java index d9cbc74125cb..fc434d20fc5a 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v3_1/SpringWebMvcServerSpanNaming.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v3_1/SpringWebMvcServerSpanNaming.java @@ -14,6 +14,9 @@ public class SpringWebMvcServerSpanNaming { public static final HttpServerRouteGetter SERVER_SPAN_NAME = (context, request) -> { + if (request == null) { + return null; + } Object bestMatchingPattern = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); if (bestMatchingPattern != null) { diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/build.gradle.kts b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/build.gradle.kts index 8144e116bdf4..a659db735651 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/build.gradle.kts +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.library-instrumentation") + id("otel.nullaway-conventions") } val springBootVersion = "2.6.15" diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/HttpRouteSupport.java b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/HttpRouteSupport.java index 71e8a2564819..3e615ac9b915 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/HttpRouteSupport.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/HttpRouteSupport.java @@ -96,7 +96,10 @@ private void setHandlerMappings(List mappings) { } @Nullable - String getHttpRoute(Context context, HttpServletRequest request) { + String getHttpRoute(Context context, @Nullable HttpServletRequest request) { + if (request == null) { + return null; + } boolean parsePath = this.parseRequestPath; Object previousValue = null; if (parsePath) { diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/JavaxHttpServletRequestGetter.java b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/JavaxHttpServletRequestGetter.java index 10f2d3bdf10a..ef5766d92cd2 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/JavaxHttpServletRequestGetter.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/JavaxHttpServletRequestGetter.java @@ -9,6 +9,7 @@ import io.opentelemetry.instrumentation.api.internal.EnumerationUtil; import java.util.Collections; import java.util.Iterator; +import javax.annotation.Nullable; import javax.servlet.http.HttpServletRequest; enum JavaxHttpServletRequestGetter implements TextMapGetter { @@ -20,12 +21,19 @@ public Iterable keys(HttpServletRequest carrier) { } @Override - public String get(HttpServletRequest carrier, String key) { + @Nullable + public String get(@Nullable HttpServletRequest carrier, String key) { + if (carrier == null) { + return null; + } return carrier.getHeader(key); } @Override - public Iterator getAll(HttpServletRequest carrier, String key) { + public Iterator getAll(@Nullable HttpServletRequest carrier, String key) { + if (carrier == null) { + return Collections.emptyIterator(); + } return EnumerationUtil.asIterator(carrier.getHeaders(key)); } } diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/internal/SpringMvcBuilderUtil.java b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/internal/SpringMvcBuilderUtil.java index 74ac99e33d8a..ba66da719d85 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/internal/SpringMvcBuilderUtil.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/internal/SpringMvcBuilderUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.spring.webmvc.v5_3.internal; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.internal.Initializer; import io.opentelemetry.instrumentation.spring.webmvc.v5_3.SpringWebMvcTelemetryBuilder; import java.util.function.Function; import javax.servlet.http.HttpServletRequest; @@ -31,6 +32,7 @@ private SpringMvcBuilderUtil() {} return builderExtractor; } + @Initializer public static void setBuilderExtractor( Function< SpringWebMvcTelemetryBuilder, diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/build.gradle.kts index 0d1e4ce8d2d8..39b9ba76e8f7 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.nullaway-conventions") } muzzle { diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v6_0/SpringWebMvcServerSpanNaming.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v6_0/SpringWebMvcServerSpanNaming.java index d510f674b3ef..85e6c764138e 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v6_0/SpringWebMvcServerSpanNaming.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v6_0/SpringWebMvcServerSpanNaming.java @@ -14,6 +14,9 @@ public class SpringWebMvcServerSpanNaming { public static final HttpServerRouteGetter SERVER_SPAN_NAME = (context, request) -> { + if (request == null) { + return null; + } Object bestMatchingPattern = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); if (bestMatchingPattern != null) { diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/build.gradle.kts b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/build.gradle.kts index d1499b41d6c4..7bf4522f73b1 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/build.gradle.kts +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.library-instrumentation") + id("otel.nullaway-conventions") } dependencies { diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/HttpRouteSupport.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/HttpRouteSupport.java index 1df0e9a6f4a9..265310c96a56 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/HttpRouteSupport.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/HttpRouteSupport.java @@ -96,7 +96,10 @@ private void setHandlerMappings(List mappings) { } @Nullable - String getHttpRoute(Context context, HttpServletRequest request) { + String getHttpRoute(Context context, @Nullable HttpServletRequest request) { + if (request == null) { + return null; + } boolean parsePath = this.parseRequestPath; Object previousValue = null; if (parsePath) { diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java index 630166cd5109..50959aceabf9 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java @@ -8,6 +8,7 @@ import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.instrumentation.api.internal.EnumerationUtil; import jakarta.servlet.http.HttpServletRequest; +import javax.annotation.Nullable; import java.util.Collections; import java.util.Iterator; @@ -20,12 +21,19 @@ public Iterable keys(HttpServletRequest carrier) { } @Override - public String get(HttpServletRequest carrier, String key) { + @Nullable + public String get(@Nullable HttpServletRequest carrier, String key) { + if (carrier == null) { + return null; + } return carrier.getHeader(key); } @Override - public Iterator getAll(HttpServletRequest carrier, String key) { + public Iterator getAll(@Nullable HttpServletRequest carrier, String key) { + if (carrier == null) { + return Collections.emptyIterator(); + } return EnumerationUtil.asIterator(carrier.getHeaders(key)); } } diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/internal/SpringMvcBuilderUtil.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/internal/SpringMvcBuilderUtil.java index d60102acd19a..b085821be3e4 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/internal/SpringMvcBuilderUtil.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/internal/SpringMvcBuilderUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.spring.webmvc.v6_0.internal; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.internal.Initializer; import io.opentelemetry.instrumentation.spring.webmvc.v6_0.SpringWebMvcTelemetryBuilder; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -31,6 +32,7 @@ private SpringMvcBuilderUtil() {} return builderExtractor; } + @Initializer public static void setBuilderExtractor( Function< SpringWebMvcTelemetryBuilder, diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/build.gradle.kts b/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/build.gradle.kts index 450402693838..2726dd3a2e03 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-common/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.nullaway-conventions") } dependencies { diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts index f1a063be7190..ff4f85bd1d2e 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.nullaway-conventions") } muzzle { From dd9e43e3a41912bcced20c4c8d286aca8b681736 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 3 Dec 2025 10:48:38 +0100 Subject: [PATCH 3/4] add nullaway to spring --- .../ws/v2_0/AnnotatedMethodInstrumentation.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java index 0be0707dc2af..a927ef439e45 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java +++ b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java @@ -7,6 +7,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.instrumentation.spring.ws.v2_0.SpringWsSingletons.instrumenter; +import static java.util.Objects.requireNonNull; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -53,12 +54,12 @@ public static class AnnotatedMethodAdvice { public static class AdviceScope { private final CallDepth callDepth; - private final SpringWsRequest request; - private final Context context; - private final Scope scope; + @Nullable private final SpringWsRequest request; + @Nullable private final Context context; + @Nullable private final Scope scope; private AdviceScope( - CallDepth callDepth, SpringWsRequest request, Context context, Scope scope) { + CallDepth callDepth, @Nullable SpringWsRequest request, @Nullable Context context, @Nullable Scope scope) { this.callDepth = callDepth; this.request = request; this.context = context; @@ -88,7 +89,8 @@ public void exit(@Nullable Throwable throwable) { return; } scope.close(); - instrumenter().end(context, request, null, throwable); + // scope non-null implies context and request are both non-null (see enter method above) + instrumenter().end(requireNonNull(context), requireNonNull(request), null, throwable); } } From ec5babe9327d8b59415ded0fae9b0c1920fe5ef8 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 3 Dec 2025 11:01:03 +0100 Subject: [PATCH 4/4] add nullaway to spring --- .../instrumentation/api/semconv/http/HttpServerRoute.java | 4 ++-- .../spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java | 2 +- .../spring/ws/v2_0/AnnotatedMethodInstrumentation.java | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java index b3f0cc841a4e..3abebf18b62d 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRoute.java @@ -57,8 +57,8 @@ private HttpServerRoute() {} * strictly lower priority than the provided {@link HttpServerRouteSource}, and the passed value * is non-null. */ - public static void update(Context context, HttpServerRouteSource source, - @Nullable String httpRoute) { + public static void update( + Context context, HttpServerRouteSource source, @Nullable String httpRoute) { update(context, source, ConstantAdapter.INSTANCE, httpRoute); } diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java index 50959aceabf9..9656733f2ca4 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/JakartaHttpServletRequestGetter.java @@ -8,9 +8,9 @@ import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.instrumentation.api.internal.EnumerationUtil; import jakarta.servlet.http.HttpServletRequest; -import javax.annotation.Nullable; import java.util.Collections; import java.util.Iterator; +import javax.annotation.Nullable; enum JakartaHttpServletRequestGetter implements TextMapGetter { INSTANCE; diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java index a927ef439e45..126eea66e4a6 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java +++ b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/v2_0/AnnotatedMethodInstrumentation.java @@ -59,7 +59,10 @@ public static class AdviceScope { @Nullable private final Scope scope; private AdviceScope( - CallDepth callDepth, @Nullable SpringWsRequest request, @Nullable Context context, @Nullable Scope scope) { + CallDepth callDepth, + @Nullable SpringWsRequest request, + @Nullable Context context, + @Nullable Scope scope) { this.callDepth = callDepth; this.request = request; this.context = context;