From 80dddc208297195cbdc0e2786882153ca4e4ebdc Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 13:54:22 +0200 Subject: [PATCH 01/18] make agent tracer available for spring starter --- .../tooling/AddThreadDetailsSpanProcessorTest.groovy | 1 + .../tracer}/AddThreadDetailsSpanProcessor.java | 2 +- .../tracer}/AgentTracerProviderConfigurer.java | 5 ++--- ...sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) rename {javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling => sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer}/AddThreadDetailsSpanProcessor.java (96%) rename {javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling => sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer}/AgentTracerProviderConfigurer.java (93%) diff --git a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessorTest.groovy b/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessorTest.groovy index d3a8a8c933db..a76b0d1fb16d 100644 --- a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessorTest.groovy +++ b/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessorTest.groovy @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.tooling import io.opentelemetry.context.Context +import io.opentelemetry.instrumentation.tracer.AddThreadDetailsSpanProcessor import io.opentelemetry.sdk.trace.ReadWriteSpan import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes import spock.lang.Specification diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessor.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java similarity index 96% rename from javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessor.java rename to sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java index 496d8580ff79..a53b0b943ad2 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessor.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.tooling; +package io.opentelemetry.instrumentation.tracer; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java similarity index 93% rename from javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java rename to sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java index 71223c79573c..1d5853eee4c2 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.tooling; +package io.opentelemetry.instrumentation.tracer; import static io.opentelemetry.javaagent.tooling.AgentInstaller.JAVAAGENT_ENABLED_CONFIG; import static java.util.Collections.emptyList; @@ -18,7 +18,6 @@ import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; -@AutoService(AutoConfigurationCustomizerProvider.class) public class AgentTracerProviderConfigurer implements AutoConfigurationCustomizerProvider { private static final String ADD_THREAD_DETAILS = "otel.javaagent.add-thread-details"; @@ -31,7 +30,7 @@ public void customize(AutoConfigurationCustomizer autoConfigurationCustomizer) { @CanIgnoreReturnValue private static SdkTracerProviderBuilder configure( SdkTracerProviderBuilder sdkTracerProviderBuilder, ConfigProperties config) { - if (!config.getBoolean(JAVAAGENT_ENABLED_CONFIG, true)) { + if (!config.getBoolean(AgentInstaller.JAVAAGENT_ENABLED_CONFIG, true)) { return sdkTracerProviderBuilder; } diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider index 3f8716ab23aa..06a23709c1fc 100644 --- a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider +++ b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider @@ -1 +1,2 @@ io.opentelemetry.instrumentation.resources.ResourceProviderPropertiesCustomizer +io.opentelemetry.instrumentation.tracer.AgentTracerProviderConfigurer From 8f1facc862cf0bc09a52e29d67dcea6fea79d21e Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 14:56:08 +0200 Subject: [PATCH 02/18] make agent tracer available for spring starter --- sdk-autoconfigure-support/build.gradle.kts | 1 + .../instrumentation/tracer/AgentTracerProviderConfigurer.java | 4 +++- .../tracer}/AddThreadDetailsSpanProcessorTest.groovy | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) rename {javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling => sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer}/AddThreadDetailsSpanProcessorTest.groovy (88%) diff --git a/sdk-autoconfigure-support/build.gradle.kts b/sdk-autoconfigure-support/build.gradle.kts index 7a2e5e185912..c2948406f7e1 100644 --- a/sdk-autoconfigure-support/build.gradle.kts +++ b/sdk-autoconfigure-support/build.gradle.kts @@ -10,4 +10,5 @@ dependencies { compileOnly("com.google.code.findbugs:annotations") testCompileOnly("com.google.code.findbugs:annotations") + testImplementation(project(":testing-common")) } diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java index 1d5853eee4c2..d22e7852b465 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java @@ -30,7 +30,9 @@ public void customize(AutoConfigurationCustomizer autoConfigurationCustomizer) { @CanIgnoreReturnValue private static SdkTracerProviderBuilder configure( SdkTracerProviderBuilder sdkTracerProviderBuilder, ConfigProperties config) { - if (!config.getBoolean(AgentInstaller.JAVAAGENT_ENABLED_CONFIG, true)) { + // Spring starter uses "otel.sdk.disabled" to disable the SDK, but this check is enabled + // by default - so it shouldn't impact the Spring starter. + if (!config.getBoolean("otel.javaagent.enabled", true)) { return sdkTracerProviderBuilder; } diff --git a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessorTest.groovy b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.groovy similarity index 88% rename from javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessorTest.groovy rename to sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.groovy index a76b0d1fb16d..614844069aea 100644 --- a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/AddThreadDetailsSpanProcessorTest.groovy +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.groovy @@ -3,10 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.tooling +package io.opentelemetry.instrumentation.tracer import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.tracer.AddThreadDetailsSpanProcessor import io.opentelemetry.sdk.trace.ReadWriteSpan import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes import spock.lang.Specification From 4e23c0b7a5f7b8e2f525d78233eab8019dbcaca6 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 15:08:41 +0200 Subject: [PATCH 03/18] make agent tracer available for spring starter --- .../AgentTracerProviderConfigurer.java | 32 +++++++++++++++++++ .../AgentTracerProviderConfigurer.java | 8 ++--- ...re.spi.AutoConfigurationCustomizerProvider | 1 - 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/AgentTracerProviderConfigurer.java rename {sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer => javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling}/AgentTracerProviderConfigurer.java (89%) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/AgentTracerProviderConfigurer.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/AgentTracerProviderConfigurer.java new file mode 100644 index 000000000000..b65a418b5439 --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/AgentTracerProviderConfigurer.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.threaddetails; + +import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; +import io.opentelemetry.instrumentation.tracer.AddThreadDetailsSpanProcessor; +import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +@ConditionalOnEnabledInstrumentation(module = "thread-details") +@Configuration +@SuppressWarnings("OtelPrivateConstructorForUtilityClass") +public class AgentTracerProviderConfigurer { + + @Bean + public AutoConfigurationCustomizerProvider otelCustomizer() { + return p -> + p.addTracerProviderCustomizer( + (builder, config) -> { + builder.addSpanProcessor(new AddThreadDetailsSpanProcessor()); + return builder; + }); + } +} diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java similarity index 89% rename from sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java index d22e7852b465..312fc27b7024 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AgentTracerProviderConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.tracer; +package io.opentelemetry.javaagent.tooling; import static io.opentelemetry.javaagent.tooling.AgentInstaller.JAVAAGENT_ENABLED_CONFIG; import static java.util.Collections.emptyList; @@ -11,6 +11,7 @@ import com.google.auto.service.AutoService; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.exporter.logging.LoggingSpanExporter; +import io.opentelemetry.instrumentation.tracer.AddThreadDetailsSpanProcessor; import io.opentelemetry.javaagent.tooling.config.AgentConfig; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; @@ -18,6 +19,7 @@ import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +@AutoService(AutoConfigurationCustomizerProvider.class) public class AgentTracerProviderConfigurer implements AutoConfigurationCustomizerProvider { private static final String ADD_THREAD_DETAILS = "otel.javaagent.add-thread-details"; @@ -30,9 +32,7 @@ public void customize(AutoConfigurationCustomizer autoConfigurationCustomizer) { @CanIgnoreReturnValue private static SdkTracerProviderBuilder configure( SdkTracerProviderBuilder sdkTracerProviderBuilder, ConfigProperties config) { - // Spring starter uses "otel.sdk.disabled" to disable the SDK, but this check is enabled - // by default - so it shouldn't impact the Spring starter. - if (!config.getBoolean("otel.javaagent.enabled", true)) { + if (!config.getBoolean(JAVAAGENT_ENABLED_CONFIG, true)) { return sdkTracerProviderBuilder; } diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider index 06a23709c1fc..3f8716ab23aa 100644 --- a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider +++ b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider @@ -1,2 +1 @@ io.opentelemetry.instrumentation.resources.ResourceProviderPropertiesCustomizer -io.opentelemetry.instrumentation.tracer.AgentTracerProviderConfigurer From f76cb926ae256731db6b831bcac6ef763602fd2d Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 15:18:34 +0200 Subject: [PATCH 04/18] Rename .groovy to .java --- ...rocessorTest.groovy => AddThreadDetailsSpanProcessorTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/{AddThreadDetailsSpanProcessorTest.groovy => AddThreadDetailsSpanProcessorTest.java} (100%) diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.groovy b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java similarity index 100% rename from sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.groovy rename to sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java From e5ece9c22766b6f3b61a21e18f96d75c34714c88 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 15:18:34 +0200 Subject: [PATCH 05/18] convert test to java --- .../AddThreadDetailsSpanProcessorTest.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java index 614844069aea..674d044c5b7d 100644 --- a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java @@ -3,33 +3,37 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.tracer +package io.opentelemetry.instrumentation.tracer; -import io.opentelemetry.context.Context -import io.opentelemetry.sdk.trace.ReadWriteSpan -import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes -import spock.lang.Specification +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; -class AddThreadDetailsSpanProcessorTest extends Specification { - def span = Mock(ReadWriteSpan) +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; +import org.junit.jupiter.api.Test; - def processor = new AddThreadDetailsSpanProcessor() +class AddThreadDetailsSpanProcessorTest { - def "should require onStart call"() { - expect: - processor.isStartRequired() - } + private ReadWriteSpan span = mock(ReadWriteSpan.class); + + private SpanProcessor spanProcessor = new AddThreadDetailsSpanProcessor(); - def "should set thread attributes on span start"() { - given: - def currentThreadName = Thread.currentThread().name - def currentThreadId = Thread.currentThread().id + @Test + void onStart() { + assertThat(spanProcessor.isStartRequired()).isTrue(); + } - when: - processor.onStart(Context.root(), span) + @Test + void setThreadAttributes() { + Thread thread = Thread.currentThread(); + spanProcessor.onStart(Context.root(), span); - then: - 1 * span.setAttribute(ThreadIncubatingAttributes.THREAD_ID, currentThreadId) - 1 * span.setAttribute(ThreadIncubatingAttributes.THREAD_NAME, currentThreadName) + verify(span).setAttribute(ThreadIncubatingAttributes.THREAD_ID, thread.getId()); + verify(span).setAttribute(ThreadIncubatingAttributes.THREAD_NAME, thread.getName()); + verifyNoMoreInteractions(span); } } From b01668c70a6dd076ea0c37e4dfd26c432fb1abb8 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 15:21:56 +0200 Subject: [PATCH 06/18] convert test to java --- .../tracer/AddThreadDetailsSpanProcessor.java | 14 +++++++++++--- .../tracer/AddThreadDetailsSpanProcessorTest.java | 4 ++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java index a53b0b943ad2..22935676873a 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java @@ -5,20 +5,28 @@ package io.opentelemetry.instrumentation.tracer; +import static io.opentelemetry.api.common.AttributeKey.longKey; +import static io.opentelemetry.api.common.AttributeKey.stringKey; + +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SpanProcessor; -import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; public class AddThreadDetailsSpanProcessor implements SpanProcessor { + // attributes are not stable yet + public static final AttributeKey THREAD_ID = longKey("thread.id"); + public static final AttributeKey THREAD_NAME = stringKey("thread.name"); + + @Override public void onStart(Context context, ReadWriteSpan span) { Thread currentThread = Thread.currentThread(); - span.setAttribute(ThreadIncubatingAttributes.THREAD_ID, currentThread.getId()); - span.setAttribute(ThreadIncubatingAttributes.THREAD_NAME, currentThread.getName()); + span.setAttribute(THREAD_ID, currentThread.getId()); + span.setAttribute(THREAD_NAME, currentThread.getName()); } @Override diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java index 674d044c5b7d..b7d00626e773 100644 --- a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java @@ -18,9 +18,9 @@ class AddThreadDetailsSpanProcessorTest { - private ReadWriteSpan span = mock(ReadWriteSpan.class); + private final ReadWriteSpan span = mock(ReadWriteSpan.class); - private SpanProcessor spanProcessor = new AddThreadDetailsSpanProcessor(); + private final SpanProcessor spanProcessor = new AddThreadDetailsSpanProcessor(); @Test void onStart() { From b35671b10ffb77ffcfb62b41bbbf8a0956d1e9cb Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 15:26:40 +0200 Subject: [PATCH 07/18] add test --- .../tracer/AddThreadDetailsSpanProcessor.java | 1 - .../AbstractOtelSpringStarterSmokeTest.java | 18 +++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java index 22935676873a..85d56699ef04 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java @@ -21,7 +21,6 @@ public class AddThreadDetailsSpanProcessor implements SpanProcessor { public static final AttributeKey THREAD_ID = longKey("thread.id"); public static final AttributeKey THREAD_NAME = stringKey("thread.name"); - @Override public void onStart(Context context, ReadWriteSpan span) { Thread currentThread = Thread.currentThread(); diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java index 6b277a222ea6..b93e0bbcfadd 100644 --- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java @@ -35,9 +35,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import org.assertj.core.api.AbstractCharSequenceAssert; import org.assertj.core.api.AbstractIterableAssert; import org.assertj.core.api.MapAssert; +import org.assertj.core.api.AbstractLongAssert; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -180,9 +182,7 @@ void shouldSendTelemetry() { UrlAttributes.URL_FULL, stringAssert -> stringAssert.endsWith("/ping")), equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - satisfies( - ServerAttributes.SERVER_PORT, - integerAssert -> integerAssert.isNotZero())), + satisfies(ServerAttributes.SERVER_PORT, AbstractLongAssert::isNotZero)), serverSpan -> HttpSpanDataAssert.create(serverSpan) .assertServerGetRequest("/ping") @@ -205,10 +205,14 @@ void shouldSendTelemetry() { equalTo( AttributeKey.stringArrayKey("http.request.header.key"), Collections.singletonList("value")), + satisfies(ServerAttributes.SERVER_PORT, AbstractLongAssert::isNotZero), + satisfies( + ThreadIncubatingAttributes.THREAD_ID, + AbstractLongAssert::isNotZero), satisfies( - ServerAttributes.SERVER_PORT, - integerAssert -> integerAssert.isNotZero())), - span -> withSpanAssert(span))); + ThreadIncubatingAttributes.THREAD_NAME, + AbstractCharSequenceAssert::isNotBlank)), + AbstractSpringStarterSmokeTest::withSpanAssert)); // Metric testing.waitAndAssertMetrics( @@ -307,7 +311,7 @@ void restTemplate() { span -> HttpSpanDataAssert.create(span).assertClientGetRequest("/ping"), span -> span.hasKind(SpanKind.SERVER).hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"), - span -> withSpanAssert(span))); + AbstractSpringStarterSmokeTest::withSpanAssert)); } @Test From 2690cabbcea016754eb50db0da1bb33488051fba Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 15:27:34 +0200 Subject: [PATCH 08/18] add test --- .../spring/smoketest/AbstractOtelSpringStarterSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java index b93e0bbcfadd..52c5092a3b93 100644 --- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java @@ -30,12 +30,12 @@ import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.opentelemetry.semconv.incubating.ServiceIncubatingAttributes; +import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import org.assertj.core.api.AbstractCharSequenceAssert; import org.assertj.core.api.AbstractIterableAssert; import org.assertj.core.api.MapAssert; From 36d12478f8e2f240fb7f36042e7f04b267b483fc Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 15:46:32 +0200 Subject: [PATCH 09/18] add test --- ...derConfigurer.java => ThreadDetailsAutoConfiguration.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/{AgentTracerProviderConfigurer.java => ThreadDetailsAutoConfiguration.java} (89%) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/AgentTracerProviderConfigurer.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/ThreadDetailsAutoConfiguration.java similarity index 89% rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/AgentTracerProviderConfigurer.java rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/ThreadDetailsAutoConfiguration.java index b65a418b5439..928cfec66c4b 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/AgentTracerProviderConfigurer.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/ThreadDetailsAutoConfiguration.java @@ -18,10 +18,10 @@ @ConditionalOnEnabledInstrumentation(module = "thread-details") @Configuration @SuppressWarnings("OtelPrivateConstructorForUtilityClass") -public class AgentTracerProviderConfigurer { +public class ThreadDetailsAutoConfiguration { @Bean - public AutoConfigurationCustomizerProvider otelCustomizer() { + public AutoConfigurationCustomizerProvider threadDetailOtelCustomizer() { return p -> p.addTracerProviderCustomizer( (builder, config) -> { From adb24abcd0fe4c1724a901578a6720daef59b0a7 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 16:05:19 +0200 Subject: [PATCH 10/18] add bean --- .../src/main/resources/META-INF/spring.factories | 3 ++- ...pringframework.boot.autoconfigure.AutoConfiguration.imports | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index cb026785d354..641cc563d235 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -13,7 +13,8 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.w io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.scheduling.SpringSchedulingInstrumentationAutoConfiguration,\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration,\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider,\ -io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider +io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider,\ +io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.threaddetails.ThreadDetailsAutoConfiguration org.springframework.context.ApplicationListener=\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging.LogbackAppenderApplicationListener diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 2392e0c35592..0d036e00b354 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -14,3 +14,4 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.s io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider +io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.threaddetails.ThreadDetailsAutoConfiguration From 16a0ed56bcc0f97ed66fdf8ae60e37743dd7bdf9 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 24 Jun 2025 16:27:47 +0200 Subject: [PATCH 11/18] rename package --- .../ThreadDetailsAutoConfiguration.java | 4 ++-- .../src/main/resources/META-INF/spring.factories | 2 +- ...ringframework.boot.autoconfigure.AutoConfiguration.imports | 2 +- .../javaagent/tooling/AgentTracerProviderConfigurer.java | 2 +- .../{tracer => thread}/AddThreadDetailsSpanProcessor.java | 2 +- .../{tracer => thread}/AddThreadDetailsSpanProcessorTest.java | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/{threaddetails => thread}/ThreadDetailsAutoConfiguration.java (91%) rename sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/{tracer => thread}/AddThreadDetailsSpanProcessor.java (96%) rename sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/{tracer => thread}/AddThreadDetailsSpanProcessorTest.java (95%) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/ThreadDetailsAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/thread/ThreadDetailsAutoConfiguration.java similarity index 91% rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/ThreadDetailsAutoConfiguration.java rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/thread/ThreadDetailsAutoConfiguration.java index 928cfec66c4b..24ffc73a970a 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/threaddetails/ThreadDetailsAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/thread/ThreadDetailsAutoConfiguration.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.threaddetails; +package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.thread; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; -import io.opentelemetry.instrumentation.tracer.AddThreadDetailsSpanProcessor; +import io.opentelemetry.instrumentation.thread.AddThreadDetailsSpanProcessor; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index 641cc563d235..aa3f1300ec31 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -14,7 +14,7 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.s io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration,\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider,\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider,\ -io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.threaddetails.ThreadDetailsAutoConfiguration +io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.thread.ThreadDetailsAutoConfiguration org.springframework.context.ApplicationListener=\ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging.LogbackAppenderApplicationListener diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 0d036e00b354..e8c5e8a83d7a 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -14,4 +14,4 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.s io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider -io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.threaddetails.ThreadDetailsAutoConfiguration +io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.thread.ThreadDetailsAutoConfiguration diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java index 312fc27b7024..a77b4e585863 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java @@ -11,7 +11,7 @@ import com.google.auto.service.AutoService; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.exporter.logging.LoggingSpanExporter; -import io.opentelemetry.instrumentation.tracer.AddThreadDetailsSpanProcessor; +import io.opentelemetry.instrumentation.thread.AddThreadDetailsSpanProcessor; import io.opentelemetry.javaagent.tooling.config.AgentConfig; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/AddThreadDetailsSpanProcessor.java similarity index 96% rename from sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java rename to sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/AddThreadDetailsSpanProcessor.java index 85d56699ef04..33f033edf4f5 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessor.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/AddThreadDetailsSpanProcessor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.tracer; +package io.opentelemetry.instrumentation.thread; import static io.opentelemetry.api.common.AttributeKey.longKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/AddThreadDetailsSpanProcessorTest.java similarity index 95% rename from sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java rename to sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/AddThreadDetailsSpanProcessorTest.java index b7d00626e773..a0bcea8daf9d 100644 --- a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/tracer/AddThreadDetailsSpanProcessorTest.java +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/AddThreadDetailsSpanProcessorTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.tracer; +package io.opentelemetry.instrumentation.thread; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; From 5ce6affb0d98a06784fe5a441cbfe440951b3f85 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 25 Jun 2025 08:04:16 +0200 Subject: [PATCH 12/18] format --- .../spring/smoketest/AbstractOtelSpringStarterSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java index 52c5092a3b93..3ef2bd5f0215 100644 --- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java @@ -38,8 +38,8 @@ import java.util.List; import org.assertj.core.api.AbstractCharSequenceAssert; import org.assertj.core.api.AbstractIterableAssert; -import org.assertj.core.api.MapAssert; import org.assertj.core.api.AbstractLongAssert; +import org.assertj.core.api.MapAssert; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; From 9cb607bed5feecd34ccb6b4674515497dfd528f1 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 25 Jun 2025 12:47:18 +0200 Subject: [PATCH 13/18] add thread details customizer provider --- sdk-autoconfigure-support/build.gradle.kts | 1 + .../ThreadDetailsComponentProvider.java | 22 ++++++++++++++++ ...etailsConfigurationCustomizerProvider.java | 24 +++++++++++++++++ ...toconfigure.spi.internal.ComponentProvider | 1 + ...DeclarativeConfigurationCustomizerProvider | 1 + ...lsConfigurationCustomizerProviderTest.java | 26 +++++++++++++++++++ 6 files changed, 75 insertions(+) create mode 100644 sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java create mode 100644 sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java create mode 100644 sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider create mode 100644 sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider create mode 100644 sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java diff --git a/sdk-autoconfigure-support/build.gradle.kts b/sdk-autoconfigure-support/build.gradle.kts index c2948406f7e1..cf9be9f90a7d 100644 --- a/sdk-autoconfigure-support/build.gradle.kts +++ b/sdk-autoconfigure-support/build.gradle.kts @@ -7,6 +7,7 @@ group = "io.opentelemetry.instrumentation" dependencies { api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") + api("io.opentelemetry:opentelemetry-sdk-extension-incubator") compileOnly("com.google.code.findbugs:annotations") testCompileOnly("com.google.code.findbugs:annotations") diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java new file mode 100644 index 000000000000..4acb28389f6e --- /dev/null +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java @@ -0,0 +1,22 @@ +package io.opentelemetry.instrumentation.thread; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.trace.SpanProcessor; + +public class ThreadDetailsComponentProvider implements ComponentProvider { + @Override + public String getName() { + return "thread_details"; + } + + @Override + public SpanProcessor create(DeclarativeConfigProperties config) { + return new AddThreadDetailsSpanProcessor(); + } + + @Override + public Class getType() { + return SpanProcessor.class; + } +} diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java new file mode 100644 index 000000000000..06ca18942410 --- /dev/null +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java @@ -0,0 +1,24 @@ +package io.opentelemetry.instrumentation.thread; + +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; + +public class ThreadDetailsConfigurationCustomizerProvider + implements DeclarativeConfigurationCustomizerProvider { + @Override + public void customize(DeclarativeConfigurationCustomizer customizer) { + customizer.addModelCustomizer( + model -> { + TracerProviderModel tracerProvider = model.getTracerProvider(); + if (tracerProvider == null) { + return model; + } + tracerProvider + .getProcessors() + .add(new SpanProcessorModel().withAdditionalProperty("thread_details", null)); + return model; + }); + } +} diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider new file mode 100644 index 000000000000..4c301010489b --- /dev/null +++ b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider @@ -0,0 +1 @@ +io.opentelemetry.instrumentation.thread.ThreadDetailsComponentProvider diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider new file mode 100644 index 000000000000..e61bd7ffd0f9 --- /dev/null +++ b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider @@ -0,0 +1 @@ +io.opentelemetry.instrumentation.thread.ThreadDetailsConfigurationCustomizerProvider diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java new file mode 100644 index 000000000000..d8ec040d9912 --- /dev/null +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java @@ -0,0 +1,26 @@ +package io.opentelemetry.instrumentation.thread; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationBuilder; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; +import org.junit.jupiter.api.Test; + +class ThreadDetailsConfigurationCustomizerProviderTest { + + @Test + void addSpanProcessor() { + OpenTelemetryConfigurationModel model = + new DeclarativeConfigurationBuilder().customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("0.4") + .withTracerProvider(new TracerProviderModel())); + + try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { + assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); + } + } +} From 369a6b7222ae8880e208c65f0a3bf44382cd4e14 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 25 Jun 2025 13:39:00 +0200 Subject: [PATCH 14/18] rename to agent tracer customizer - it's not reusable --- .../tooling/AgentTracerComponentProvider.java | 7 +++-- .../AgentTracerCustomizerProvider.java | 15 +++++++++-- .../AgentTracerComponentProviderTest.java | 25 ++++++++++++++++++ ...toconfigure.spi.internal.ComponentProvider | 1 - ...DeclarativeConfigurationCustomizerProvider | 1 - ...lsConfigurationCustomizerProviderTest.java | 26 ------------------- 6 files changed, 43 insertions(+), 32 deletions(-) rename sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java => javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java (63%) rename sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java => javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java (54%) create mode 100644 javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java delete mode 100644 sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider delete mode 100644 sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider delete mode 100644 sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java similarity index 63% rename from sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java index 4acb28389f6e..8cfd4259febd 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java @@ -1,10 +1,13 @@ -package io.opentelemetry.instrumentation.thread; +package io.opentelemetry.javaagent.tooling; +import com.google.auto.service.AutoService; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.instrumentation.thread.AddThreadDetailsSpanProcessor; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.trace.SpanProcessor; -public class ThreadDetailsComponentProvider implements ComponentProvider { +@AutoService(ComponentProvider.class) +public class AgentTracerComponentProvider implements ComponentProvider { @Override public String getName() { return "thread_details"; diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java similarity index 54% rename from sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java index 06ca18942410..003378f476bb 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java @@ -1,11 +1,15 @@ -package io.opentelemetry.instrumentation.thread; +package io.opentelemetry.javaagent.tooling; +import com.google.auto.service.AutoService; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; -public class ThreadDetailsConfigurationCustomizerProvider +@AutoService(DeclarativeConfigurationCustomizerProvider.class) +public class AgentTracerCustomizerProvider implements DeclarativeConfigurationCustomizerProvider { @Override public void customize(DeclarativeConfigurationCustomizer customizer) { @@ -15,6 +19,13 @@ public void customize(DeclarativeConfigurationCustomizer customizer) { if (tracerProvider == null) { return model; } + InstrumentationModel instrumentationModel = model.getInstrumentationDevelopment(); + ExperimentalLanguageSpecificInstrumentationModel java = instrumentationModel.getJava(); + // todo how to get the "add_thread_details" from the config? + // do we need a ConfigProvider? + + // todo also add logging like in AgentTracerProviderConfigurer + tracerProvider .getProcessors() .add(new SpanProcessorModel().withAdditionalProperty("thread_details", null)); diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java new file mode 100644 index 000000000000..6d64ee486918 --- /dev/null +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java @@ -0,0 +1,25 @@ +package io.opentelemetry.javaagent.tooling; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationBuilder; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; +import org.junit.jupiter.api.Test; + +class AgentTracerComponentProviderTest { + @Test + void addSpanProcessor() { + OpenTelemetryConfigurationModel model = + new DeclarativeConfigurationBuilder().customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("0.4") + .withTracerProvider(new TracerProviderModel())); + + try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { + assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); + } + } +} diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider deleted file mode 100644 index 4c301010489b..000000000000 --- a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.instrumentation.thread.ThreadDetailsComponentProvider diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider deleted file mode 100644 index e61bd7ffd0f9..000000000000 --- a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.instrumentation.thread.ThreadDetailsConfigurationCustomizerProvider diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java deleted file mode 100644 index d8ec040d9912..000000000000 --- a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.opentelemetry.instrumentation.thread; - -import static org.assertj.core.api.Assertions.assertThat; - -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; -import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationBuilder; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; -import org.junit.jupiter.api.Test; - -class ThreadDetailsConfigurationCustomizerProviderTest { - - @Test - void addSpanProcessor() { - OpenTelemetryConfigurationModel model = - new DeclarativeConfigurationBuilder().customizeModel( - new OpenTelemetryConfigurationModel() - .withFileFormat("0.4") - .withTracerProvider(new TracerProviderModel())); - - try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { - assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); - } - } -} From 7374e5cce03e92cc654d9cfb6f52de75e45979c2 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 25 Jun 2025 13:47:32 +0200 Subject: [PATCH 15/18] agent tracer customizer --- .../tooling/AgentTracerComponentProvider.java | 6 +++++ .../AgentTracerCustomizerProvider.java | 16 +++++++----- .../AgentTracerComponentProviderTest.java | 26 ++++++++++++------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java index 8cfd4259febd..78f8d84f34ad 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.tooling; import com.google.auto.service.AutoService; @@ -6,6 +11,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.trace.SpanProcessor; +@SuppressWarnings("rawtypes") @AutoService(ComponentProvider.class) public class AgentTracerComponentProvider implements ComponentProvider { @Override diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java index 003378f476bb..95682c32882e 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java @@ -1,16 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.tooling; import com.google.auto.service.AutoService; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; @AutoService(DeclarativeConfigurationCustomizerProvider.class) -public class AgentTracerCustomizerProvider - implements DeclarativeConfigurationCustomizerProvider { +public class AgentTracerCustomizerProvider implements DeclarativeConfigurationCustomizerProvider { @Override public void customize(DeclarativeConfigurationCustomizer customizer) { customizer.addModelCustomizer( @@ -19,8 +21,10 @@ public void customize(DeclarativeConfigurationCustomizer customizer) { if (tracerProvider == null) { return model; } - InstrumentationModel instrumentationModel = model.getInstrumentationDevelopment(); - ExperimentalLanguageSpecificInstrumentationModel java = instrumentationModel.getJava(); + // InstrumentationModel instrumentationModel = + // model.getInstrumentationDevelopment(); + // ExperimentalLanguageSpecificInstrumentationModel java = + // instrumentationModel.getJava(); // todo how to get the "add_thread_details" from the config? // do we need a ConfigProvider? diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java index 6d64ee486918..22eede400bf7 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.tooling; import static org.assertj.core.api.Assertions.assertThat; @@ -11,15 +16,16 @@ class AgentTracerComponentProviderTest { @Test - void addSpanProcessor() { - OpenTelemetryConfigurationModel model = - new DeclarativeConfigurationBuilder().customizeModel( - new OpenTelemetryConfigurationModel() - .withFileFormat("0.4") - .withTracerProvider(new TracerProviderModel())); + void addSpanProcessor() { + OpenTelemetryConfigurationModel model = + new DeclarativeConfigurationBuilder() + .customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("0.4") + .withTracerProvider(new TracerProviderModel())); - try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { - assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); - } - } + try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { + assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); + } + } } From 0e6cf7e800c4a65e85d89708587239d44e749723 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 25 Jun 2025 16:18:39 +0200 Subject: [PATCH 16/18] agent tracer customizer --- .../AgentTracerCustomizerProvider.java | 34 +++++++++++++------ ...va => ThreadDetailsComponentProvider.java} | 2 +- 2 files changed, 24 insertions(+), 12 deletions(-) rename javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/{AgentTracerComponentProvider.java => ThreadDetailsComponentProvider.java} (90%) diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java index 95682c32882e..d569e2d8126c 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java @@ -6,8 +6,10 @@ package io.opentelemetry.javaagent.tooling; import com.google.auto.service.AutoService; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; @@ -17,22 +19,32 @@ public class AgentTracerCustomizerProvider implements DeclarativeConfigurationCu public void customize(DeclarativeConfigurationCustomizer customizer) { customizer.addModelCustomizer( model -> { - TracerProviderModel tracerProvider = model.getTracerProvider(); - if (tracerProvider == null) { + DeclarativeConfigProperties properties = + SdkConfigProvider.create(model).getInstrumentationConfig(); + if (properties == null) { + properties = DeclarativeConfigProperties.empty(); + } + DeclarativeConfigProperties java = + properties.getStructured("java", DeclarativeConfigProperties.empty()); + if (!java.getBoolean("enabled", true)) { + // todo extract this logic to a common place + // todo should this be pulled out or to be reusable by spring? return model; } - // InstrumentationModel instrumentationModel = - // model.getInstrumentationDevelopment(); - // ExperimentalLanguageSpecificInstrumentationModel java = - // instrumentationModel.getJava(); - // todo how to get the "add_thread_details" from the config? - // do we need a ConfigProvider? + + if (java.getStructured("thread_details", DeclarativeConfigProperties.empty()) + .getBoolean("enabled", true)) { + TracerProviderModel tracerProvider = model.getTracerProvider(); + if (tracerProvider != null) { + tracerProvider + .getProcessors() + .add(new SpanProcessorModel().withAdditionalProperty("thread_details", null)); + } + } + // todo also add logging like in AgentTracerProviderConfigurer - tracerProvider - .getProcessors() - .add(new SpanProcessorModel().withAdditionalProperty("thread_details", null)); return model; }); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ThreadDetailsComponentProvider.java similarity index 90% rename from javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ThreadDetailsComponentProvider.java index 78f8d84f34ad..035f1aec7a54 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ThreadDetailsComponentProvider.java @@ -13,7 +13,7 @@ @SuppressWarnings("rawtypes") @AutoService(ComponentProvider.class) -public class AgentTracerComponentProvider implements ComponentProvider { +public class ThreadDetailsComponentProvider implements ComponentProvider { @Override public String getName() { return "thread_details"; From 02939ddfdfec36538f24a029d49fbebab7c59a5a Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 25 Jun 2025 18:28:32 +0200 Subject: [PATCH 17/18] agent tracer customizer --- ...LoggingSpanExporterCustomizerProvider.java | 6 +-- .../ThreadDetailsComponentProvider.java | 6 +-- .../ThreadDetailsCustomizerProvider.java | 49 +++++++++++++++++++ ...toconfigure.spi.internal.ComponentProvider | 1 + ...DeclarativeConfigurationCustomizerProvider | 2 + ...lsConfigurationCustomizerProviderTest.java | 19 +++---- 6 files changed, 62 insertions(+), 21 deletions(-) rename javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java => sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java (88%) rename {javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling => sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread}/ThreadDetailsComponentProvider.java (74%) create mode 100644 sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java create mode 100644 sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider create mode 100644 sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider rename javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java => sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java (65%) diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java similarity index 88% rename from javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java rename to sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java index d569e2d8126c..657e63968f84 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerCustomizerProvider.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java @@ -3,9 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.tooling; +package io.opentelemetry.instrumentation.sdk; -import com.google.auto.service.AutoService; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; @@ -13,8 +12,7 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; -@AutoService(DeclarativeConfigurationCustomizerProvider.class) -public class AgentTracerCustomizerProvider implements DeclarativeConfigurationCustomizerProvider { +public class LoggingSpanExporterCustomizerProvider implements DeclarativeConfigurationCustomizerProvider { @Override public void customize(DeclarativeConfigurationCustomizer customizer) { customizer.addModelCustomizer( diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ThreadDetailsComponentProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java similarity index 74% rename from javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ThreadDetailsComponentProvider.java rename to sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java index 035f1aec7a54..684f2ba6acab 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ThreadDetailsComponentProvider.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsComponentProvider.java @@ -3,16 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.tooling; +package io.opentelemetry.instrumentation.thread; -import com.google.auto.service.AutoService; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.instrumentation.thread.AddThreadDetailsSpanProcessor; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.trace.SpanProcessor; -@SuppressWarnings("rawtypes") -@AutoService(ComponentProvider.class) public class ThreadDetailsComponentProvider implements ComponentProvider { @Override public String getName() { diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java new file mode 100644 index 000000000000..4fb2ad228344 --- /dev/null +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.thread; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; + +public class ThreadDetailsCustomizerProvider implements DeclarativeConfigurationCustomizerProvider { + @Override + public void customize(DeclarativeConfigurationCustomizer customizer) { + customizer.addModelCustomizer( + model -> { + DeclarativeConfigProperties properties = + SdkConfigProvider.create(model).getInstrumentationConfig(); + if (properties == null) { + properties = DeclarativeConfigProperties.empty(); + } + DeclarativeConfigProperties java = + properties.getStructured("java", DeclarativeConfigProperties.empty()); + if (!java.getBoolean("enabled", true)) { + // todo extract this logic to a common place + // todo should this be pulled out or to be reusable by spring? + return model; + } + + if (java.getStructured("thread_details", DeclarativeConfigProperties.empty()) + .getBoolean("enabled", true)) { + TracerProviderModel tracerProvider = model.getTracerProvider(); + if (tracerProvider != null) { + tracerProvider + .getProcessors() + .add(new SpanProcessorModel().withAdditionalProperty("thread_details", null)); + } + } + + + // todo also add logging like in AgentTracerProviderConfigurer + + return model; + }); + } +} diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider new file mode 100644 index 000000000000..4c301010489b --- /dev/null +++ b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider @@ -0,0 +1 @@ +io.opentelemetry.instrumentation.thread.ThreadDetailsComponentProvider diff --git a/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider new file mode 100644 index 000000000000..2b0e55824d87 --- /dev/null +++ b/sdk-autoconfigure-support/src/main/resources/META-INF/services/io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider @@ -0,0 +1,2 @@ +io.opentelemetry.instrumentation.thread.ThreadDetailsCustomizerProvider +io.opentelemetry.instrumentation.sdk.LoggingSpanExporterCustomizerProvider diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java similarity index 65% rename from javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java rename to sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java index 22eede400bf7..d8ec040d9912 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/AgentTracerComponentProviderTest.java +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java @@ -1,9 +1,4 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling; +package io.opentelemetry.instrumentation.thread; import static org.assertj.core.api.Assertions.assertThat; @@ -14,15 +9,15 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; import org.junit.jupiter.api.Test; -class AgentTracerComponentProviderTest { +class ThreadDetailsConfigurationCustomizerProviderTest { + @Test void addSpanProcessor() { OpenTelemetryConfigurationModel model = - new DeclarativeConfigurationBuilder() - .customizeModel( - new OpenTelemetryConfigurationModel() - .withFileFormat("0.4") - .withTracerProvider(new TracerProviderModel())); + new DeclarativeConfigurationBuilder().customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("0.4") + .withTracerProvider(new TracerProviderModel())); try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); From cc02a7c6565759b2ef36fabdb003c7b2bbfaf617 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Wed, 25 Jun 2025 16:34:06 +0000 Subject: [PATCH 18/18] ./gradlew spotlessApply --- .../sdk/LoggingSpanExporterCustomizerProvider.java | 4 ++-- .../thread/ThreadDetailsCustomizerProvider.java | 1 - ...DetailsConfigurationCustomizerProviderTest.java | 14 ++++++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java index 657e63968f84..368f0ec17e3c 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/sdk/LoggingSpanExporterCustomizerProvider.java @@ -12,7 +12,8 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; -public class LoggingSpanExporterCustomizerProvider implements DeclarativeConfigurationCustomizerProvider { +public class LoggingSpanExporterCustomizerProvider + implements DeclarativeConfigurationCustomizerProvider { @Override public void customize(DeclarativeConfigurationCustomizer customizer) { customizer.addModelCustomizer( @@ -40,7 +41,6 @@ public void customize(DeclarativeConfigurationCustomizer customizer) { } } - // todo also add logging like in AgentTracerProviderConfigurer return model; diff --git a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java index 4fb2ad228344..a498c8e90b3b 100644 --- a/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/ThreadDetailsCustomizerProvider.java @@ -40,7 +40,6 @@ public void customize(DeclarativeConfigurationCustomizer customizer) { } } - // todo also add logging like in AgentTracerProviderConfigurer return model; diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java index d8ec040d9912..b415a29e0217 100644 --- a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/ThreadDetailsConfigurationCustomizerProviderTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.thread; import static org.assertj.core.api.Assertions.assertThat; @@ -14,10 +19,11 @@ class ThreadDetailsConfigurationCustomizerProviderTest { @Test void addSpanProcessor() { OpenTelemetryConfigurationModel model = - new DeclarativeConfigurationBuilder().customizeModel( - new OpenTelemetryConfigurationModel() - .withFileFormat("0.4") - .withTracerProvider(new TracerProviderModel())); + new DeclarativeConfigurationBuilder() + .customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("0.4") + .withTracerProvider(new TracerProviderModel())); try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor");