From 17f1494b5b4c7f5b49d1f9cf14fe130af9a66b67 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Tue, 1 Jul 2025 10:29:42 +0200 Subject: [PATCH 1/2] remove usage of incubating code semconv --- inferred-spans/build.gradle.kts | 2 ++ .../inferredspans/internal/CallTree.java | 4 ++-- .../internal/semconv/Attributes.java | 2 -- .../internal/CallTreeSpanifyTest.java | 10 +++++----- .../inferredspans/internal/CallTreeTest.java | 4 ++-- .../internal/semconv/AttributesTest.java | 19 ------------------- span-stacktrace/build.gradle.kts | 2 ++ .../stacktrace/StackTraceSpanProcessor.java | 10 +++------- .../StackTraceSpanProcessorTest.java | 7 +++---- 9 files changed, 19 insertions(+), 41 deletions(-) delete mode 100644 inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/semconv/AttributesTest.java diff --git a/inferred-spans/build.gradle.kts b/inferred-spans/build.gradle.kts index d0921a940..4617f83cd 100644 --- a/inferred-spans/build.gradle.kts +++ b/inferred-spans/build.gradle.kts @@ -13,6 +13,7 @@ dependencies { compileOnly("com.google.auto.service:auto-service-annotations") compileOnly("io.opentelemetry:opentelemetry-sdk") compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + compileOnly("io.opentelemetry.semconv:opentelemetry-semconv") implementation("com.lmax:disruptor") implementation("org.jctools:jctools-core") implementation("tools.profiler:async-profiler") @@ -21,6 +22,7 @@ dependencies { testAnnotationProcessor("com.google.auto.service:auto-service") testCompileOnly("com.google.auto.service:auto-service-annotations") + testImplementation("io.opentelemetry.semconv:opentelemetry-semconv") testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") testImplementation("io.opentelemetry:opentelemetry-sdk") testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") diff --git a/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/CallTree.java b/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/CallTree.java index 74468a3fd..a4a59a037 100644 --- a/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/CallTree.java +++ b/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/CallTree.java @@ -5,7 +5,6 @@ package io.opentelemetry.contrib.inferredspans.internal; -import static io.opentelemetry.contrib.inferredspans.internal.semconv.Attributes.CODE_STACKTRACE; import static io.opentelemetry.contrib.inferredspans.internal.semconv.Attributes.LINK_IS_CHILD; import static io.opentelemetry.contrib.inferredspans.internal.semconv.Attributes.SPAN_IS_INFERRED; import static java.util.logging.Level.FINE; @@ -20,6 +19,7 @@ import io.opentelemetry.contrib.inferredspans.internal.pooling.ObjectPool; import io.opentelemetry.contrib.inferredspans.internal.pooling.Recyclable; import io.opentelemetry.contrib.inferredspans.internal.util.HexUtils; +import io.opentelemetry.semconv.CodeAttributes; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -515,7 +515,7 @@ protected Span asSpan( assert this.parent != null; tempBuilder.setLength(0); this.parent.fillStackTrace(tempBuilder); - spanBuilder.setAttribute(CODE_STACKTRACE, tempBuilder.toString()); + spanBuilder.setAttribute(CodeAttributes.CODE_STACKTRACE, tempBuilder.toString()); } Span span = spanBuilder.startSpan(); diff --git a/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/semconv/Attributes.java b/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/semconv/Attributes.java index dddb3a738..c10662231 100644 --- a/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/semconv/Attributes.java +++ b/inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/internal/semconv/Attributes.java @@ -11,8 +11,6 @@ public class Attributes { private Attributes() {} - public static final AttributeKey CODE_STACKTRACE = - AttributeKey.stringKey("code.stacktrace"); public static final AttributeKey LINK_IS_CHILD = AttributeKey.booleanKey("is_child"); public static final AttributeKey SPAN_IS_INFERRED = AttributeKey.booleanKey("is_inferred"); diff --git a/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeSpanifyTest.java b/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeSpanifyTest.java index 8eddda06f..057fab819 100644 --- a/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeSpanifyTest.java +++ b/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeSpanifyTest.java @@ -5,7 +5,6 @@ package io.opentelemetry.contrib.inferredspans.internal; -import static io.opentelemetry.contrib.inferredspans.internal.semconv.Attributes.CODE_STACKTRACE; import static io.opentelemetry.contrib.inferredspans.internal.semconv.Attributes.SPAN_IS_INFERRED; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; @@ -21,6 +20,7 @@ import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import io.opentelemetry.semconv.CodeAttributes; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -64,26 +64,26 @@ void testSpanification() throws Exception { SpanData a = setup.getSpans().get(1); assertThat(a).hasName("CallTreeTest#a"); assertThat(a.getEndEpochNanos() - a.getStartEpochNanos()).isEqualTo(30_000_000); - assertThat(a.getAttributes().get(CODE_STACKTRACE)).isBlank(); + assertThat(a.getAttributes().get(CodeAttributes.CODE_STACKTRACE)).isBlank(); assertThat(a).hasAttribute(SPAN_IS_INFERRED, true); SpanData b = setup.getSpans().get(2); assertThat(b).hasName("CallTreeTest#b"); assertThat(b.getEndEpochNanos() - b.getStartEpochNanos()).isEqualTo(20_000_000); - assertThat(b.getAttributes().get(CODE_STACKTRACE)).isBlank(); + assertThat(b.getAttributes().get(CodeAttributes.CODE_STACKTRACE)).isBlank(); assertThat(b).hasAttribute(SPAN_IS_INFERRED, true); SpanData d = setup.getSpans().get(3); assertThat(d).hasName("CallTreeTest#d"); assertThat(d.getEndEpochNanos() - d.getStartEpochNanos()).isEqualTo(10_000_000); - assertThat(d.getAttributes().get(CODE_STACKTRACE)) + assertThat(d.getAttributes().get(CodeAttributes.CODE_STACKTRACE)) .isEqualTo("at " + CallTreeTest.class.getName() + ".c(CallTreeTest.java)"); assertThat(d).hasAttribute(SPAN_IS_INFERRED, true); SpanData e = setup.getSpans().get(4); assertThat(e).hasName("CallTreeTest#e"); assertThat(e.getEndEpochNanos() - e.getStartEpochNanos()).isEqualTo(10_000_000); - assertThat(e.getAttributes().get(CODE_STACKTRACE)).isBlank(); + assertThat(e.getAttributes().get(CodeAttributes.CODE_STACKTRACE)).isBlank(); assertThat(e).hasAttribute(SPAN_IS_INFERRED, true); } } diff --git a/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeTest.java b/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeTest.java index 8692158a6..b3d5df33a 100644 --- a/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeTest.java +++ b/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/CallTreeTest.java @@ -5,7 +5,6 @@ package io.opentelemetry.contrib.inferredspans.internal; -import static io.opentelemetry.contrib.inferredspans.internal.semconv.Attributes.CODE_STACKTRACE; import static io.opentelemetry.contrib.inferredspans.internal.semconv.Attributes.LINK_IS_CHILD; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static java.util.stream.Collectors.toMap; @@ -20,6 +19,7 @@ import io.opentelemetry.contrib.inferredspans.internal.util.DisabledOnOpenJ9; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.semconv.CodeAttributes; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; @@ -924,7 +924,7 @@ private Map assertCallTree( .describedAs("Unexpected duration for span %s", span) .isEqualTo(durationMs * 1_000_000L); - String actualStacktrace = span.getAttributes().get(CODE_STACKTRACE); + String actualStacktrace = span.getAttributes().get(CodeAttributes.CODE_STACKTRACE); if (stackTrace == null || stackTrace.isEmpty()) { assertThat(actualStacktrace).isBlank(); } else { diff --git a/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/semconv/AttributesTest.java b/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/semconv/AttributesTest.java deleted file mode 100644 index cc39c4960..000000000 --- a/inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/internal/semconv/AttributesTest.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.contrib.inferredspans.internal.semconv; - -import static org.assertj.core.api.Assertions.assertThat; - -import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; -import org.junit.jupiter.api.Test; - -public class AttributesTest { - - @Test - public void checkCodeStacktraceUpToDate() { - assertThat(Attributes.CODE_STACKTRACE).isEqualTo(CodeIncubatingAttributes.CODE_STACKTRACE); - } -} diff --git a/span-stacktrace/build.gradle.kts b/span-stacktrace/build.gradle.kts index b8316af62..f03ff28bb 100644 --- a/span-stacktrace/build.gradle.kts +++ b/span-stacktrace/build.gradle.kts @@ -18,6 +18,8 @@ dependencies { testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + compileOnly("io.opentelemetry.semconv:opentelemetry-semconv") + testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") testAnnotationProcessor("com.google.auto.service:auto-service") diff --git a/span-stacktrace/src/main/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessor.java b/span-stacktrace/src/main/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessor.java index 62fb9ff34..3565957b1 100644 --- a/span-stacktrace/src/main/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessor.java +++ b/span-stacktrace/src/main/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessor.java @@ -5,21 +5,17 @@ package io.opentelemetry.contrib.stacktrace; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.internal.ExtendedSpanProcessor; +import io.opentelemetry.semconv.CodeAttributes; import java.io.PrintWriter; import java.io.StringWriter; import java.util.function.Predicate; public class StackTraceSpanProcessor implements ExtendedSpanProcessor { - // inlined incubating attribute to prevent direct dependency on incubating semconv - private static final AttributeKey SPAN_STACKTRACE = - AttributeKey.stringKey("code.stacktrace"); - private final long minSpanDurationNanos; private final Predicate filterPredicate; @@ -56,14 +52,14 @@ public void onEnding(ReadWriteSpan span) { if (span.getLatencyNanos() < minSpanDurationNanos) { return; } - if (span.getAttribute(SPAN_STACKTRACE) != null) { + if (span.getAttribute(CodeAttributes.CODE_STACKTRACE) != null) { // Span already has a stacktrace, do not override return; } if (!filterPredicate.test(span)) { return; } - span.setAttribute(SPAN_STACKTRACE, generateSpanEndStacktrace()); + span.setAttribute(CodeAttributes.CODE_STACKTRACE, generateSpanEndStacktrace()); } @Override diff --git a/span-stacktrace/src/test/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessorTest.java b/span-stacktrace/src/test/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessorTest.java index 3d6d4686d..e5be32019 100644 --- a/span-stacktrace/src/test/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessorTest.java +++ b/span-stacktrace/src/test/java/io/opentelemetry/contrib/stacktrace/StackTraceSpanProcessorTest.java @@ -19,7 +19,7 @@ import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanExporter; -import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; +import io.opentelemetry.semconv.CodeAttributes; import java.time.Duration; import java.time.Instant; import java.util.HashMap; @@ -89,7 +89,7 @@ void spanWithExistingStackTrace() { YesPredicate.class, "1ms", Duration.ofMillis(1).toNanos(), - sb -> sb.setAttribute(CodeIncubatingAttributes.CODE_STACKTRACE, "hello"), + sb -> sb.setAttribute(CodeAttributes.CODE_STACKTRACE, "hello"), stacktrace -> assertThat(stacktrace).isEqualTo("hello")); } @@ -169,8 +169,7 @@ private static void checkSpan( List finishedSpans = spansExporter.getFinishedSpanItems(); assertThat(finishedSpans).hasSize(1); - String stackTrace = - finishedSpans.get(0).getAttributes().get(CodeIncubatingAttributes.CODE_STACKTRACE); + String stackTrace = finishedSpans.get(0).getAttributes().get(CodeAttributes.CODE_STACKTRACE); stackTraceCheck.accept(stackTrace); } From 228bbbfee64c204313f160cf9d73beff80906beb Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Tue, 1 Jul 2025 10:39:07 +0200 Subject: [PATCH 2/2] remove incubating dependencies --- inferred-spans/build.gradle.kts | 1 - span-stacktrace/build.gradle.kts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/inferred-spans/build.gradle.kts b/inferred-spans/build.gradle.kts index 4617f83cd..98d5e33a3 100644 --- a/inferred-spans/build.gradle.kts +++ b/inferred-spans/build.gradle.kts @@ -23,7 +23,6 @@ dependencies { testAnnotationProcessor("com.google.auto.service:auto-service") testCompileOnly("com.google.auto.service:auto-service-annotations") testImplementation("io.opentelemetry.semconv:opentelemetry-semconv") - testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") testImplementation("io.opentelemetry:opentelemetry-sdk") testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") testImplementation("io.opentelemetry:opentelemetry-sdk-testing") diff --git a/span-stacktrace/build.gradle.kts b/span-stacktrace/build.gradle.kts index f03ff28bb..4033b0177 100644 --- a/span-stacktrace/build.gradle.kts +++ b/span-stacktrace/build.gradle.kts @@ -19,8 +19,7 @@ dependencies { testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") compileOnly("io.opentelemetry.semconv:opentelemetry-semconv") - - testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") + testImplementation("io.opentelemetry.semconv:opentelemetry-semconv") testAnnotationProcessor("com.google.auto.service:auto-service") testCompileOnly("com.google.auto.service:auto-service-annotations")