diff --git a/instrumentation-api-incubator/build.gradle.kts b/instrumentation-api-incubator/build.gradle.kts index c25f6aea378d..7731d16c76b1 100644 --- a/instrumentation-api-incubator/build.gradle.kts +++ b/instrumentation-api-incubator/build.gradle.kts @@ -6,6 +6,7 @@ plugins { id("otel.jacoco-conventions") id("otel.japicmp-conventions") id("otel.publish-conventions") + id("otel.nullaway-conventions") } group = "io.opentelemetry.instrumentation" diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java index 817f16e11f10..1903bed26987 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java @@ -71,7 +71,7 @@ private DefaultHttpClientInstrumenterBuilder( String instrumentationName, OpenTelemetry openTelemetry, HttpClientAttributesGetter attributesGetter, - TextMapSetter headerSetter) { + @Nullable TextMapSetter headerSetter) { this.instrumentationName = Objects.requireNonNull(instrumentationName, "instrumentationName"); this.openTelemetry = Objects.requireNonNull(openTelemetry, "openTelemetry"); this.attributesGetter = Objects.requireNonNull(attributesGetter, "attributesGetter"); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java index 5bfce4bea771..bfee127f7cf1 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java @@ -64,7 +64,7 @@ private DefaultHttpServerInstrumenterBuilder( String instrumentationName, OpenTelemetry openTelemetry, HttpServerAttributesGetter attributesGetter, - TextMapGetter headerGetter) { + @Nullable TextMapGetter headerGetter) { this.instrumentationName = Objects.requireNonNull(instrumentationName, "instrumentationName"); this.openTelemetry = Objects.requireNonNull(openTelemetry, "openTelemetry"); this.attributesGetter = Objects.requireNonNull(attributesGetter, "attributesGetter"); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java index 2fc537047f77..2bcde2706295 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java @@ -17,8 +17,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.function.Function; import java.util.function.Supplier; +import javax.annotation.Nullable; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -41,6 +41,11 @@ public final class CommonConfig { private final String loggingSpanIdKey; private final String loggingTraceFlagsKey; + interface ValueProvider { + @Nullable + T get(ConfigProvider configProvider); + } + public CommonConfig(InstrumentationConfig config) { peerServiceResolver = PeerServiceResolver.create( @@ -159,12 +164,12 @@ public String getTraceFlagsKey() { private static T getFromConfigProviderOrFallback( InstrumentationConfig config, - Function getFromConfigProvider, + ValueProvider getFromConfigProvider, T defaultValue, Supplier fallback) { ConfigProvider configProvider = config.getConfigProvider(); if (configProvider != null) { - T value = getFromConfigProvider.apply(configProvider); + T value = getFromConfigProvider.get(configProvider); return value != null ? value : defaultValue; } // fallback doesn't return null, so we can safely call it diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java index 4204f95644a8..022529e16e4e 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java @@ -8,6 +8,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.internal.SemconvStability; import java.util.Collection; +import javax.annotation.Nullable; public abstract class DbClientSpanNameExtractor implements SpanNameExtractor { @@ -42,7 +43,8 @@ public static SpanNameExtractor create( private DbClientSpanNameExtractor() {} - protected String computeSpanName(String dbName, String operation, String mainIdentifier) { + protected String computeSpanName( + @Nullable String dbName, @Nullable String operation, @Nullable String mainIdentifier) { if (operation == null) { return dbName == null ? DEFAULT_SPAN_NAME : dbName; } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/MultiQuery.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/MultiQuery.java index bec0a7eb007d..07cb81af397c 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/MultiQuery.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/MultiQuery.java @@ -8,14 +8,16 @@ import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; +import javax.annotation.Nullable; class MultiQuery { - private final String mainIdentifier; - private final String operation; + @Nullable private final String mainIdentifier; + @Nullable private final String operation; private final Set statements; - private MultiQuery(String mainIdentifier, String operation, Set statements) { + private MultiQuery( + @Nullable String mainIdentifier, @Nullable String operation, Set statements) { this.mainIdentifier = mainIdentifier; this.operation = operation; this.statements = statements; @@ -40,10 +42,12 @@ static MultiQuery analyze( uniqueMainIdentifier.getValue(), uniqueOperation.getValue(), uniqueStatements); } + @Nullable public String getMainIdentifier() { return mainIdentifier; } + @Nullable public String getOperation() { return operation; } @@ -53,10 +57,10 @@ public Set getStatements() { } private static class UniqueValue { - private String value; + @Nullable private String value; private boolean valid = true; - void set(String value) { + void set(@Nullable String value) { if (!valid) { return; } @@ -67,6 +71,7 @@ void set(String value) { } } + @Nullable String getValue() { return valid ? value : null; } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java index 3c9af7d35449..d4760065b858 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java @@ -8,6 +8,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; +import javax.annotation.Nullable; /** * An interface for getting SQL database client attributes. @@ -33,6 +34,7 @@ public interface SqlClientAttributesGetter Collection getRawQueryTexts(REQUEST request); // TODO: make this required to implement + @Nullable default Long getBatchSize(REQUEST request) { return null; } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlStatementSanitizer.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlStatementSanitizer.java index 58fd4c3cc7dc..587b05d9d178 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlStatementSanitizer.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlStatementSanitizer.java @@ -51,7 +51,7 @@ public SqlStatementInfo sanitize(@Nullable String statement, SqlDialect dialect) CacheKey.create(statement, dialect), k -> sanitizeImpl(statement, dialect)); } - private static SqlStatementInfo sanitizeImpl(@Nullable String statement, SqlDialect dialect) { + private static SqlStatementInfo sanitizeImpl(String statement, SqlDialect dialect) { supportability.incrementCounter(SQL_STATEMENT_SANITIZER_CACHE_MISS); return AutoSqlSanitizer.sanitize(statement, dialect); } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/genai/GenAiAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/genai/GenAiAttributesGetter.java index 91b5a9f5bb02..ed2e48cd8024 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/genai/GenAiAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/genai/GenAiAttributesGetter.java @@ -50,17 +50,17 @@ public interface GenAiAttributesGetter { @Nullable Double getRequestTopP(REQUEST request); - List getResponseFinishReasons(REQUEST request, RESPONSE response); + List getResponseFinishReasons(REQUEST request, @Nullable RESPONSE response); @Nullable - String getResponseId(REQUEST request, RESPONSE response); + String getResponseId(REQUEST request, @Nullable RESPONSE response); @Nullable - String getResponseModel(REQUEST request, RESPONSE response); + String getResponseModel(REQUEST request, @Nullable RESPONSE response); @Nullable - Long getUsageInputTokens(REQUEST request, RESPONSE response); + Long getUsageInputTokens(REQUEST request, @Nullable RESPONSE response); @Nullable - Long getUsageOutputTokens(REQUEST request, RESPONSE response); + Long getUsageOutputTokens(REQUEST request, @Nullable RESPONSE response); } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/http/HttpClientPeerServiceAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/http/HttpClientPeerServiceAttributesExtractor.java index 2f4066aeec7c..8e4a094b6480 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/http/HttpClientPeerServiceAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/http/HttpClientPeerServiceAttributesExtractor.java @@ -76,7 +76,7 @@ public void onEnd( @Nullable private String mapToPeerService( - @Nullable String host, @Nullable Integer port, @Nullable Supplier pathSupplier) { + @Nullable String host, @Nullable Integer port, Supplier pathSupplier) { if (host == null) { return null; } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java index 4efce367e1a1..d34b5c7d0f61 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java @@ -141,6 +141,7 @@ public void onEnd( * any time. */ @Override + @Nullable public SpanKey internalGetSpanKey() { if (operation == null) { return null; diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceAttributesExtractor.java index d2f9e3233c73..687cda2ed279 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceAttributesExtractor.java @@ -72,6 +72,6 @@ private String mapToPeerService(@Nullable String host, @Nullable Integer port) { if (host == null) { return null; } - return peerServiceResolver.resolveService(host, port, null); + return peerServiceResolver.resolveService(host, port, () -> null); } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java index 62223f714dcf..81523e8061e4 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolver.java @@ -14,8 +14,7 @@ public interface PeerServiceResolver { public boolean isEmpty(); @Nullable - public String resolveService( - String host, @Nullable Integer port, @Nullable Supplier pathSupplier); + public String resolveService(String host, @Nullable Integer port, Supplier pathSupplier); static PeerServiceResolver create(Map mapping) { return new PeerServiceResolverImpl(mapping); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolverImpl.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolverImpl.java index cd896887f22f..cc741640fbfe 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolverImpl.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/net/PeerServiceResolverImpl.java @@ -46,8 +46,7 @@ public boolean isEmpty() { @Override @Nullable - public String resolveService( - String host, @Nullable Integer port, @Nullable Supplier pathSupplier) { + public String resolveService(String host, @Nullable Integer port, Supplier pathSupplier) { Map matchers = mapping.get(host); if (matchers == null) { return null; @@ -62,7 +61,7 @@ public String resolveService( @AutoValue abstract static class ServiceMatcher { - static ServiceMatcher create(Integer port, String path) { + static ServiceMatcher create(@Nullable Integer port, @Nullable String path) { return new AutoValue_PeerServiceResolverImpl_ServiceMatcher(port, path); } @@ -72,16 +71,13 @@ static ServiceMatcher create(Integer port, String path) { @Nullable abstract String getPath(); - public boolean matches(Integer port, Supplier pathSupplier) { + public boolean matches(@Nullable Integer port, Supplier pathSupplier) { if (this.getPort() != null) { if (!this.getPort().equals(port)) { return false; } } if (this.getPath() != null && this.getPath().length() > 0) { - if (pathSupplier == null) { - return false; - } String path = pathSupplier.get(); if (path == null) { return false;