From 18d7b03ad3a368c64c5f427ab949d7a335edf18f Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 17 Dec 2025 07:58:37 +0100 Subject: [PATCH 01/14] feat: add method to retrieve instrumentation configuration by name --- .../api/incubator/config/ConfigProvider.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 70717e76e40..ddc48cddf92 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -5,6 +5,8 @@ package io.opentelemetry.api.incubator.config; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + import javax.annotation.concurrent.ThreadSafe; /** @@ -28,6 +30,22 @@ public interface ConfigProvider { */ DeclarativeConfigProperties getInstrumentationConfig(); + /** + * Returns the {@link DeclarativeConfigProperties} for a specific instrumentation by name. If no + * configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is + * returned. + * + * @param name the name of the instrumentation + * @return the {@link DeclarativeConfigProperties} for the given instrumentation name + */ + default DeclarativeConfigProperties get(String name) { + DeclarativeConfigProperties config = getInstrumentationConfig(); + if (config == null) { + return empty(); + } + return config.getStructured("java", empty()).getStructured(name, empty()); + } + /** Returns a no-op {@link ConfigProvider}. */ static ConfigProvider noop() { return DeclarativeConfigProperties::empty; From cefce5d47820640fdd6791ea8c4d2f415f50562d Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 17 Dec 2025 08:11:13 +0100 Subject: [PATCH 02/14] add test --- .../sdk/autoconfigure/DeclarativeConfigurationTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 88bdb322b26..21573308127 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -224,5 +224,8 @@ void configFile_ConfigProvider() { assertThat(InstrumentationConfigUtil.javaInstrumentationConfig(globalConfigProvider, "example")) .isNotNull() .satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value")); + + // shortcut to get specific instrumentation config + assertThat(globalConfigProvider.get("example").getString("key")).isEqualTo("value"); } } From afdc8669b2dbf78453bbf4d0e0c99b11a698ff48 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 18 Dec 2025 12:42:46 +0100 Subject: [PATCH 03/14] pr review --- .../io/opentelemetry/api/incubator/config/ConfigProvider.java | 2 +- .../sdk/autoconfigure/DeclarativeConfigurationTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index ddc48cddf92..13057adc8df 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -38,7 +38,7 @@ public interface ConfigProvider { * @param name the name of the instrumentation * @return the {@link DeclarativeConfigProperties} for the given instrumentation name */ - default DeclarativeConfigProperties get(String name) { + default DeclarativeConfigProperties getJavaInstrumentationConfig(String name) { DeclarativeConfigProperties config = getInstrumentationConfig(); if (config == null) { return empty(); diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 21573308127..9bd71b3d802 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -226,6 +226,7 @@ void configFile_ConfigProvider() { .satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value")); // shortcut to get specific instrumentation config - assertThat(globalConfigProvider.get("example").getString("key")).isEqualTo("value"); + assertThat(globalConfigProvider.getJavaInstrumentationConfig("example").getString("key")) + .isEqualTo("value"); } } From ef36c5f80672e69703fd66210ad8ead475b850d1 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 19 Dec 2025 11:29:17 +0100 Subject: [PATCH 04/14] feat: add method to retrieve general instrumentation configuration by name --- .../api/incubator/config/ConfigProvider.java | 17 +++++++++++++++++ .../api/incubator/ConfigProviderTest.java | 8 ++++++++ .../DeclarativeConfigurationTest.java | 9 ++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 13057adc8df..9df0a051c60 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -46,6 +46,23 @@ default DeclarativeConfigProperties getJavaInstrumentationConfig(String name) { return config.getStructured("java", empty()).getStructured(name, empty()); } + /** + * Returns the {@link DeclarativeConfigProperties} for general instrumentation config by name. If + * no configuration is available for the given name, an empty {@link DeclarativeConfigProperties} + * is returned. + * + * @param name the name of the general instrumentation config + * @return the {@link DeclarativeConfigProperties} for the given general instrumentation config + * name + */ + default DeclarativeConfigProperties getGeneralInstrumentationConfig(String name) { + DeclarativeConfigProperties config = getInstrumentationConfig(); + if (config == null) { + return empty(); + } + return config.getStructured("general", empty()).getStructured(name, empty()); + } + /** Returns a no-op {@link ConfigProvider}. */ static ConfigProvider noop() { return DeclarativeConfigProperties::empty; diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java index 9c9e4bf41e1..6ae0a54c81d 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java @@ -17,4 +17,12 @@ void noopEquality() { ConfigProvider noop = ConfigProvider.noop(); assertThat(ConfigProvider.noop()).isSameAs(noop); } + + @Test + void instrumentationConfigFallback() { + ConfigProvider configProvider = ConfigProvider.noop(); + assertThat(configProvider.getInstrumentationConfig()).isNull(); + assertThat(configProvider.getJavaInstrumentationConfig("servlet")).isNotNull(); + assertThat(configProvider.getGeneralInstrumentationConfig("http")).isNotNull(); + } } diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 9bd71b3d802..e3563e8ecca 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.autoconfigure; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThatCode; @@ -225,8 +226,14 @@ void configFile_ConfigProvider() { .isNotNull() .satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value")); - // shortcut to get specific instrumentation config + // shortcuts to get specific instrumentation config assertThat(globalConfigProvider.getJavaInstrumentationConfig("example").getString("key")) .isEqualTo("value"); + assertThat( + globalConfigProvider + .getGeneralInstrumentationConfig("http") + .getStructured("client", empty()) + .getScalarList("request_captured_headers", String.class)) + .isEqualTo(Arrays.asList("Content-Type", "Accept")); } } From 4cb986370ec4e4f5f60af063e1aea6ee34d1b427 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 19 Dec 2025 11:32:37 +0100 Subject: [PATCH 05/14] feat: add method to retrieve general instrumentation configuration by name --- .../api/incubator/config/ConfigProvider.java | 10 ++-------- .../autoconfigure/DeclarativeConfigurationTest.java | 3 +-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 9df0a051c60..d67254e7b9b 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -40,10 +40,7 @@ public interface ConfigProvider { */ default DeclarativeConfigProperties getJavaInstrumentationConfig(String name) { DeclarativeConfigProperties config = getInstrumentationConfig(); - if (config == null) { - return empty(); - } - return config.getStructured("java", empty()).getStructured(name, empty()); + return config == null ? empty() : config.get("java").get(name); } /** @@ -57,10 +54,7 @@ default DeclarativeConfigProperties getJavaInstrumentationConfig(String name) { */ default DeclarativeConfigProperties getGeneralInstrumentationConfig(String name) { DeclarativeConfigProperties config = getInstrumentationConfig(); - if (config == null) { - return empty(); - } - return config.getStructured("general", empty()).getStructured(name, empty()); + return config == null ? empty() : config.get("general").get(name); } /** Returns a no-op {@link ConfigProvider}. */ diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index e3563e8ecca..7520ad95cc1 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -5,7 +5,6 @@ package io.opentelemetry.sdk.autoconfigure; -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThatCode; @@ -232,7 +231,7 @@ void configFile_ConfigProvider() { assertThat( globalConfigProvider .getGeneralInstrumentationConfig("http") - .getStructured("client", empty()) + .get("client") .getScalarList("request_captured_headers", String.class)) .isEqualTo(Arrays.asList("Content-Type", "Accept")); } From 588f9b60c66e400bb4685d6d708a600878220502 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 19 Dec 2025 19:49:09 +0100 Subject: [PATCH 06/14] pr review --- .../api/incubator/config/ConfigProvider.java | 14 ++++++-------- .../api/incubator/ConfigProviderTest.java | 2 +- .../DeclarativeConfigurationTest.java | 3 ++- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index d67254e7b9b..b9a6b9f4ac6 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -44,17 +44,15 @@ default DeclarativeConfigProperties getJavaInstrumentationConfig(String name) { } /** - * Returns the {@link DeclarativeConfigProperties} for general instrumentation config by name. If - * no configuration is available for the given name, an empty {@link DeclarativeConfigProperties} - * is returned. + * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration. If + * the general configuration is not available, an empty {@link DeclarativeConfigProperties} is + * returned. * - * @param name the name of the general instrumentation config - * @return the {@link DeclarativeConfigProperties} for the given general instrumentation config - * name + * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration */ - default DeclarativeConfigProperties getGeneralInstrumentationConfig(String name) { + default DeclarativeConfigProperties getGeneralInstrumentationConfig() { DeclarativeConfigProperties config = getInstrumentationConfig(); - return config == null ? empty() : config.get("general").get(name); + return config == null ? empty() : config.get("general"); } /** Returns a no-op {@link ConfigProvider}. */ diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java index 6ae0a54c81d..9615263b298 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java @@ -23,6 +23,6 @@ void instrumentationConfigFallback() { ConfigProvider configProvider = ConfigProvider.noop(); assertThat(configProvider.getInstrumentationConfig()).isNull(); assertThat(configProvider.getJavaInstrumentationConfig("servlet")).isNotNull(); - assertThat(configProvider.getGeneralInstrumentationConfig("http")).isNotNull(); + assertThat(configProvider.getGeneralInstrumentationConfig()).isNotNull(); } } diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 7520ad95cc1..4a1a5042dd6 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -230,7 +230,8 @@ void configFile_ConfigProvider() { .isEqualTo("value"); assertThat( globalConfigProvider - .getGeneralInstrumentationConfig("http") + .getGeneralInstrumentationConfig() + .get("http") .get("client") .getScalarList("request_captured_headers", String.class)) .isEqualTo(Arrays.asList("Content-Type", "Accept")); From 1ebb4ced1e357c4ec1e2d1b52fceaced64985fc3 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sat, 20 Dec 2025 09:10:39 +0100 Subject: [PATCH 07/14] pr review --- .../io/opentelemetry/api/incubator/config/ConfigProvider.java | 2 +- .../java/io/opentelemetry/api/incubator/ConfigProviderTest.java | 2 +- .../sdk/autoconfigure/DeclarativeConfigurationTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index b9a6b9f4ac6..5834637a938 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -38,7 +38,7 @@ public interface ConfigProvider { * @param name the name of the instrumentation * @return the {@link DeclarativeConfigProperties} for the given instrumentation name */ - default DeclarativeConfigProperties getJavaInstrumentationConfig(String name) { + default DeclarativeConfigProperties getInstrumentationConfig(String name) { DeclarativeConfigProperties config = getInstrumentationConfig(); return config == null ? empty() : config.get("java").get(name); } diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java index 9615263b298..82e78abb2c7 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java @@ -22,7 +22,7 @@ void noopEquality() { void instrumentationConfigFallback() { ConfigProvider configProvider = ConfigProvider.noop(); assertThat(configProvider.getInstrumentationConfig()).isNull(); - assertThat(configProvider.getJavaInstrumentationConfig("servlet")).isNotNull(); + assertThat(configProvider.getInstrumentationConfig("servlet")).isNotNull(); assertThat(configProvider.getGeneralInstrumentationConfig()).isNotNull(); } } diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 4a1a5042dd6..3eb7f3914c5 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -226,7 +226,7 @@ void configFile_ConfigProvider() { .satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value")); // shortcuts to get specific instrumentation config - assertThat(globalConfigProvider.getJavaInstrumentationConfig("example").getString("key")) + assertThat(globalConfigProvider.getInstrumentationConfig("example").getString("key")) .isEqualTo("value"); assertThat( globalConfigProvider From 5d9701cb770ca47d513fa2cb116818d232b8ccf7 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 5 Jan 2026 09:39:30 +0100 Subject: [PATCH 08/14] move to ExtendedOpenTelemetry to avoid null check with stable API in the future --- .../api/incubator/ExtendedOpenTelemetry.java | 30 +++++++++++ .../api/incubator/config/ConfigProvider.java | 28 +--------- .../api/incubator/ConfigProviderTest.java | 8 --- .../incubator/ExtendedOpenTelemetryTest.java | 53 +++++++++++++++++++ .../DeclarativeConfigurationTest.java | 11 ---- 5 files changed, 84 insertions(+), 46 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java index 6509e4f4865..84418ad7111 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java @@ -5,8 +5,11 @@ package io.opentelemetry.api.incubator; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; /** Extension to {@link OpenTelemetry} with experimental APIs. */ public interface ExtendedOpenTelemetry extends OpenTelemetry { @@ -14,4 +17,31 @@ public interface ExtendedOpenTelemetry extends OpenTelemetry { default ConfigProvider getConfigProvider() { return ConfigProvider.noop(); } + + /** + * Returns the {@link DeclarativeConfigProperties} for a specific instrumentation by name. If no + * configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is + * returned. + * + * @param name the name of the instrumentation + * @return the {@link DeclarativeConfigProperties} for the given instrumentation name + */ + default DeclarativeConfigProperties getInstrumentationConfig(String name) { + // getConfigProvider() will be nullable once stability is reached + DeclarativeConfigProperties config = getConfigProvider().getInstrumentationConfig(); + return config == null ? empty() : config.get("java").get(name); + } + + /** + * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration. If + * the general configuration is not available, an empty {@link DeclarativeConfigProperties} is + * returned. + * + * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration + */ + default DeclarativeConfigProperties getGeneralInstrumentationConfig() { + // getConfigProvider() will be nullable once stability is reached + DeclarativeConfigProperties config = getConfigProvider().getInstrumentationConfig(); + return config == null ? empty() : config.get("general"); + } } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 5834637a938..4e4803cd35f 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -5,10 +5,9 @@ package io.opentelemetry.api.incubator.config; -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; - import javax.annotation.concurrent.ThreadSafe; + /** * A registry for accessing declarative configuration. * @@ -30,31 +29,6 @@ public interface ConfigProvider { */ DeclarativeConfigProperties getInstrumentationConfig(); - /** - * Returns the {@link DeclarativeConfigProperties} for a specific instrumentation by name. If no - * configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is - * returned. - * - * @param name the name of the instrumentation - * @return the {@link DeclarativeConfigProperties} for the given instrumentation name - */ - default DeclarativeConfigProperties getInstrumentationConfig(String name) { - DeclarativeConfigProperties config = getInstrumentationConfig(); - return config == null ? empty() : config.get("java").get(name); - } - - /** - * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration. If - * the general configuration is not available, an empty {@link DeclarativeConfigProperties} is - * returned. - * - * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration - */ - default DeclarativeConfigProperties getGeneralInstrumentationConfig() { - DeclarativeConfigProperties config = getInstrumentationConfig(); - return config == null ? empty() : config.get("general"); - } - /** Returns a no-op {@link ConfigProvider}. */ static ConfigProvider noop() { return DeclarativeConfigProperties::empty; diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java index 82e78abb2c7..9c9e4bf41e1 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java @@ -17,12 +17,4 @@ void noopEquality() { ConfigProvider noop = ConfigProvider.noop(); assertThat(ConfigProvider.noop()).isSameAs(noop); } - - @Test - void instrumentationConfigFallback() { - ConfigProvider configProvider = ConfigProvider.noop(); - assertThat(configProvider.getInstrumentationConfig()).isNull(); - assertThat(configProvider.getInstrumentationConfig("servlet")).isNotNull(); - assertThat(configProvider.getGeneralInstrumentationConfig()).isNotNull(); - } } diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java index 651eae4bc14..f1c546db299 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java @@ -6,9 +6,12 @@ package io.opentelemetry.api.incubator; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.incubator.logs.ExtendedDefaultLoggerProvider; import io.opentelemetry.api.incubator.logs.ExtendedLogger; import io.opentelemetry.api.incubator.metrics.ExtendedDefaultMeterProvider; @@ -22,8 +25,12 @@ import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -70,4 +77,50 @@ private static void assertIsExtended(OpenTelemetry openTelemetry) { assertThat(openTelemetry.getLogsBridge().get("test")).isInstanceOf(ExtendedLogger.class); assertThat(openTelemetry.getTracer("test")).isInstanceOf(ExtendedTracer.class); } + + @Test + void configProvider() { + String configYaml = + "instrumentation/development:\n" + + " general:\n" + + " http:\n" + + " client:\n" + + " request_captured_headers:\n" + + " - client-request-header1\n" + + " - client-request-header2\n" + + " java:\n" + + " example:\n" + + " property: \"value\""; + + OpenTelemetryConfigurationModel configuration = + DeclarativeConfiguration.parse( + new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8))); + SdkConfigProvider configProvider = SdkConfigProvider.create(configuration); + ExtendedOpenTelemetry openTelemetry = + ExtendedOpenTelemetrySdk.create(OpenTelemetrySdk.builder().build(), configProvider); + + // shortcuts to get specific instrumentation config + assertThat(openTelemetry.getInstrumentationConfig("example").getString("property")) + .isEqualTo("value"); + assertThat( + openTelemetry + .getGeneralInstrumentationConfig() + .get("http") + .get("client") + .getScalarList("request_captured_headers", String.class)) + .isEqualTo(Arrays.asList("client-request-header1", "client-request-header2")); + } + + @Test + void instrumentationConfigFallback() { + ConfigProvider configProvider = ConfigProvider.noop(); + // cannot create ExtendedOpenTelemetry with noop ConfigProvider right now, + // but will be possible once stable API is available + ExtendedOpenTelemetry openTelemetry = spy(ExtendedOpenTelemetry.class); + when(openTelemetry.getConfigProvider()).thenReturn(configProvider); + + assertThat(configProvider.getInstrumentationConfig()).isNull(); + assertThat(openTelemetry.getInstrumentationConfig("servlet")).isNotNull(); + assertThat(openTelemetry.getGeneralInstrumentationConfig()).isNotNull(); + } } diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 3eb7f3914c5..88bdb322b26 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -224,16 +224,5 @@ void configFile_ConfigProvider() { assertThat(InstrumentationConfigUtil.javaInstrumentationConfig(globalConfigProvider, "example")) .isNotNull() .satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value")); - - // shortcuts to get specific instrumentation config - assertThat(globalConfigProvider.getInstrumentationConfig("example").getString("key")) - .isEqualTo("value"); - assertThat( - globalConfigProvider - .getGeneralInstrumentationConfig() - .get("http") - .get("client") - .getScalarList("request_captured_headers", String.class)) - .isEqualTo(Arrays.asList("Content-Type", "Accept")); } } From 4719addf1dc967d6d019a25981605ad23222fb29 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 5 Jan 2026 09:40:38 +0100 Subject: [PATCH 09/14] move to ExtendedOpenTelemetry to avoid null check with stable API in the future --- .../opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java index f1c546db299..e53b3971d08 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java @@ -79,7 +79,7 @@ private static void assertIsExtended(OpenTelemetry openTelemetry) { } @Test - void configProvider() { + void instrumentationConfig() { String configYaml = "instrumentation/development:\n" + " general:\n" From e3a8d544479b7dba52880381038df4977b90cdc2 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 6 Jan 2026 07:28:25 +0100 Subject: [PATCH 10/14] add methods to both ConfigProvider and ExtendedOpenTelemetry --- .../api/incubator/ExtendedOpenTelemetry.java | 10 ++------ .../api/incubator/config/ConfigProvider.java | 24 ++++++++++++++++++- .../api/incubator/ConfigProviderTest.java | 8 +++++++ .../DeclarativeConfigurationTest.java | 11 +++++++++ 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java index 84418ad7111..67503cd0cdd 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java @@ -5,8 +5,6 @@ package io.opentelemetry.api.incubator; -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; - import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; @@ -27,9 +25,7 @@ default ConfigProvider getConfigProvider() { * @return the {@link DeclarativeConfigProperties} for the given instrumentation name */ default DeclarativeConfigProperties getInstrumentationConfig(String name) { - // getConfigProvider() will be nullable once stability is reached - DeclarativeConfigProperties config = getConfigProvider().getInstrumentationConfig(); - return config == null ? empty() : config.get("java").get(name); + return getConfigProvider().getInstrumentationConfig(name); } /** @@ -40,8 +36,6 @@ default DeclarativeConfigProperties getInstrumentationConfig(String name) { * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration */ default DeclarativeConfigProperties getGeneralInstrumentationConfig() { - // getConfigProvider() will be nullable once stability is reached - DeclarativeConfigProperties config = getConfigProvider().getInstrumentationConfig(); - return config == null ? empty() : config.get("general"); + return getConfigProvider().getGeneralInstrumentationConfig(); } } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 4e4803cd35f..6f3f2d5c49b 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -7,7 +7,6 @@ import javax.annotation.concurrent.ThreadSafe; - /** * A registry for accessing declarative configuration. * @@ -29,6 +28,29 @@ public interface ConfigProvider { */ DeclarativeConfigProperties getInstrumentationConfig(); + /** + * Returns the {@link DeclarativeConfigProperties} for a specific instrumentation by name. If no + * configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is + * returned. + * + * @param name the name of the instrumentation + * @return the {@link DeclarativeConfigProperties} for the given instrumentation name + */ + default DeclarativeConfigProperties getInstrumentationConfig(String name) { + return getInstrumentationConfig().get("java").get(name); + } + + /** + * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration. If + * the general configuration is not available, an empty {@link DeclarativeConfigProperties} is + * returned. + * + * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration + */ + default DeclarativeConfigProperties getGeneralInstrumentationConfig() { + return getInstrumentationConfig().get("general"); + } + /** Returns a no-op {@link ConfigProvider}. */ static ConfigProvider noop() { return DeclarativeConfigProperties::empty; diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java index 9c9e4bf41e1..82e78abb2c7 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java @@ -17,4 +17,12 @@ void noopEquality() { ConfigProvider noop = ConfigProvider.noop(); assertThat(ConfigProvider.noop()).isSameAs(noop); } + + @Test + void instrumentationConfigFallback() { + ConfigProvider configProvider = ConfigProvider.noop(); + assertThat(configProvider.getInstrumentationConfig()).isNull(); + assertThat(configProvider.getInstrumentationConfig("servlet")).isNotNull(); + assertThat(configProvider.getGeneralInstrumentationConfig()).isNotNull(); + } } diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 88bdb322b26..3eb7f3914c5 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -224,5 +224,16 @@ void configFile_ConfigProvider() { assertThat(InstrumentationConfigUtil.javaInstrumentationConfig(globalConfigProvider, "example")) .isNotNull() .satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value")); + + // shortcuts to get specific instrumentation config + assertThat(globalConfigProvider.getInstrumentationConfig("example").getString("key")) + .isEqualTo("value"); + assertThat( + globalConfigProvider + .getGeneralInstrumentationConfig() + .get("http") + .get("client") + .getScalarList("request_captured_headers", String.class)) + .isEqualTo(Arrays.asList("Content-Type", "Accept")); } } From 2fe03f0df823a22638dfb9159b6f96d7a176cb02 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 6 Jan 2026 07:30:37 +0100 Subject: [PATCH 11/14] fix --- .../java/io/opentelemetry/api/incubator/ConfigProviderTest.java | 2 +- .../opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java index 82e78abb2c7..b5fdca1cdf6 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java @@ -21,7 +21,7 @@ void noopEquality() { @Test void instrumentationConfigFallback() { ConfigProvider configProvider = ConfigProvider.noop(); - assertThat(configProvider.getInstrumentationConfig()).isNull(); + assertThat(configProvider.getInstrumentationConfig()).isNotNull(); assertThat(configProvider.getInstrumentationConfig("servlet")).isNotNull(); assertThat(configProvider.getGeneralInstrumentationConfig()).isNotNull(); } diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java index e53b3971d08..b8ff8ce9289 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java @@ -119,7 +119,7 @@ void instrumentationConfigFallback() { ExtendedOpenTelemetry openTelemetry = spy(ExtendedOpenTelemetry.class); when(openTelemetry.getConfigProvider()).thenReturn(configProvider); - assertThat(configProvider.getInstrumentationConfig()).isNull(); + assertThat(configProvider.getInstrumentationConfig()).isNotNull(); assertThat(openTelemetry.getInstrumentationConfig("servlet")).isNotNull(); assertThat(openTelemetry.getGeneralInstrumentationConfig()).isNotNull(); } From 308426852bb608d1623a798245ca891ac59a45f4 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 13:19:25 +0100 Subject: [PATCH 12/14] docs --- .../api/incubator/ExtendedOpenTelemetry.java | 18 ++++++++++++++++-- .../api/incubator/config/ConfigProvider.java | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java index 67503cd0cdd..2059565de87 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java @@ -21,6 +21,14 @@ default ConfigProvider getConfigProvider() { * configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is * returned. * + *

