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 62cc044e653..e155786ac5f 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.Nullable; import javax.annotation.concurrent.ThreadSafe; @@ -30,6 +32,31 @@ public interface ConfigProvider { @Nullable 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 () -> null; 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 09038b40e6d..a399bab2a46 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 @@ -231,5 +231,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")); } }