diff --git a/conventions/src/main/kotlin/otel.nullaway-conventions.gradle.kts b/conventions/src/main/kotlin/otel.nullaway-conventions.gradle.kts index 6cb4c26c00d9..e94b18c8e33e 100644 --- a/conventions/src/main/kotlin/otel.nullaway-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.nullaway-conventions.gradle.kts @@ -18,10 +18,19 @@ nullaway { tasks { withType().configureEach { - if (!name.contains("test", ignoreCase = true)) { + if (name.contains("test", ignoreCase = true)) { + options.errorprone.nullaway { + enabled = false + } + } else { options.errorprone.nullaway { severity.set(CheckSeverity.ERROR) } } + options.errorprone.nullaway { + customInitializerAnnotations.add("org.openjdk.jmh.annotations.Setup") + excludedFieldAnnotations.add("org.mockito.Mock") + excludedFieldAnnotations.add("org.mockito.InjectMocks") + } } } diff --git a/instrumentation-api/build.gradle.kts b/instrumentation-api/build.gradle.kts index 07c476fd8b94..0d43409de6bf 100644 --- a/instrumentation-api/build.gradle.kts +++ b/instrumentation-api/build.gradle.kts @@ -7,6 +7,7 @@ plugins { id("otel.japicmp-conventions") id("otel.publish-conventions") id("otel.jmh-conventions") + id("otel.nullaway-conventions") } group = "io.opentelemetry.instrumentation" diff --git a/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java b/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java index ff69ca3ebca8..ff84d1b934bc 100644 --- a/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java +++ b/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java @@ -33,8 +33,10 @@ @State(Scope.Thread) public class InstrumenterBenchmark { - private static final Instrumenter INSTRUMENTER = - Instrumenter.builder( + private static final Object REQUEST = new Object(); + + private static final Instrumenter INSTRUMENTER = + Instrumenter.builder( OpenTelemetry.noop(), "benchmark", HttpSpanNameExtractor.create(ConstantHttpAttributesGetter.INSTANCE)) @@ -44,34 +46,34 @@ public class InstrumenterBenchmark { @Benchmark public Context start() { - return INSTRUMENTER.start(Context.root(), null); + return INSTRUMENTER.start(Context.root(), REQUEST); } @Benchmark public Context startEnd() { - Context context = INSTRUMENTER.start(Context.root(), null); - INSTRUMENTER.end(context, null, null, null); + Context context = INSTRUMENTER.start(Context.root(), REQUEST); + INSTRUMENTER.end(context, REQUEST, null, null); return context; } - enum ConstantHttpAttributesGetter implements HttpClientAttributesGetter { + enum ConstantHttpAttributesGetter implements HttpClientAttributesGetter { INSTANCE; private static final InetSocketAddress PEER_ADDRESS = InetSocketAddress.createUnresolved("localhost", 8080); @Override - public String getUrlFull(Void unused) { + public String getUrlFull(Object unused) { return "https://opentelemetry.io/benchmark"; } @Override - public String getHttpRequestMethod(Void unused) { + public String getHttpRequestMethod(Object unused) { return "GET"; } @Override - public List getHttpRequestHeader(Void unused, String name) { + public List getHttpRequestHeader(Object unused, String name) { if (name.equalsIgnoreCase("user-agent")) { return Collections.singletonList("OpenTelemetryBot"); } @@ -79,40 +81,41 @@ public List getHttpRequestHeader(Void unused, String name) { } @Override - public Integer getHttpResponseStatusCode(Void unused, Void unused2, @Nullable Throwable error) { + public Integer getHttpResponseStatusCode( + Object unused, Void unused2, @Nullable Throwable error) { return 200; } @Override - public List getHttpResponseHeader(Void unused, Void unused2, String name) { + public List getHttpResponseHeader(Object unused, Void unused2, String name) { return Collections.emptyList(); } @Override - public String getNetworkProtocolName(Void unused, @Nullable Void unused2) { + public String getNetworkProtocolName(Object unused, @Nullable Void unused2) { return "http"; } @Override - public String getNetworkProtocolVersion(Void unused, @Nullable Void unused2) { + public String getNetworkProtocolVersion(Object unused, @Nullable Void unused2) { return "2.0"; } @Nullable @Override - public String getServerAddress(Void request) { + public String getServerAddress(Object request) { return null; } @Nullable @Override - public Integer getServerPort(Void request) { + public Integer getServerPort(Object request) { return null; } @Override public InetSocketAddress getNetworkPeerInetSocketAddress( - Void request, @Nullable Void response) { + Object request, @Nullable Void response) { return PEER_ADDRESS; } } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/UnsafeAttributes.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/UnsafeAttributes.java index 782592d5f09a..08a009c6b1f0 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/UnsafeAttributes.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/UnsafeAttributes.java @@ -12,6 +12,7 @@ import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; +import javax.annotation.Nullable; /** * The {@link AttributesBuilder} and {@link Attributes} used by the instrumentation API. We are able @@ -29,6 +30,7 @@ final class UnsafeAttributes extends HashMap, Object> @SuppressWarnings("unchecked") @Override + @Nullable public T get(AttributeKey key) { return (T) super.get(key); } @@ -62,7 +64,7 @@ public AttributesBuilder put(AttributeKey key, int value) { @Override @CanIgnoreReturnValue - public AttributesBuilder put(AttributeKey key, T value) { + public AttributesBuilder put(AttributeKey key, @Nullable T value) { super.put(key, value); return this; } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java index 963554c1eff9..cf698069fc05 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java @@ -45,7 +45,7 @@ public final class ContextPropagationDebug { private final Context sourceContext; private final List locations; // context after adding debug locations - private Context wrappedContext; + @Nullable private Context wrappedContext; private ContextPropagationDebug(Context sourceContext) { this.sourceContext = sourceContext; diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpProtocolUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpProtocolUtil.java index 99668ff4f4bd..1ebcbd50924d 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpProtocolUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpProtocolUtil.java @@ -13,6 +13,7 @@ */ public final class HttpProtocolUtil { + @Nullable public static String getProtocol(@Nullable String protocol) { if (protocol != null && protocol.startsWith("HTTP/")) { return "http"; @@ -20,6 +21,7 @@ public static String getProtocol(@Nullable String protocol) { return null; } + @Nullable public static String getVersion(@Nullable String protocol) { if (protocol != null && protocol.startsWith("HTTP/")) { return normalizeHttpVersion(protocol.substring("HTTP/".length())); diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpRouteState.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpRouteState.java index efda14dbba02..2aff4de472d8 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpRouteState.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/HttpRouteState.java @@ -40,7 +40,10 @@ public static HttpRouteState create( // this method is used reflectively from InstrumentationApiContextBridging public static HttpRouteState create( - @Nullable String method, @Nullable String route, int updatedBySourceOrder, Span span) { + @Nullable String method, + @Nullable String route, + int updatedBySourceOrder, + @Nullable Span span) { return new HttpRouteState(method, route, updatedBySourceOrder, span); } @@ -50,7 +53,10 @@ public static HttpRouteState create( @Nullable private volatile Span span; private HttpRouteState( - @Nullable String method, @Nullable String route, int updatedBySourceOrder, Span span) { + @Nullable String method, + @Nullable String route, + int updatedBySourceOrder, + @Nullable Span span) { this.method = method; this.updatedBySourceOrder = updatedBySourceOrder; this.route = route; diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/Initializer.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/Initializer.java new file mode 100644 index 000000000000..cb920fef66f2 --- /dev/null +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/Initializer.java @@ -0,0 +1,15 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.internal; + +/** + * See NullAway + * spec + * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +public @interface Initializer {} diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java index 76671675eeac..1a8fa2500bef 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java @@ -24,10 +24,12 @@ public final class InstrumenterUtil { private static InstrumenterAccess instrumenterAccess; private static InstrumenterBuilderAccess instrumenterBuilderAccess; + @Initializer public static void setInstrumenterAccess(InstrumenterAccess instrumenterAccess) { InstrumenterUtil.instrumenterAccess = instrumenterAccess; } + @Initializer public static void setInstrumenterBuilderAccess( InstrumenterBuilderAccess instrumenterBuilderAccess) { InstrumenterUtil.instrumenterBuilderAccess = instrumenterBuilderAccess; diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/WeakLockFreeCache.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/WeakLockFreeCache.java index 3681ea2a3cfa..502a7fb171d9 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/WeakLockFreeCache.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/WeakLockFreeCache.java @@ -7,6 +7,7 @@ import io.opentelemetry.instrumentation.api.internal.cache.weaklockfree.WeakConcurrentMap; import java.util.function.Function; +import javax.annotation.Nullable; final class WeakLockFreeCache implements Cache { @@ -22,6 +23,7 @@ public V computeIfAbsent(K key, Function mappingFunction } @Override + @Nullable public V get(K key) { return delegate.getIfPresent(key); } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/AbstractWeakConcurrentMap.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/AbstractWeakConcurrentMap.java index 30aac391bb41..271177e02d2b 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/AbstractWeakConcurrentMap.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/AbstractWeakConcurrentMap.java @@ -25,6 +25,8 @@ package io.opentelemetry.instrumentation.api.internal.cache.weaklockfree; +import static java.util.Objects.requireNonNull; + import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; @@ -81,6 +83,7 @@ protected AbstractWeakConcurrentMap(ConcurrentMap, V> target) { * @param key The key of the entry. * @return The value of the entry or the default value if it did not exist. */ + @Nullable public V get(K key) { if (key == null) { throw new NullPointerException(); @@ -108,6 +111,7 @@ public V get(K key) { * @param key The key of the entry. * @return The value of the entry or null if it did not exist. */ + @Nullable public V getIfPresent(K key) { if (key == null) { throw new NullPointerException(); @@ -225,6 +229,7 @@ public void clear() { * @return The default value for a key without value or {@code null} for not defining a default * value. */ + @Nullable protected V defaultValue(K key) { return null; } @@ -328,7 +333,7 @@ public int hashCode() { } @Override - public boolean equals(@Nullable Object other) { + public boolean equals(Object other) { if (other instanceof WeakKey) { return ((WeakKey) other).get() == get(); } else { @@ -346,9 +351,9 @@ private class EntryIterator implements Iterator> { private final Iterator, V>> iterator; - private Map.Entry, V> nextEntry; + @Nullable private Map.Entry, V> nextEntry; - private K nextKey; + @Nullable private K nextKey; private EntryIterator(Iterator, V>> iterator) { this.iterator = iterator; @@ -374,11 +379,12 @@ public boolean hasNext() { @Override public Map.Entry next() { - if (nextKey == null) { + K key = nextKey; + if (key == null) { throw new NoSuchElementException(); } try { - return new SimpleEntry(nextKey, nextEntry); + return new SimpleEntry(key, requireNonNull(nextEntry)); } finally { findNext(); } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMap.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMap.java index d7ca2dc941b7..21f6a08bff5f 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMap.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMap.java @@ -142,7 +142,7 @@ protected void resetLookupKey(LookupKey lookupKey) { // can't use AutoClosable/try-with-resources as this project still supports Java 6 static final class LookupKey { - private K key; + @Nullable private K key; private int hashCode; @SuppressWarnings("OtelCanIgnoreReturnValueSuggester") @@ -159,7 +159,7 @@ void reset() { } @Override - public boolean equals(@Nullable Object other) { + public boolean equals(Object other) { if (other instanceof WeakConcurrentMap.LookupKey) { return ((LookupKey) other).key == key; } else { @@ -183,12 +183,14 @@ public int hashCode() { public static class WithInlinedExpunction extends WeakConcurrentMap { @Override + @Nullable public V get(K key) { expungeStaleEntries(); return super.get(key); } @Override + @Nullable public V getIfPresent(K key) { expungeStaleEntries(); return super.getIfPresent(key); diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMapCleaner.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMapCleaner.java index cd7cd16adb36..fc1bb9f62a8a 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMapCleaner.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/cache/weaklockfree/WeakConcurrentMapCleaner.java @@ -5,12 +5,14 @@ package io.opentelemetry.instrumentation.api.internal.cache.weaklockfree; +import javax.annotation.Nullable; + /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ public final class WeakConcurrentMapCleaner { - private static Thread thread; + @Nullable private static Thread thread; private WeakConcurrentMapCleaner() {} diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/ForwardedUrlSchemeProvider.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/ForwardedUrlSchemeProvider.java index ccfb71c537e1..44c0aafe132f 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/ForwardedUrlSchemeProvider.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/ForwardedUrlSchemeProvider.java @@ -18,6 +18,7 @@ final class ForwardedUrlSchemeProvider implements Function void update( Context context, HttpServerRouteSource source, HttpServerRouteBiGetter httpRouteGetter, - T arg1, + @Nullable T arg1, U arg2) { HttpRouteState httpRouteState = HttpRouteState.fromContextOrNull(context); if (httpRouteState == null) { @@ -162,7 +161,7 @@ static OneArgAdapter getInstance() { @Override @Nullable - public String get(Context context, T arg, HttpServerRouteGetter httpRouteGetter) { + public String get(Context context, @Nullable T arg, HttpServerRouteGetter httpRouteGetter) { return httpRouteGetter.get(context, arg); } } @@ -173,7 +172,7 @@ private static final class ConstantAdapter implements HttpServerRouteGetter { * {@code arg2}; or {@code null} if it was not found. */ @Nullable - String get(Context context, T arg1, U arg2); + String get(Context context, @Nullable T arg1, U arg2); } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRouteGetter.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRouteGetter.java index ee2eb17433b9..7939321b2427 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRouteGetter.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerRouteGetter.java @@ -21,5 +21,5 @@ public interface HttpServerRouteGetter { * {@code null} if it was not found. */ @Nullable - String get(Context context, T arg); + String get(Context context, @Nullable T arg); } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPort.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPort.java index ffd9b80774ab..9e4c0b080bf5 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPort.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPort.java @@ -17,12 +17,12 @@ public final class AddressAndPort implements AddressAndPortExtractor.AddressPort @Nullable Integer port; @Override - public void setAddress(String address) { + public void setAddress(@Nullable String address) { this.address = address; } @Override - public void setPort(Integer port) { + public void setPort(@Nullable Integer port) { this.port = port; } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPortExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPortExtractor.java index ea6671dd483d..b0bbf9a58fad 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPortExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/AddressAndPortExtractor.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.api.semconv.network.internal; +import javax.annotation.Nullable; + /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. @@ -29,8 +31,8 @@ static AddressAndPortExtractor noop() { */ interface AddressPortSink { - void setAddress(String address); + void setAddress(@Nullable String address); - void setPort(Integer port); + void setPort(@Nullable Integer port); } } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/url/internal/InternalUrlAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/url/internal/InternalUrlAttributesExtractor.java index 37103b0c6983..60a6dea99ee0 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/url/internal/InternalUrlAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/url/internal/InternalUrlAttributesExtractor.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.semconv.url.UrlAttributesGetter; import io.opentelemetry.semconv.UrlAttributes; import java.util.function.Function; +import javax.annotation.Nullable; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -37,6 +38,7 @@ public void onStart(AttributesBuilder attributes, REQUEST request) { internalSet(attributes, UrlAttributes.URL_QUERY, urlQuery); } + @Nullable private String getUrlScheme(REQUEST request) { String urlScheme = alternateSchemeProvider.apply(request); if (urlScheme == null) { diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerAttributesGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerAttributesGetter.java index c742fe99f857..0d5b38018439 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerAttributesGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerAttributesGetter.java @@ -64,11 +64,13 @@ public String getHttpRoute(HttpExchange exchange) { } @Override + @Nullable public String getNetworkProtocolName(HttpExchange exchange, @Nullable HttpExchange res) { return HttpProtocolUtil.getProtocol(exchange.getProtocol()); } @Override + @Nullable public String getNetworkProtocolVersion(HttpExchange exchange, @Nullable HttpExchange res) { return HttpProtocolUtil.getVersion(exchange.getProtocol()); } diff --git a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTelemetry.kt b/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTelemetry.kt index b9afcd1d4385..3566da713fa6 100644 --- a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTelemetry.kt +++ b/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTelemetry.kt @@ -161,7 +161,7 @@ class KtorServerTelemetry private constructor( pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call -> val context = call.attributes.getOrNull(contextKey) if (context != null) { - HttpServerRoute.update(context, HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) + HttpServerRoute.update(context, HttpServerRouteSource.SERVER, { _, arg -> arg!!.route.parent.toString() }, call) } } diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTelemetryBuilder.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTelemetryBuilder.kt index 63d6931f3fe9..9460f5d0f2e6 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTelemetryBuilder.kt +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTelemetryBuilder.kt @@ -24,6 +24,6 @@ val KtorServerTelemetry = createRouteScopedPlugin("OpenTelemetry", { KtorServerT KtorServerTelemetryUtil.configureTelemetry(pluginConfig, application) application.environment.monitor.subscribe(Routing.RoutingCallStarted) { call -> - HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) + HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg!!.route.parent.toString() }, call) } } diff --git a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorServerTelemetryBuilder.kt b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorServerTelemetryBuilder.kt index 3a582af028ba..31d3a0892a6f 100644 --- a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorServerTelemetryBuilder.kt +++ b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorServerTelemetryBuilder.kt @@ -24,6 +24,6 @@ val KtorServerTelemetry = createRouteScopedPlugin("OpenTelemetry", { KtorServerT KtorServerTelemetryUtil.configureTelemetry(pluginConfig, application) application.monitor.subscribe(RoutingRoot.RoutingCallStarted) { call -> - HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) + HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg!!.route.parent.toString() }, call) } }