For example, {@code getInstrumentationConfig("foo")} returns the node: + * + *

{@code
+   * instrumentation/development:
+   *   java:
+   *     foo:
+   * }
+ * * @param name the name of the instrumentation * @return the {@link DeclarativeConfigProperties} for the given instrumentation name */ @@ -29,8 +37,14 @@ default DeclarativeConfigProperties getInstrumentationConfig(String name) { } /** - * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration. If - * the general configuration is not available, an empty {@link DeclarativeConfigProperties} is + * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration: + * + *
{@code
+   * instrumentation/development:
+   *   general:
+   * }
+ * + * If the general configuration is not available, an empty {@link DeclarativeConfigProperties} is * returned. * * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 6f3f2d5c49b..17aeefbe842 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -33,6 +33,14 @@ public interface ConfigProvider { * configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is * returned. * + *

For example, {@code getInstrumentationConfig("foo")} returns the node: + * + *

{@code
+   * instrumentation/development:
+   *   java:
+   *     foo:
+   * }
+ * * @param name the name of the instrumentation * @return the {@link DeclarativeConfigProperties} for the given instrumentation name */ @@ -41,8 +49,14 @@ default DeclarativeConfigProperties getInstrumentationConfig(String name) { } /** - * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration. If - * the general configuration is not available, an empty {@link DeclarativeConfigProperties} is + * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration: + * + *
{@code
+   * instrumentation/development:
+   *   general:
+   * }
+ * + * If the general configuration is not available, an empty {@link DeclarativeConfigProperties} is * returned. * * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration From 3abc73ec37fad02dfcc52851b3dce4e3510b912a Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 13:33:36 +0100 Subject: [PATCH 13/14] docs --- .../io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java | 4 ++-- .../io/opentelemetry/api/incubator/config/ConfigProvider.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java index 2059565de87..1f2e8571fc2 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java @@ -44,8 +44,8 @@ default DeclarativeConfigProperties getInstrumentationConfig(String name) { * general: * } * - * If the general configuration is not available, an empty {@link DeclarativeConfigProperties} is - * returned. + *

If the general configuration is not available, an empty {@link DeclarativeConfigProperties} + * is returned. * * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration */ diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 17aeefbe842..8c4818a3e10 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -56,8 +56,8 @@ default DeclarativeConfigProperties getInstrumentationConfig(String name) { * general: * } * - * If the general configuration is not available, an empty {@link DeclarativeConfigProperties} is - * returned. + *

If the general configuration is not available, an empty {@link DeclarativeConfigProperties} + * is returned. * * @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration */ From 0344ee75249f0fc620bc501dc153a37d3144d3e2 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 16:36:35 +0100 Subject: [PATCH 14/14] docs --- .../io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java | 2 +- .../io/opentelemetry/api/incubator/config/ConfigProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java index 1f2e8571fc2..74883fa2302 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java @@ -37,7 +37,7 @@ default DeclarativeConfigProperties getInstrumentationConfig(String name) { } /** - * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration: + * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration. * *

{@code
    * instrumentation/development:
diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java
index 8c4818a3e10..dcf6c7bd082 100644
--- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java
+++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java
@@ -49,7 +49,7 @@ default DeclarativeConfigProperties getInstrumentationConfig(String name) {
   }
 
   /**
-   * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration:
+   * Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration.
    *
    * 
{@code
    * instrumentation/development: