From 2e5f22a24a0a91cb6f45e79f9851b1daa3bbeb97 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 1 Sep 2025 16:59:44 +0200 Subject: [PATCH 1/5] add thread details resource processor --- sdk-autoconfigure-support/build.gradle.kts | 1 + .../ThreadDetailsComponentProvider.java | 31 ++++++++++++ .../ThreadDetailsCustomizerProvider.java | 48 +++++++++++++++++++ ...toconfigure.spi.internal.ComponentProvider | 1 + ...DeclarativeConfigurationCustomizerProvider | 1 + ...lsConfigurationCustomizerProviderTest.java | 32 +++++++++++++ 6 files changed, 114 insertions(+) create mode 100644 sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsComponentProvider.java create mode 100644 sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/internal/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 create mode 100644 sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java diff --git a/sdk-autoconfigure-support/build.gradle.kts b/sdk-autoconfigure-support/build.gradle.kts index c2948406f7..cf9be9f90a 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/internal/ThreadDetailsComponentProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsComponentProvider.java new file mode 100644 index 0000000000..9f63ef6326 --- /dev/null +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsComponentProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.thread.internal; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.trace.SpanProcessor; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +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/internal/ThreadDetailsCustomizerProvider.java b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsCustomizerProvider.java new file mode 100644 index 0000000000..853780e045 --- /dev/null +++ b/sdk-autoconfigure-support/src/main/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsCustomizerProvider.java @@ -0,0 +1,48 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.thread.internal; + +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.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public class ThreadDetailsCustomizerProvider implements DeclarativeConfigurationCustomizerProvider { + @Override + public void customize(DeclarativeConfigurationCustomizer customizer) { + customizer.addModelCustomizer( + model -> { + TracerProviderModel tracerProvider = model.getTracerProvider(); + if (tracerProvider != null && isEnabled(model)) { + tracerProvider + .getProcessors() + .add(new SpanProcessorModel().withAdditionalProperty("thread_details", null)); + } + + return model; + }); + } + + private static boolean isEnabled(OpenTelemetryConfigurationModel model) { + DeclarativeConfigProperties properties = + SdkConfigProvider.create(model).getInstrumentationConfig(); + if (properties == null) { + return false; + } + DeclarativeConfigProperties java = + properties.getStructured("java", DeclarativeConfigProperties.empty()); + + return java.getStructured("thread_details", DeclarativeConfigProperties.empty()) + .getBoolean("enabled", false); + } +} 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 0000000000..ff5788b437 --- /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.internal.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 0000000000..5f285454fb --- /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.internal.ThreadDetailsCustomizerProvider diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java new file mode 100644 index 0000000000..c730412f95 --- /dev/null +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.thread.internal; + +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("1.0-rc.1") + .withTracerProvider(new TracerProviderModel())); + + try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { + assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); + } + } +} From 4b817846623e331f0402446eb2615bca5c48728c Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 1 Sep 2025 17:32:14 +0200 Subject: [PATCH 2/5] view config is now being loaded and "a" is not a valid value --- .../internal/properties/SpringConfigPropertiesTest.java | 1 - .../src/test/resources/application.yaml | 3 --- 2 files changed, 4 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java index 9754ccb3b7..02433342b1 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java @@ -105,7 +105,6 @@ class SpringConfigPropertiesTest { public static Stream listProperties() { return Stream.of( - Arguments.of("otel.experimental.metrics.view.config", Arrays.asList("a", "b")), Arguments.of("otel.experimental.resource.disabled.keys", Arrays.asList("a", "b")), Arguments.of("otel.propagators", Arrays.asList("baggage", "b3")), Arguments.of("otel.logs.exporter", Collections.singletonList("console")), diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml index c9485005a6..bfbad4f868 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml @@ -1,8 +1,5 @@ otel: experimental: - metrics: - view: - config: [ a,b ] resource: disabled: keys: [ a,b ] From 24185682be60381f6554bb048ff320189fe595de Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 1 Sep 2025 18:27:07 +0200 Subject: [PATCH 3/5] set enabled in test --- ...eadDetailsConfigurationCustomizerProviderTest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java index c730412f95..f39c4e509b 100644 --- a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java @@ -5,11 +5,14 @@ package io.opentelemetry.instrumentation.thread.internal; +import static java.util.Collections.singletonMap; 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.ExperimentalLanguageSpecificInstrumentationModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel; 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; @@ -23,7 +26,13 @@ class ThreadDetailsConfigurationCustomizerProviderTest { .customizeModel( new OpenTelemetryConfigurationModel() .withFileFormat("1.0-rc.1") - .withTracerProvider(new TracerProviderModel())); + .withTracerProvider(new TracerProviderModel()) + .withInstrumentationDevelopment( + new InstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "thread_details", singletonMap("enabled", true))))); try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); From e7b4370d83a9b4378837c9ca951a1d625e6fc3d6 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 1 Sep 2025 18:30:32 +0200 Subject: [PATCH 4/5] set enabled in test --- ...lsConfigurationCustomizerProviderTest.java | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java index f39c4e509b..bf63869e2d 100644 --- a/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java +++ b/sdk-autoconfigure-support/src/test/java/io/opentelemetry/instrumentation/thread/internal/ThreadDetailsConfigurationCustomizerProviderTest.java @@ -19,23 +19,38 @@ import org.junit.jupiter.api.Test; class ThreadDetailsConfigurationCustomizerProviderTest { + static final String PROCESSOR = "AddThreadDetailsSpanProcessor"; + @Test - void addSpanProcessor() { - OpenTelemetryConfigurationModel model = - new DeclarativeConfigurationBuilder() - .customizeModel( - new OpenTelemetryConfigurationModel() - .withFileFormat("1.0-rc.1") - .withTracerProvider(new TracerProviderModel()) - .withInstrumentationDevelopment( - new InstrumentationModel() - .withJava( - new ExperimentalLanguageSpecificInstrumentationModel() - .withAdditionalProperty( - "thread_details", singletonMap("enabled", true))))); + void disabledByDefault() { + OpenTelemetryConfigurationModel model = modelWithTracer(); try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { - assertThat(sdk.toString()).containsOnlyOnce("AddThreadDetailsSpanProcessor"); + assertThat(sdk.toString()).doesNotContain(PROCESSOR); } } + + @Test + void enabled() { + OpenTelemetryConfigurationModel model = + modelWithTracer() + .withInstrumentationDevelopment( + new InstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "thread_details", singletonMap("enabled", true)))); + + try (OpenTelemetrySdk sdk = DeclarativeConfiguration.create(model)) { + assertThat(sdk.toString()).containsOnlyOnce(PROCESSOR); + } + } + + private static OpenTelemetryConfigurationModel modelWithTracer() { + return new DeclarativeConfigurationBuilder() + .customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("1.0-rc.1") + .withTracerProvider(new TracerProviderModel())); + } } From 72df93ddb598bdb9b777ca94f0d8ea926705b155 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 9 Sep 2025 12:57:15 +0200 Subject: [PATCH 5/5] pr review --- .../internal/properties/SpringConfigPropertiesTest.java | 1 + .../src/test/resources/application.yaml | 3 +++ sdk-autoconfigure-support/build.gradle.kts | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java index 02433342b1..9754ccb3b7 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/SpringConfigPropertiesTest.java @@ -105,6 +105,7 @@ class SpringConfigPropertiesTest { public static Stream listProperties() { return Stream.of( + Arguments.of("otel.experimental.metrics.view.config", Arrays.asList("a", "b")), Arguments.of("otel.experimental.resource.disabled.keys", Arrays.asList("a", "b")), Arguments.of("otel.propagators", Arrays.asList("baggage", "b3")), Arguments.of("otel.logs.exporter", Collections.singletonList("console")), diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml index bfbad4f868..c9485005a6 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yaml @@ -1,5 +1,8 @@ otel: experimental: + metrics: + view: + config: [ a,b ] resource: disabled: keys: [ a,b ] diff --git a/sdk-autoconfigure-support/build.gradle.kts b/sdk-autoconfigure-support/build.gradle.kts index cf9be9f90a..d82b1b6c21 100644 --- a/sdk-autoconfigure-support/build.gradle.kts +++ b/sdk-autoconfigure-support/build.gradle.kts @@ -7,7 +7,8 @@ group = "io.opentelemetry.instrumentation" dependencies { api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") - api("io.opentelemetry:opentelemetry-sdk-extension-incubator") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator") compileOnly("com.google.code.findbugs:annotations") testCompileOnly("com.google.code.findbugs:annotations")