From 8da9ce74ae606875dabc27c97390762074c7f1f7 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 29 Oct 2025 09:53:16 +0100 Subject: [PATCH 1/4] add nullaway --- .../spring/spring-boot-autoconfigure/build.gradle.kts | 1 + .../autoconfigure/OpenTelemetryAutoConfiguration.java | 4 +++- .../internal/InstrumentationPropertyEnabled.java | 6 ++++-- .../annotations/InstrumentationWithSpanAspect.java | 2 ++ .../instrumentation/annotations/WithSpanAspect.java | 2 ++ .../instrumentation/jdbc/DataSourcePostProcessor.java | 3 +++ ...oncurrentKafkaListenerContainerFactoryPostProcessor.java | 2 ++ .../runtimemetrics/Java17RuntimeMetricsProvider.java | 2 ++ .../runtimemetrics/Java8RuntimeMetricsProvider.java | 2 ++ .../runtimemetrics/RuntimeMetricsAutoConfiguration.java | 2 ++ .../internal/properties/SpringConfigProperties.java | 2 ++ .../internal/resources/DistroVersionResourceProvider.java | 6 ++++-- .../spring/kafka/v2_7/SpringKafkaTelemetry.java | 5 +++-- 13 files changed, 32 insertions(+), 7 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 0d857ffb131c..231bc6039fe3 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.library-instrumentation") + id("otel.nullaway-conventions") } base.archivesName.set("opentelemetry-spring-boot-autoconfigure") diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java index 9728579c03c0..0be0df45ca60 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure; +import static java.util.Objects.requireNonNull; + import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.trace.TracerProvider; @@ -145,7 +147,7 @@ public InstrumentationConfig instrumentationConfig(ConfigProperties properties) @Bean public ConfigProperties otelProperties( AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { - return AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk); + return requireNonNull(AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk)); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/InstrumentationPropertyEnabled.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/InstrumentationPropertyEnabled.java index 39de2fc9227b..20adfe80fffb 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/InstrumentationPropertyEnabled.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/InstrumentationPropertyEnabled.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal; +import static java.util.Objects.requireNonNull; + import java.util.Map; import java.util.Objects; import org.springframework.context.annotation.Condition; @@ -25,7 +27,7 @@ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) return EarlyConfig.isInstrumentationEnabled( context.getEnvironment(), - attributes.get("module").toString(), - (boolean) attributes.get("enabledByDefault")); + requireNonNull(attributes.get("module")).toString(), + (boolean) requireNonNull(attributes.get("enabledByDefault"))); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java index 90c8c2e229d5..c8b112aac60e 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java @@ -10,6 +10,7 @@ import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.ParameterNameDiscoverer; +import javax.annotation.Nullable; @Aspect class InstrumentationWithSpanAspect extends WithSpanAspect { @@ -24,6 +25,7 @@ class InstrumentationWithSpanAspect extends WithSpanAspect { .InstrumentationAnnotationAttributeNameSupplier()); } + @Nullable @Override @Around("@annotation(io.opentelemetry.instrumentation.annotations.WithSpan)") public Object traceMethod(ProceedingJoinPoint pjp) throws Throwable { diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java index 89ff79dd6ab9..6ee977a3c052 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java @@ -18,6 +18,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.core.ParameterNameDiscoverer; +import javax.annotation.Nullable; /** * Uses Spring-AOP to wrap methods marked by {@link WithSpan} in a {@link Span}. @@ -64,6 +65,7 @@ private static Context parentContext( return request.inheritContext() ? parentContext : Context.root(); } + @Nullable public Object traceMethod(ProceedingJoinPoint pjp) throws Throwable { JoinPointRequest request = requestFactory.create(pjp); Context parentContext = Context.current(); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java index 3486c5fffe8b..8fe5589b7af8 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java @@ -17,6 +17,7 @@ import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; +import javax.annotation.Nullable; import javax.sql.DataSource; import org.springframework.aop.SpringProxy; import org.springframework.aop.framework.AdvisedSupport; @@ -27,6 +28,7 @@ final class DataSourcePostProcessor implements BeanPostProcessor, Ordered { + @Nullable private static final Class ROUTING_DATA_SOURCE_CLASS = getRoutingDataSourceClass(); private final ObjectProvider openTelemetryProvider; @@ -39,6 +41,7 @@ final class DataSourcePostProcessor implements BeanPostProcessor, Ordered { this.configProvider = configProvider; } + @Nullable private static Class getRoutingDataSourceClass() { try { return Class.forName("org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource"); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java index c27b37dc9630..8c7e9f7cb51f 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java @@ -13,6 +13,7 @@ import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.listener.BatchInterceptor; import org.springframework.kafka.listener.RecordInterceptor; +import javax.annotation.Nullable; class ConcurrentKafkaListenerContainerFactoryPostProcessor implements BeanPostProcessor { @@ -47,6 +48,7 @@ public Object postProcessAfterInitialization(Object bean, String beanName) { return listenerContainerFactory; } + @Nullable private static T readField(Object container, String filedName, Class fieldType) { try { Field field = AbstractKafkaListenerContainerFactory.class.getDeclaredField(filedName); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java index 8f258004a853..2699d35dc8f3 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; /** * Configures runtime metrics collection for Java 17+. @@ -26,6 +27,7 @@ public int minJavaVersion() { return 17; } + @Nullable @Override public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { logger.debug("Use runtime metrics instrumentation for Java 17+"); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java index fbb10d9e935b..23f48bacdce7 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.RuntimeMetricsConfigUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; /** * Configures runtime metrics collection for Java 8. @@ -26,6 +27,7 @@ public int minJavaVersion() { return 8; } + @Nullable @Override public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { logger.debug("Use runtime metrics instrumentation for Java 8"); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java index e88d02ac0c62..c2a1350c6a7a 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java @@ -10,6 +10,7 @@ import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; import java.util.Comparator; import java.util.Optional; +import javax.annotation.Nullable; import javax.annotation.PreDestroy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,6 +32,7 @@ public class RuntimeMetricsAutoConfiguration { private static final Logger logger = LoggerFactory.getLogger(RuntimeMetricsAutoConfiguration.class); + @Nullable private AutoCloseable closeable; @PreDestroy diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java index c82f1132ce32..22fc07a24aa8 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties; +import static java.util.Collections.emptyList; + import io.opentelemetry.api.internal.ConfigUtil; import io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil; import io.opentelemetry.instrumentation.resources.internal.ResourceProviderPropertiesCustomizer; diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java index db66ce9f0220..5b23edebc9a7 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java @@ -12,14 +12,16 @@ import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.resources.Resource; +import static java.util.Objects.requireNonNull; + /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ public class DistroVersionResourceProvider implements ResourceProvider { - public static final String VERSION = - EmbeddedInstrumentationProperties.findVersion("io.opentelemetry.spring-boot-autoconfigure"); + public static final String VERSION = requireNonNull( + EmbeddedInstrumentationProperties.findVersion("io.opentelemetry.spring-boot-autoconfigure")); private static final AttributeKey TELEMETRY_DISTRO_NAME = AttributeKey.stringKey("telemetry.distro.name"); diff --git a/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java b/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java index c5f88ccbde39..96ce08d8c5ab 100644 --- a/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java +++ b/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java @@ -13,6 +13,7 @@ import org.springframework.kafka.listener.AbstractMessageListenerContainer; import org.springframework.kafka.listener.BatchInterceptor; import org.springframework.kafka.listener.RecordInterceptor; +import javax.annotation.Nullable; /** Entrypoint for instrumenting Spring Kafka listeners. */ public final class SpringKafkaTelemetry { @@ -57,7 +58,7 @@ public RecordInterceptor createRecordInterceptor() { * {@link AbstractMessageListenerContainer#setRecordInterceptor(RecordInterceptor)} method. */ public RecordInterceptor createRecordInterceptor( - RecordInterceptor decoratedInterceptor) { + @Nullable RecordInterceptor decoratedInterceptor) { return new InstrumentedRecordInterceptor<>(processInstrumenter, decoratedInterceptor); } @@ -78,7 +79,7 @@ public BatchInterceptor createBatchInterceptor() { * {@link AbstractMessageListenerContainer#setBatchInterceptor(BatchInterceptor)} method. */ public BatchInterceptor createBatchInterceptor( - BatchInterceptor decoratedInterceptor) { + @Nullable BatchInterceptor decoratedInterceptor) { return new InstrumentedBatchInterceptor<>(batchProcessInstrumenter, decoratedInterceptor); } } From f9f142f1b5af2a54ed1e445e7c5a005651fa2160 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 17 Nov 2025 11:04:57 +0100 Subject: [PATCH 2/4] fix --- .../internal/properties/SpringConfigProperties.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java index 22fc07a24aa8..84a73314c225 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java @@ -5,8 +5,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties; -import static java.util.Collections.emptyList; - import io.opentelemetry.api.internal.ConfigUtil; import io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil; import io.opentelemetry.instrumentation.resources.internal.ResourceProviderPropertiesCustomizer; @@ -212,7 +210,7 @@ public List getList(String name) { } List envValue = (List) environment.getProperty(normalizedName, List.class); - return or(envValue, otelSdkProperties.getList(name)); + return mustOr(envValue, otelSdkProperties.getList(name)); } @Nullable @@ -283,4 +281,8 @@ private static Map mergeWithOtel( private static T or(@Nullable T first, @Nullable T second) { return first != null ? first : second; } + + private static T mustOr(@Nullable T first, T second) { + return first != null ? first : second; + } } From 7c867c7fe251dd7f35bd46902aa950b6ed5c18d0 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 17 Nov 2025 11:11:48 +0100 Subject: [PATCH 3/4] fix --- .../annotations/InstrumentationWithSpanAspect.java | 2 +- .../instrumentation/annotations/WithSpanAspect.java | 2 +- .../instrumentation/jdbc/DataSourcePostProcessor.java | 3 +-- ...rentKafkaListenerContainerFactoryPostProcessor.java | 2 +- .../runtimemetrics/Java17RuntimeMetricsProvider.java | 2 +- .../runtimemetrics/Java8RuntimeMetricsProvider.java | 2 +- .../RuntimeMetricsAutoConfiguration.java | 3 +-- .../resources/DistroVersionResourceProvider.java | 10 ++++++---- .../spring/kafka/v2_7/SpringKafkaTelemetry.java | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java index c8b112aac60e..2fc8c41c4a8e 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java @@ -6,11 +6,11 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations; import io.opentelemetry.api.OpenTelemetry; +import javax.annotation.Nullable; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.ParameterNameDiscoverer; -import javax.annotation.Nullable; @Aspect class InstrumentationWithSpanAspect extends WithSpanAspect { diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java index 6ee977a3c052..4a428ee35019 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java @@ -16,9 +16,9 @@ import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import javax.annotation.Nullable; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.core.ParameterNameDiscoverer; -import javax.annotation.Nullable; /** * Uses Spring-AOP to wrap methods marked by {@link WithSpan} in a {@link Span}. diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java index 8fe5589b7af8..41e8b6809492 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java @@ -28,8 +28,7 @@ final class DataSourcePostProcessor implements BeanPostProcessor, Ordered { - @Nullable - private static final Class ROUTING_DATA_SOURCE_CLASS = getRoutingDataSourceClass(); + @Nullable private static final Class ROUTING_DATA_SOURCE_CLASS = getRoutingDataSourceClass(); private final ObjectProvider openTelemetryProvider; private final ObjectProvider configProvider; diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java index 8c7e9f7cb51f..b03af717838b 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java @@ -8,12 +8,12 @@ import io.opentelemetry.instrumentation.spring.kafka.v2_7.SpringKafkaTelemetry; import java.lang.reflect.Field; import java.util.function.Supplier; +import javax.annotation.Nullable; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.kafka.config.AbstractKafkaListenerContainerFactory; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.listener.BatchInterceptor; import org.springframework.kafka.listener.RecordInterceptor; -import javax.annotation.Nullable; class ConcurrentKafkaListenerContainerFactoryPostProcessor implements BeanPostProcessor { diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java index 2699d35dc8f3..6518099c4bcc 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java @@ -9,9 +9,9 @@ import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; +import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nullable; /** * Configures runtime metrics collection for Java 17+. diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java index 23f48bacdce7..3b7f334ca815 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java @@ -9,9 +9,9 @@ import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.RuntimeMetricsConfigUtil; +import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nullable; /** * Configures runtime metrics collection for Java 8. diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java index c2a1350c6a7a..d32c13904fdd 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java @@ -32,8 +32,7 @@ public class RuntimeMetricsAutoConfiguration { private static final Logger logger = LoggerFactory.getLogger(RuntimeMetricsAutoConfiguration.class); - @Nullable - private AutoCloseable closeable; + @Nullable private AutoCloseable closeable; @PreDestroy public void stopMetrics() throws Exception { diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java index 5b23edebc9a7..0b1db8c4348a 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources; +import static java.util.Objects.requireNonNull; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties; @@ -12,16 +14,16 @@ import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.resources.Resource; -import static java.util.Objects.requireNonNull; - /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ public class DistroVersionResourceProvider implements ResourceProvider { - public static final String VERSION = requireNonNull( - EmbeddedInstrumentationProperties.findVersion("io.opentelemetry.spring-boot-autoconfigure")); + public static final String VERSION = + requireNonNull( + EmbeddedInstrumentationProperties.findVersion( + "io.opentelemetry.spring-boot-autoconfigure")); private static final AttributeKey TELEMETRY_DISTRO_NAME = AttributeKey.stringKey("telemetry.distro.name"); diff --git a/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java b/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java index 96ce08d8c5ab..f0d770540106 100644 --- a/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java +++ b/instrumentation/spring/spring-kafka-2.7/library/src/main/java/io/opentelemetry/instrumentation/spring/kafka/v2_7/SpringKafkaTelemetry.java @@ -10,10 +10,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaProcessRequest; import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaReceiveRequest; +import javax.annotation.Nullable; import org.springframework.kafka.listener.AbstractMessageListenerContainer; import org.springframework.kafka.listener.BatchInterceptor; import org.springframework.kafka.listener.RecordInterceptor; -import javax.annotation.Nullable; /** Entrypoint for instrumenting Spring Kafka listeners. */ public final class SpringKafkaTelemetry { From f6d4376b4f6a1b900016a0abc2d3c6029c41df9e Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 17 Nov 2025 18:12:40 +0100 Subject: [PATCH 4/4] pr review --- .../internal/properties/SpringConfigProperties.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java index 84a73314c225..395780a02cb5 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigProperties.java @@ -210,7 +210,7 @@ public List getList(String name) { } List envValue = (List) environment.getProperty(normalizedName, List.class); - return mustOr(envValue, otelSdkProperties.getList(name)); + return orNonNull(envValue, otelSdkProperties.getList(name)); } @Nullable @@ -282,7 +282,7 @@ private static T or(@Nullable T first, @Nullable T second) { return first != null ? first : second; } - private static T mustOr(@Nullable T first, T second) { + private static T orNonNull(@Nullable T first, T second) { return first != null ? first : second; } }