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..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,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-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); 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..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 @@ -10,6 +10,7 @@ import jakarta.servlet.http.HttpServletRequest; import java.util.Collections; import java.util.Iterator; +import javax.annotation.Nullable; enum JakartaHttpServletRequestGetter implements TextMapGetter { INSTANCE; @@ -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 { 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..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 @@ -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,15 @@ 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 +92,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); } }