From 08e70a0db1e918bf9a9bac5e942691f0ee96cce9 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 17 Nov 2025 17:31:57 +0100 Subject: [PATCH 01/33] add system properties bridge --- .../api/internal/ConfigPropertiesUtil.java | 64 +++++++++++++++++++ .../jdbc/OpenTelemetryDriver.java | 22 ++++--- .../internal/JdbcInstrumenterFactory.java | 10 +-- 3 files changed, 81 insertions(+), 15 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 862cd6b13588..68aa7d99fd43 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -5,23 +5,63 @@ package io.opentelemetry.instrumentation.api.internal; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; import javax.annotation.Nullable; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ public final class ConfigPropertiesUtil { + private static final boolean isIncubator = isIncubator(); + + private static boolean isIncubator() { + try { + Class.forName("io.opentelemetry.api.incubator.ExtendedOpenTelemetry"); + return true; + } catch (ClassNotFoundException e) { + // The incubator module is not available. + // This only happens in OpenTelemetry API instrumentation tests, where an older version of + // OpenTelemetry API is used that does not have ExtendedOpenTelemetry. + // Having the incubator module without ExtendedOpenTelemetry class should still return false + // for those tests to avoid a ClassNotFoundException. + return false; + } + } + + /** + * @deprecated use {@link #getBoolean(OpenTelemetry, boolean, String...)} instead + */ + @Deprecated public static boolean getBoolean(String propertyName, boolean defaultValue) { String strValue = getString(propertyName); return strValue == null ? defaultValue : Boolean.parseBoolean(strValue); } + /** + * Returns the boolean value of the given property name from Declarative Config if available, + * otherwise falls back to system properties and environment variables. + */ + public static boolean getBoolean( + OpenTelemetry openTelemetry, boolean defaultValue, String... propertyName) { + + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return node.getBoolean(propertyName[propertyName.length - 1], defaultValue); + } + return getBoolean(toSystemProperty(propertyName), defaultValue); + } + public static int getInt(String propertyName, int defaultValue) { String strValue = getString(propertyName); if (strValue == null) { @@ -67,5 +107,29 @@ private static String toEnvVarName(String propertyName) { return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_'); } + @Nullable + private static DeclarativeConfigProperties getDeclarativeConfigNode( + OpenTelemetry openTelemetry, String... propertyName) { + if (isIncubator && openTelemetry instanceof ExtendedOpenTelemetry) { + ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; + ConfigProvider configProvider = extendedOpenTelemetry.getConfigProvider(); + DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig(); + if (instrumentationConfig == null) { + return empty(); + } + DeclarativeConfigProperties node = instrumentationConfig.getStructured("java", empty()); + // last part is the leaf property + for (int i = 0; i < propertyName.length - 1; i++) { + node = node.getStructured(propertyName[i], empty()); + } + return node; + } + return null; + } + + private static String toSystemProperty(String[] propertyName) { + return String.join(".", propertyName).replace('_', '-'); + } + private ConfigPropertiesUtil() {} } diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java index 617da2b99f03..dd8ed9c3a219 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java @@ -63,14 +63,16 @@ public final class OpenTelemetryDriver implements Driver { private static final AtomicBoolean REGISTERED = new AtomicBoolean(); private static final List DRIVER_CANDIDATES = new CopyOnWriteArrayList<>(); - private static final SqlCommenter sqlCommenter = - SqlCommenter.builder() - .setEnabled( - ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.jdbc.experimental.sqlcommenter.enabled", - ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.common.experimental.db-sqlcommenter.enabled", false))) - .build(); + private static SqlCommenter getSqlCommenter(OpenTelemetry openTelemetry) { + boolean defaultValue = + ConfigPropertiesUtil.getBoolean( + openTelemetry, false, "common", "experimental", "db_sqlcommenter", "enabled"); + return SqlCommenter.builder() + .setEnabled( + ConfigPropertiesUtil.getBoolean( + openTelemetry, defaultValue, "jdbc", "experimental", "sqlcommenter", "enabled")) + .build(); + } static { try { @@ -256,7 +258,7 @@ public Connection connect(String url, Properties info) throws SQLException { Instrumenter statementInstrumenter = JdbcInstrumenterFactory.createStatementInstrumenter(openTelemetry); - boolean captureQueryParameters = JdbcInstrumenterFactory.captureQueryParameters(); + boolean captureQueryParameters = JdbcInstrumenterFactory.captureQueryParameters(openTelemetry); Instrumenter transactionInstrumenter = JdbcInstrumenterFactory.createTransactionInstrumenter(openTelemetry); @@ -266,7 +268,7 @@ public Connection connect(String url, Properties info) throws SQLException { statementInstrumenter, transactionInstrumenter, captureQueryParameters, - sqlCommenter); + getSqlCommenter(openTelemetry)); } @Override diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java index 9748181d713e..07c08fbd34e4 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java @@ -28,14 +28,14 @@ public final class JdbcInstrumenterFactory { public static final String INSTRUMENTATION_NAME = "io.opentelemetry.jdbc"; - public static boolean captureQueryParameters() { + public static boolean captureQueryParameters(OpenTelemetry openTelemetry) { return ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.jdbc.experimental.capture-query-parameters", false); + openTelemetry, false, "jdbc", "experimental", "capture_query_parameters"); } public static Instrumenter createStatementInstrumenter( OpenTelemetry openTelemetry) { - return createStatementInstrumenter(openTelemetry, captureQueryParameters()); + return createStatementInstrumenter(openTelemetry, captureQueryParameters(openTelemetry)); } static Instrumenter createStatementInstrumenter( @@ -45,7 +45,7 @@ static Instrumenter createStatementInstrumenter( emptyList(), true, ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.common.db-statement-sanitizer.enabled", true), + openTelemetry, true, "common", "db_statement_sanitizer", "enabled"), captureQueryParameters); } @@ -95,7 +95,7 @@ public static Instrumenter createTransactionInstrumenter( return createTransactionInstrumenter( openTelemetry, ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.jdbc.experimental.transaction.enabled", false)); + openTelemetry, false, "jdbc", "experimental", "transaction", "enabled")); } public static Instrumenter createTransactionInstrumenter( From 5c1638f47baa8cf6bc4ea7def4660bddd023e6ae Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 17 Nov 2025 18:04:29 +0100 Subject: [PATCH 02/33] add system properties bridge --- instrumentation-api/build.gradle.kts | 1 + .../api/internal/ConfigPropertiesUtil.java | 17 ++++++---- .../internal/ConfigPropertiesUtilTest.java | 33 +++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/instrumentation-api/build.gradle.kts b/instrumentation-api/build.gradle.kts index 3b798b826de2..38dfcbf8a6a5 100644 --- a/instrumentation-api/build.gradle.kts +++ b/instrumentation-api/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common") testImplementation("io.opentelemetry:opentelemetry-sdk-testing") testImplementation("io.opentelemetry:opentelemetry-exporter-common") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator") testImplementation("org.junit-pioneer:junit-pioneer") jmhImplementation(project(":instrumentation-api-incubator")) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 68aa7d99fd43..905e6e0ef706 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.api.internal; +import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; + import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; @@ -15,8 +17,6 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; - /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. @@ -40,9 +40,12 @@ private static boolean isIncubator() { } /** - * @deprecated use {@link #getBoolean(OpenTelemetry, boolean, String...)} instead + * Returns the boolean value of the given property name from system properties and environment + * variables. + * + *

It's recommended to use {@link #getBoolean(OpenTelemetry, boolean, String...)} instead to + * support Declarative Config. */ - @Deprecated public static boolean getBoolean(String propertyName, boolean defaultValue) { String strValue = getString(propertyName); return strValue == null ? defaultValue : Boolean.parseBoolean(strValue); @@ -54,7 +57,6 @@ public static boolean getBoolean(String propertyName, boolean defaultValue) { */ public static boolean getBoolean( OpenTelemetry openTelemetry, boolean defaultValue, String... propertyName) { - DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); if (node != null) { return node.getBoolean(propertyName[propertyName.length - 1], defaultValue); @@ -127,8 +129,9 @@ private static DeclarativeConfigProperties getDeclarativeConfigNode( return null; } - private static String toSystemProperty(String[] propertyName) { - return String.join(".", propertyName).replace('_', '-'); + // Visible for testing + static String toSystemProperty(String[] propertyName) { + return "otel.instrumentation." + String.join(".", propertyName).replace('_', '-'); } private ConfigPropertiesUtil() {} diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 8a496322b6e0..f1ecff66ee23 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -7,6 +7,12 @@ import static org.assertj.core.api.Assertions.assertThat; +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 java.util.Collections; import org.junit.jupiter.api.Test; import org.junitpioneer.jupiter.SetEnvironmentVariable; import org.junitpioneer.jupiter.SetSystemProperty; @@ -72,4 +78,31 @@ void getBoolean_environmentVariable() { void getBoolean_none() { assertThat(ConfigPropertiesUtil.getBoolean("test.property.boolean", false)).isFalse(); } + + @Test + void getBoolean_declarativeConfig() { + assertThat( + ConfigPropertiesUtil.getBoolean( + DeclarativeConfiguration.create(model(true)), false, "foo", "bar")) + .isTrue(); + } + + private static OpenTelemetryConfigurationModel model(Object value) { + return new DeclarativeConfigurationBuilder() + .customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("1.0-rc.1") + .withInstrumentationDevelopment( + new InstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "foo", Collections.singletonMap("bar", value))))); + } + + @Test + void toSystemProperty() { + assertThat(ConfigPropertiesUtil.toSystemProperty(new String[] {"a_b", "c", "d"})) + .isEqualTo("otel.instrumentation.a-b.c.d"); + } } From f503dbef48e94b31a4da145f3703754557e7bf42 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 17 Nov 2025 18:37:36 +0100 Subject: [PATCH 03/33] add tests --- .../internal/ConfigPropertiesUtilTest.java | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index f1ecff66ee23..34de9f72de2b 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -7,13 +7,18 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.opentelemetry.api.OpenTelemetry; 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 java.util.Collections; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.junitpioneer.jupiter.SetEnvironmentVariable; import org.junitpioneer.jupiter.SetSystemProperty; @@ -61,30 +66,49 @@ void getInt_invalidNumber() { assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(-1); } - @SetEnvironmentVariable(key = "TEST_PROPERTY_BOOLEAN", value = "false") - @SetSystemProperty(key = "test.property.boolean", value = "true") + @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_BOOLEAN", value = "false") + @SetSystemProperty(key = "otel.instrumentation.test.property.boolean", value = "true") @Test void getBoolean_systemProperty() { - assertThat(ConfigPropertiesUtil.getBoolean("test.property.boolean", false)).isTrue(); + assertBoolean(true); } - @SetEnvironmentVariable(key = "TEST_PROPERTY_BOOLEAN", value = "true") + @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_BOOLEAN", value = "true") @Test void getBoolean_environmentVariable() { - assertThat(ConfigPropertiesUtil.getBoolean("test.property.boolean", false)).isTrue(); + assertBoolean(true); } @Test void getBoolean_none() { - assertThat(ConfigPropertiesUtil.getBoolean("test.property.boolean", false)).isFalse(); + assertBoolean(false); } - @Test - void getBoolean_declarativeConfig() { + private static void assertBoolean(boolean expected) { + assertThat(ConfigPropertiesUtil.getBoolean("otel.instrumentation.test.property.boolean", false)) + .isEqualTo(expected); + assertThat( + ConfigPropertiesUtil.getBoolean( + OpenTelemetry.noop(), false, "test", "property", "boolean")) + .isEqualTo(expected); + } + + public static Stream booleanValuesProvider() { + return Stream.of( + Arguments.of(true, true), + Arguments.of(false, false), + Arguments.of("invalid", false), + Arguments.of("true", false), // no type coercion in declarative config + Arguments.of(null, false)); + } + + @ParameterizedTest + @MethodSource("booleanValuesProvider") + void getBoolean_declarativeConfig(Object property, boolean expected) { assertThat( ConfigPropertiesUtil.getBoolean( - DeclarativeConfiguration.create(model(true)), false, "foo", "bar")) - .isTrue(); + DeclarativeConfiguration.create(model(property)), false, "foo", "bar")) + .isEqualTo(expected); } private static OpenTelemetryConfigurationModel model(Object value) { From 246fc71e3c6a8d2299cfa95a9da182c9cdf9ae7b Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 07:37:07 +0100 Subject: [PATCH 04/33] add list --- .../api/internal/ConfigPropertiesUtil.java | 15 ++++- .../internal/ConfigPropertiesUtilTest.java | 58 +++++++++++++++++++ .../autoconfigure/TracingRequestHandler.java | 30 +++++----- 3 files changed, 89 insertions(+), 14 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 905e6e0ef706..b1642c4309f2 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -59,7 +59,7 @@ public static boolean getBoolean( OpenTelemetry openTelemetry, boolean defaultValue, String... propertyName) { DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); if (node != null) { - return node.getBoolean(propertyName[propertyName.length - 1], defaultValue); + return node.getBoolean(leaf(propertyName), defaultValue); } return getBoolean(toSystemProperty(propertyName), defaultValue); } @@ -98,6 +98,15 @@ public static List getList(String propertyName, List defaultValu return filterBlanksAndNulls(value.split(",")); } + public static List getList( + OpenTelemetry openTelemetry, List defaultValue, String... propertyName) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return node.getScalarList(leaf(propertyName), String.class, defaultValue); + } + return getList(toSystemProperty(propertyName), defaultValue); + } + private static List filterBlanksAndNulls(String[] values) { return Arrays.stream(values) .map(String::trim) @@ -109,6 +118,10 @@ private static String toEnvVarName(String propertyName) { return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_'); } + private static String leaf(String[] propertyName) { + return propertyName[propertyName.length - 1]; + } + @Nullable private static DeclarativeConfigProperties getDeclarativeConfigNode( OpenTelemetry openTelemetry, String... propertyName) { diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 34de9f72de2b..3a529be10979 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -129,4 +129,62 @@ void toSystemProperty() { assertThat(ConfigPropertiesUtil.toSystemProperty(new String[] {"a_b", "c", "d"})) .isEqualTo("otel.instrumentation.a-b.c.d"); } + + @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_LIST", value = "a,b,c") + @SetSystemProperty(key = "otel.instrumentation.test.property.list", value = "x,y,z") + @Test + void getList_systemProperty() { + assertList(java.util.Arrays.asList("x", "y", "z")); + } + + @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_LIST", value = "a,b,c") + @Test + void getList_environmentVariable() { + assertList(java.util.Arrays.asList("a", "b", "c")); + } + + @Test + void getList_none() { + assertList(Collections.emptyList()); + } + + private static void assertList(java.util.List expected) { + assertThat(ConfigPropertiesUtil.getList("otel.instrumentation.test.property.list", Collections.emptyList())) + .isEqualTo(expected); + assertThat( + ConfigPropertiesUtil.getList( + OpenTelemetry.noop(), Collections.emptyList(), "test", "property", "list")) + .isEqualTo(expected); + } + + public static Stream listValuesProvider() { + return Stream.of( + Arguments.of(java.util.Arrays.asList("a", "b", "c"), java.util.Arrays.asList("a", "b", "c")), + Arguments.of(java.util.Arrays.asList("single"), java.util.Arrays.asList("single")), + Arguments.of(Collections.emptyList(), Collections.emptyList()), + Arguments.of(java.util.Arrays.asList(""), Collections.emptyList()), + Arguments.of(null, Collections.emptyList())); + } + + @ParameterizedTest + @MethodSource("listValuesProvider") + void getList_declarativeConfig(java.util.List property, java.util.List expected) { + assertThat( + ConfigPropertiesUtil.getList( + DeclarativeConfiguration.create(modelForList(property)), Collections.emptyList(), "foo", "bar")) + .isEqualTo(expected); + } + + private static OpenTelemetryConfigurationModel modelForList(java.util.List value) { + return new DeclarativeConfigurationBuilder() + .customizeModel( + new OpenTelemetryConfigurationModel() + .withFileFormat("1.0-rc.1") + .withInstrumentationDevelopment( + new InstrumentationModel() + .withJava( + new ExperimentalLanguageSpecificInstrumentationModel() + .withAdditionalProperty( + "foo", Collections.singletonMap("bar", value))))); + } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java index 2d92c041c0be..9916edc09c17 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java @@ -12,6 +12,7 @@ import com.amazonaws.Response; import com.amazonaws.handlers.RequestHandler2; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.awssdk.v1_11.AwsSdkTelemetry; @@ -20,19 +21,22 @@ */ public class TracingRequestHandler extends RequestHandler2 { - private static final RequestHandler2 DELEGATE = - AwsSdkTelemetry.builder(GlobalOpenTelemetry.get()) - .setCaptureExperimentalSpanAttributes( - ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.aws-sdk.experimental-span-attributes", false)) - .setMessagingReceiveInstrumentationEnabled( - ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false)) - .setCapturedHeaders( - ConfigPropertiesUtil.getList( - "otel.instrumentation.messaging.experimental.capture-headers", emptyList())) - .build() - .newRequestHandler(); + private static final RequestHandler2 DELEGATE = buildDelegate(GlobalOpenTelemetry.get()); + + private static RequestHandler2 buildDelegate(OpenTelemetry openTelemetry) { + return AwsSdkTelemetry.builder(openTelemetry) + .setCaptureExperimentalSpanAttributes( + ConfigPropertiesUtil.getBoolean( + openTelemetry, false, "aws-sdk", "experimental-span-attributes")) + .setMessagingReceiveInstrumentationEnabled( + ConfigPropertiesUtil.getBoolean( + openTelemetry, false, "messaging", "experimental", "receive-telemetry.enabled")) + .setCapturedHeaders( + ConfigPropertiesUtil.getList( + openTelemetry, emptyList(), "messaging.experimental.capture-headers")) + .build() + .newRequestHandler(); + } @Override public void beforeRequest(Request request) { From add113a99c1666c66c60f0d0837a48caadd74d0d Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 07:47:47 +0100 Subject: [PATCH 05/33] refactor --- .../api/internal/ConfigPropertiesUtil.java | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index b1642c4309f2..c953e3a3bf74 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -14,6 +14,8 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -57,11 +59,11 @@ public static boolean getBoolean(String propertyName, boolean defaultValue) { */ public static boolean getBoolean( OpenTelemetry openTelemetry, boolean defaultValue, String... propertyName) { - DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); - if (node != null) { - return node.getBoolean(leaf(propertyName), defaultValue); - } - return getBoolean(toSystemProperty(propertyName), defaultValue); + return getDeclarativeConfigOrFallback( + openTelemetry, + propertyName, + (node, key) -> node.getBoolean(key, defaultValue), + (key) -> getBoolean(key, defaultValue)); } public static int getInt(String propertyName, int defaultValue) { @@ -100,11 +102,11 @@ public static List getList(String propertyName, List defaultValu public static List getList( OpenTelemetry openTelemetry, List defaultValue, String... propertyName) { - DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); - if (node != null) { - return node.getScalarList(leaf(propertyName), String.class, defaultValue); - } - return getList(toSystemProperty(propertyName), defaultValue); + return getDeclarativeConfigOrFallback( + openTelemetry, + propertyName, + (node, key) -> node.getScalarList(key, String.class, defaultValue), + (key) -> getList(key, defaultValue)); } private static List filterBlanksAndNulls(String[] values) { @@ -118,6 +120,18 @@ private static String toEnvVarName(String propertyName) { return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_'); } + private static T getDeclarativeConfigOrFallback( + OpenTelemetry openTelemetry, + String[] propertyName, + BiFunction getter, + Function fallback) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return getter.apply(node, leaf(propertyName)); + } + return fallback.apply(toSystemProperty(propertyName)); + } + private static String leaf(String[] propertyName) { return propertyName[propertyName.length - 1]; } From a0525ac335ba18a5ffba92bb05fd394106e77951 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 08:14:22 +0100 Subject: [PATCH 06/33] refactor --- .../api/internal/ConfigPropertiesUtil.java | 15 ++++--- .../internal/ConfigPropertiesUtilTest.java | 43 ++++++++----------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index c953e3a3bf74..fce5dee2b09a 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -92,6 +92,15 @@ public static String getString(String propertyName, String defaultValue) { return strValue == null ? defaultValue : strValue; } + public static String getString( + OpenTelemetry openTelemetry, String defaultValue, String... propertyName) { + return getDeclarativeConfigOrFallback( + openTelemetry, + propertyName, + (node, key) -> node.getString(key, defaultValue), + (key) -> getString(key, defaultValue)); + } + public static List getList(String propertyName, List defaultValue) { String value = getString(propertyName); if (value == null) { @@ -127,15 +136,11 @@ private static T getDeclarativeConfigOrFallback( Function fallback) { DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); if (node != null) { - return getter.apply(node, leaf(propertyName)); + return getter.apply(node, propertyName[propertyName.length - 1]); } return fallback.apply(toSystemProperty(propertyName)); } - private static String leaf(String[] propertyName) { - return propertyName[propertyName.length - 1]; - } - @Nullable private static DeclarativeConfigProperties getDeclarativeConfigNode( OpenTelemetry openTelemetry, String... propertyName) { diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 3a529be10979..7ad98fe6ded4 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -5,6 +5,9 @@ package io.opentelemetry.instrumentation.api.internal; +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; @@ -14,6 +17,7 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; import java.util.Collections; +import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -134,57 +138,44 @@ void toSystemProperty() { @SetSystemProperty(key = "otel.instrumentation.test.property.list", value = "x,y,z") @Test void getList_systemProperty() { - assertList(java.util.Arrays.asList("x", "y", "z")); + assertList(asList("x", "y", "z")); } @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_LIST", value = "a,b,c") @Test void getList_environmentVariable() { - assertList(java.util.Arrays.asList("a", "b", "c")); + assertList(asList("a", "b", "c")); } @Test void getList_none() { - assertList(Collections.emptyList()); + assertList(emptyList()); } - private static void assertList(java.util.List expected) { - assertThat(ConfigPropertiesUtil.getList("otel.instrumentation.test.property.list", Collections.emptyList())) + private static void assertList(List expected) { + assertThat(ConfigPropertiesUtil.getList("otel.instrumentation.test.property.list", emptyList())) .isEqualTo(expected); assertThat( ConfigPropertiesUtil.getList( - OpenTelemetry.noop(), Collections.emptyList(), "test", "property", "list")) + OpenTelemetry.noop(), emptyList(), "test", "property", "list")) .isEqualTo(expected); } public static Stream listValuesProvider() { return Stream.of( - Arguments.of(java.util.Arrays.asList("a", "b", "c"), java.util.Arrays.asList("a", "b", "c")), - Arguments.of(java.util.Arrays.asList("single"), java.util.Arrays.asList("single")), - Arguments.of(Collections.emptyList(), Collections.emptyList()), - Arguments.of(java.util.Arrays.asList(""), Collections.emptyList()), - Arguments.of(null, Collections.emptyList())); + Arguments.of(asList("a", "b", "c"), asList("a", "b", "c")), + Arguments.of(singletonList("single"), singletonList("single")), + Arguments.of(emptyList(), emptyList()), + Arguments.of("invalid", emptyList()), + Arguments.of(null, emptyList())); } @ParameterizedTest @MethodSource("listValuesProvider") - void getList_declarativeConfig(java.util.List property, java.util.List expected) { + void getList_declarativeConfig(Object property, List expected) { assertThat( ConfigPropertiesUtil.getList( - DeclarativeConfiguration.create(modelForList(property)), Collections.emptyList(), "foo", "bar")) + DeclarativeConfiguration.create(model(property)), emptyList(), "foo", "bar")) .isEqualTo(expected); } - - private static OpenTelemetryConfigurationModel modelForList(java.util.List value) { - return new DeclarativeConfigurationBuilder() - .customizeModel( - new OpenTelemetryConfigurationModel() - .withFileFormat("1.0-rc.1") - .withInstrumentationDevelopment( - new InstrumentationModel() - .withJava( - new ExperimentalLanguageSpecificInstrumentationModel() - .withAdditionalProperty( - "foo", Collections.singletonMap("bar", value))))); - } } From bca6ff1dd19d04dab0a2ceedb0fbe831cdc2f196 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 08:19:36 +0100 Subject: [PATCH 07/33] string --- .../internal/ConfigPropertiesUtilTest.java | 46 +++++++++++++++++++ .../autoconfigure/TracingRequestHandler.java | 6 +-- .../v2_2/autoconfigure/AwsSdkSingletons.java | 9 +++- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 7ad98fe6ded4..d416d812ed7d 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -46,6 +46,52 @@ void getString_none() { assertThat(ConfigPropertiesUtil.getString("test.property.string")).isNull(); } + @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_STRING", value = "env_value") + @SetSystemProperty(key = "otel.instrumentation.test.property.string", value = "sys_value") + @Test + void getString_withOpenTelemetry_systemProperty() { + assertString("sys_value"); + } + + @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_STRING", value = "env_value") + @Test + void getString_withOpenTelemetry_environmentVariable() { + assertString("env_value"); + } + + @Test + void getString_withOpenTelemetry_none() { + assertString("default_value"); + } + + private static void assertString(String expected) { + assertThat( + ConfigPropertiesUtil.getString("otel.instrumentation.test.property.string", "default_value")) + .isEqualTo(expected); + assertThat( + ConfigPropertiesUtil.getString( + OpenTelemetry.noop(), "default_value", "test", "property", "string")) + .isEqualTo(expected); + } + + public static Stream stringValuesProvider() { + return Stream.of( + Arguments.of("value1", "value1"), + Arguments.of("", ""), + Arguments.of(null, "default_value"), + Arguments.of(123, "default_value"), // no type coercion in declarative config + Arguments.of(true, "default_value")); // no type coercion in declarative config + } + + @ParameterizedTest + @MethodSource("stringValuesProvider") + void getString_declarativeConfig(Object property, String expected) { + assertThat( + ConfigPropertiesUtil.getString( + DeclarativeConfiguration.create(model(property)), "default_value", "foo", "bar")) + .isEqualTo(expected); + } + @SetEnvironmentVariable(key = "TEST_PROPERTY_INT", value = "12") @SetSystemProperty(key = "test.property.int", value = "42") @Test diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java index 9916edc09c17..8900f1d89764 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java @@ -27,13 +27,13 @@ private static RequestHandler2 buildDelegate(OpenTelemetry openTelemetry) { return AwsSdkTelemetry.builder(openTelemetry) .setCaptureExperimentalSpanAttributes( ConfigPropertiesUtil.getBoolean( - openTelemetry, false, "aws-sdk", "experimental-span-attributes")) + openTelemetry, false, "aws_sdk", "experimental_span_attributes")) .setMessagingReceiveInstrumentationEnabled( ConfigPropertiesUtil.getBoolean( - openTelemetry, false, "messaging", "experimental", "receive-telemetry.enabled")) + openTelemetry, false, "messaging", "experimental", "receive_telemetry", "enabled")) .setCapturedHeaders( ConfigPropertiesUtil.getList( - openTelemetry, emptyList(), "messaging.experimental.capture-headers")) + openTelemetry, emptyList(), "messaging", "experimental", "capture_headers")) .build() .newRequestHandler(); } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java index 089757bea505..8f96a3cfe93d 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java @@ -7,6 +7,7 @@ import static java.util.Collections.emptyList; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry; import io.opentelemetry.instrumentation.awssdk.v2_2.internal.AbstractAwsSdkTelemetryFactory; @@ -25,13 +26,17 @@ private static class AwsSdkTelemetryFactory extends AbstractAwsSdkTelemetryFacto @Override protected List getCapturedHeaders() { return ConfigPropertiesUtil.getList( - "otel.instrumentation.messaging.experimental.capture-headers", emptyList()); + GlobalOpenTelemetry.get(), + emptyList(), + "messaging", "experimental", "capture_headers"); } @Override protected boolean messagingReceiveInstrumentationEnabled() { return ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false); + GlobalOpenTelemetry.get(), + false, + "messaging", "experimental", "receive_telemetry", "enabled"); } @Override From 556b9c395cc72d469332da5d17fa018ab43ec784 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 08:31:04 +0100 Subject: [PATCH 08/33] string --- .../v2_17/internal/ContextDataKeys.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java index a57da53ba61c..54fbe5d5890d 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.log4j.contextdata.v2_17.internal; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; @@ -15,13 +16,25 @@ public final class ContextDataKeys { public static final String TRACE_ID_KEY = ConfigPropertiesUtil.getString( - "otel.instrumentation.common.logging.trace-id", LoggingContextConstants.TRACE_ID); + GlobalOpenTelemetry.get(), + LoggingContextConstants.TRACE_ID, + "common", + "logging", + "trace_id"); public static final String SPAN_ID_KEY = ConfigPropertiesUtil.getString( - "otel.instrumentation.common.logging.span-id", LoggingContextConstants.SPAN_ID); + GlobalOpenTelemetry.get(), + LoggingContextConstants.SPAN_ID, + "common", + "logging", + "span_id"); public static final String TRACE_FLAGS_KEY = ConfigPropertiesUtil.getString( - "otel.instrumentation.common.logging.trace-flags", LoggingContextConstants.TRACE_FLAGS); + GlobalOpenTelemetry.get(), + LoggingContextConstants.TRACE_FLAGS, + "common", + "logging", + "trace_flags"); private ContextDataKeys() {} } From 110915343b08d208064f4860ebc3ce051fbe621d Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 08:45:28 +0100 Subject: [PATCH 09/33] string --- .../api/internal/ConfigPropertiesUtil.java | 4 +-- .../internal/ConfigPropertiesUtilTest.java | 5 ---- .../v2_6/TracingConsumerInterceptor.java | 27 ++++++++++++------- .../v2_6/TracingProducerInterceptor.java | 18 ++++++++----- .../OpenTelemetryContextDataProvider.java | 6 ++++- 5 files changed, 37 insertions(+), 23 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index fce5dee2b09a..f978e2601e4f 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -87,7 +87,7 @@ public static String getString(String propertyName) { return System.getenv(toEnvVarName(propertyName)); } - public static String getString(String propertyName, String defaultValue) { + private static String getString(String propertyName, String defaultValue) { String strValue = getString(propertyName); return strValue == null ? defaultValue : strValue; } @@ -101,7 +101,7 @@ public static String getString( (key) -> getString(key, defaultValue)); } - public static List getList(String propertyName, List defaultValue) { + private static List getList(String propertyName, List defaultValue) { String value = getString(propertyName); if (value == null) { return defaultValue; diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index d416d812ed7d..6631263df632 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -65,9 +65,6 @@ void getString_withOpenTelemetry_none() { } private static void assertString(String expected) { - assertThat( - ConfigPropertiesUtil.getString("otel.instrumentation.test.property.string", "default_value")) - .isEqualTo(expected); assertThat( ConfigPropertiesUtil.getString( OpenTelemetry.noop(), "default_value", "test", "property", "string")) @@ -199,8 +196,6 @@ void getList_none() { } private static void assertList(List expected) { - assertThat(ConfigPropertiesUtil.getList("otel.instrumentation.test.property.list", emptyList())) - .isEqualTo(expected); assertThat( ConfigPropertiesUtil.getList( OpenTelemetry.noop(), emptyList(), "test", "property", "list")) diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java index 96c040074088..4a70da1053f1 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java @@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.api.internal.Timer; @@ -32,15 +33,23 @@ @Deprecated public class TracingConsumerInterceptor implements ConsumerInterceptor { - private static final KafkaTelemetry telemetry = - KafkaTelemetry.builder(GlobalOpenTelemetry.get()) - .setMessagingReceiveInstrumentationEnabled( - ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false)) - .setCapturedHeaders( - ConfigPropertiesUtil.getList( - "otel.instrumentation.messaging.experimental.capture-headers", emptyList())) - .build(); + private static final KafkaTelemetry telemetry; + + static { + OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); + telemetry = KafkaTelemetry.builder(openTelemetry) + .setMessagingReceiveInstrumentationEnabled( + ConfigPropertiesUtil.getBoolean( + openTelemetry, + false, + "messaging", "experimental", "receive_telemetry", "enabled")) + .setCapturedHeaders( + ConfigPropertiesUtil.getList( + openTelemetry, + emptyList(), + "messaging", "experimental", "capture_headers")) + .build(); + } private String consumerGroup; private String clientId; diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingProducerInterceptor.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingProducerInterceptor.java index 007e1df51d4b..b5af34a6d2d8 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingProducerInterceptor.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingProducerInterceptor.java @@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import java.util.Map; import java.util.Objects; @@ -28,12 +29,17 @@ @Deprecated public class TracingProducerInterceptor implements ProducerInterceptor { - private static final KafkaTelemetry telemetry = - KafkaTelemetry.builder(GlobalOpenTelemetry.get()) - .setCapturedHeaders( - ConfigPropertiesUtil.getList( - "otel.instrumentation.messaging.experimental.capture-headers", emptyList())) - .build(); + private static final KafkaTelemetry telemetry; + + static { + OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); + telemetry = + KafkaTelemetry.builder(openTelemetry) + .setCapturedHeaders( + ConfigPropertiesUtil.getList( + openTelemetry, emptyList(), "messaging", "experimental", "capture_headers")) + .build(); + } @Nullable private String clientId; diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java index 57024ded7c3c..596b3e98574c 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.log4j.contextdata.v2_17; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.baggage.BaggageEntry; import io.opentelemetry.api.trace.Span; @@ -25,7 +26,10 @@ */ public class OpenTelemetryContextDataProvider implements ContextDataProvider { private static final boolean BAGGAGE_ENABLED = - ConfigPropertiesUtil.getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false); + ConfigPropertiesUtil.getBoolean( + GlobalOpenTelemetry.get(), + false, + "log4j_context_data", "add_baggage"); private static final boolean configuredResourceAttributeAccessible = isConfiguredResourceAttributeAccessible(); private static final Map staticContextData = getStaticContextData(); From 5dba36a96a64d8c15f93ba4ab16f73899716b0ae Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 08:47:38 +0100 Subject: [PATCH 10/33] string --- .../v2_2/internal/AbstractAwsSdkTelemetryFactory.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java index 574c8e214ef9..c27c03cb5f78 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java @@ -17,26 +17,26 @@ public abstract class AbstractAwsSdkTelemetryFactory { protected abstract List getCapturedHeaders(); private boolean captureExperimentalSpanAttributes() { - return getBoolean("otel.instrumentation.aws-sdk.experimental-span-attributes", false); + return getBoolean(false, "otel.instrumentation.aws-sdk.experimental-span-attributes"); } protected abstract boolean messagingReceiveInstrumentationEnabled(); private boolean useMessagingPropagator() { return getBoolean( - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging", false); + false, "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging"); } private boolean recordIndividualHttpError() { return getBoolean( - "otel.instrumentation.aws-sdk.experimental-record-individual-http-error", false); + false, "otel.instrumentation.aws-sdk.experimental-record-individual-http-error"); } private boolean genaiCaptureMessageContent() { - return getBoolean("otel.instrumentation.genai.capture-message-content", false); + return getBoolean(false, "otel.instrumentation.genai.capture-message-content"); } - protected abstract boolean getBoolean(String name, boolean defaultValue); + protected abstract boolean getBoolean(boolean defaultValue, String... name); public AwsSdkTelemetry telemetry() { return AwsSdkTelemetry.builder(GlobalOpenTelemetry.get()) From 3bccdf798eb4e001eadda13f3295c67555ffc498 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 08:48:08 +0100 Subject: [PATCH 11/33] string --- .../v2_6/TracingConsumerInterceptor.java | 26 ++++++++++--------- .../OpenTelemetryContextDataProvider.java | 4 +-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java index 4a70da1053f1..cce4f94f7e79 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java @@ -37,18 +37,20 @@ public class TracingConsumerInterceptor implements ConsumerInterceptor staticContextData = getStaticContextData(); From 652eb54a076fadd6a2243720d956126687de0bca Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 08:53:46 +0100 Subject: [PATCH 12/33] string --- .../api/internal/ConfigPropertiesUtil.java | 3 +-- .../awssdk/v2_2/AwsSdkSingletons.java | 6 ++++-- .../awssdk/v2_2/autoconfigure/AwsSdkSingletons.java | 13 +++++++------ .../internal/AbstractAwsSdkTelemetryFactory.java | 10 ++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index f978e2601e4f..7e65a83fd811 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -161,8 +161,7 @@ private static DeclarativeConfigProperties getDeclarativeConfigNode( return null; } - // Visible for testing - static String toSystemProperty(String[] propertyName) { + public static String toSystemProperty(String[] propertyName) { return "otel.instrumentation." + String.join(".", propertyName).replace('_', '-'); } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java index f84cd5590e99..33ee1679f21a 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkSingletons.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; +import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry; import io.opentelemetry.instrumentation.awssdk.v2_2.internal.AbstractAwsSdkTelemetryFactory; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; @@ -32,8 +33,9 @@ protected boolean messagingReceiveInstrumentationEnabled() { } @Override - protected boolean getBoolean(String name, boolean defaultValue) { - return AgentInstrumentationConfig.get().getBoolean(name, defaultValue); + protected boolean getBoolean(boolean defaultValue, String... name) { + return AgentInstrumentationConfig.get() + .getBoolean(ConfigPropertiesUtil.toSystemProperty(name), defaultValue); } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java index 8f96a3cfe93d..4d4dd601e631 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java @@ -26,9 +26,7 @@ private static class AwsSdkTelemetryFactory extends AbstractAwsSdkTelemetryFacto @Override protected List getCapturedHeaders() { return ConfigPropertiesUtil.getList( - GlobalOpenTelemetry.get(), - emptyList(), - "messaging", "experimental", "capture_headers"); + GlobalOpenTelemetry.get(), emptyList(), "messaging", "experimental", "capture_headers"); } @Override @@ -36,12 +34,15 @@ protected boolean messagingReceiveInstrumentationEnabled() { return ConfigPropertiesUtil.getBoolean( GlobalOpenTelemetry.get(), false, - "messaging", "experimental", "receive_telemetry", "enabled"); + "messaging", + "experimental", + "receive_telemetry", + "enabled"); } @Override - protected boolean getBoolean(String name, boolean defaultValue) { - return ConfigPropertiesUtil.getBoolean(name, defaultValue); + protected boolean getBoolean(boolean defaultValue, String... name) { + return ConfigPropertiesUtil.getBoolean(GlobalOpenTelemetry.get(), defaultValue, name); } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java index c27c03cb5f78..97701d3242c8 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AbstractAwsSdkTelemetryFactory.java @@ -17,23 +17,21 @@ public abstract class AbstractAwsSdkTelemetryFactory { protected abstract List getCapturedHeaders(); private boolean captureExperimentalSpanAttributes() { - return getBoolean(false, "otel.instrumentation.aws-sdk.experimental-span-attributes"); + return getBoolean(false, "aws_sdk", "experimental_span_attributes"); } protected abstract boolean messagingReceiveInstrumentationEnabled(); private boolean useMessagingPropagator() { - return getBoolean( - false, "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging"); + return getBoolean(false, "aws_sdk", "experimental_use_propagator_for_messaging"); } private boolean recordIndividualHttpError() { - return getBoolean( - false, "otel.instrumentation.aws-sdk.experimental-record-individual-http-error"); + return getBoolean(false, "aws_sdk", "experimental_record_individual_http_error"); } private boolean genaiCaptureMessageContent() { - return getBoolean(false, "otel.instrumentation.genai.capture-message-content"); + return getBoolean(false, "genai", "capture_message_content"); } protected abstract boolean getBoolean(boolean defaultValue, String... name); From 06e76b00c55452c2b5fbad23a8646fe2025a0227 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 09:09:48 +0100 Subject: [PATCH 13/33] string --- .../api/instrumenter/InstrumenterBuilder.java | 10 +++--- .../api/internal/ConfigPropertiesUtil.java | 32 +++++++++++++------ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index eb80bd8dd1d7..e55a96ddb7c2 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -49,11 +49,6 @@ public final class InstrumenterBuilder { private static final Logger logger = Logger.getLogger(InstrumenterBuilder.class.getName()); - private static final SpanSuppressionStrategy spanSuppressionStrategy = - SpanSuppressionStrategy.fromConfig( - ConfigPropertiesUtil.getString( - "otel.instrumentation.experimental.span-suppression-strategy")); - final OpenTelemetry openTelemetry; final String instrumentationName; SpanNameExtractor spanNameExtractor; @@ -374,7 +369,10 @@ private String getSchemaUrl() { SpanSuppressor buildSpanSuppressor() { return new SpanSuppressors.ByContextKey( - spanSuppressionStrategy.create(getSpanKeysFromAttributesExtractors())); + SpanSuppressionStrategy.fromConfig( + ConfigPropertiesUtil.getNullableString( + openTelemetry, "experimental", "span_suppression_strategy")) + .create(getSpanKeysFromAttributesExtractors())); } private Set getSpanKeysFromAttributesExtractors() { diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 7e65a83fd811..36911ab7b7f3 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.api.internal; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; +import static java.util.Objects.requireNonNull; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; @@ -87,18 +88,29 @@ public static String getString(String propertyName) { return System.getenv(toEnvVarName(propertyName)); } - private static String getString(String propertyName, String defaultValue) { - String strValue = getString(propertyName); - return strValue == null ? defaultValue : strValue; - } - public static String getString( OpenTelemetry openTelemetry, String defaultValue, String... propertyName) { - return getDeclarativeConfigOrFallback( - openTelemetry, - propertyName, - (node, key) -> node.getString(key, defaultValue), - (key) -> getString(key, defaultValue)); + return requireNonNull(getStringImpl(openTelemetry, defaultValue, propertyName)); + } + + @Nullable + public static String getStringImpl( + OpenTelemetry openTelemetry, @Nullable String defaultValue, String... propertyName) { + String result = + getDeclarativeConfigOrFallback( + openTelemetry, + propertyName, + (node, key) -> node.getString(key), + (key) -> getString(key)); + if (result == null) { + return defaultValue; + } + return result; + } + + @Nullable + public static String getNullableString(OpenTelemetry openTelemetry, String... propertyName) { + return getStringImpl(openTelemetry, null, propertyName); } private static List getList(String propertyName, List defaultValue) { From d7d11a2bbe2c4209c5e7f888864febae77a3d5fc Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 09:14:59 +0100 Subject: [PATCH 14/33] string --- .../api/instrumenter/InstrumenterBuilder.java | 4 +-- .../instrumenter/SpanSuppressionStrategy.java | 6 +--- .../api/internal/ConfigPropertiesUtil.java | 30 +++++-------------- .../SpanSuppressionStrategyTest.java | 3 +- 4 files changed, 12 insertions(+), 31 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index e55a96ddb7c2..bfe5a57a5d13 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -370,8 +370,8 @@ private String getSchemaUrl() { SpanSuppressor buildSpanSuppressor() { return new SpanSuppressors.ByContextKey( SpanSuppressionStrategy.fromConfig( - ConfigPropertiesUtil.getNullableString( - openTelemetry, "experimental", "span_suppression_strategy")) + ConfigPropertiesUtil.getString( + openTelemetry, "semconv", "experimental", "span_suppression_strategy")) .create(getSpanKeysFromAttributesExtractors())); } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java index 6210a74c8154..d9a40e89f164 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java @@ -17,7 +17,6 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import javax.annotation.Nullable; enum SpanSuppressionStrategy { /** Do not suppress spans at all. */ @@ -74,10 +73,7 @@ SpanSuppressor create(Set spanKeys) { abstract SpanSuppressor create(Set spanKeys); - static SpanSuppressionStrategy fromConfig(@Nullable String value) { - if (value == null) { - value = "semconv"; - } + static SpanSuppressionStrategy fromConfig(String value) { switch (value.toLowerCase(Locale.ROOT)) { case "none": return NONE; diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 36911ab7b7f3..1f85537caf79 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.api.internal; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; -import static java.util.Objects.requireNonNull; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; @@ -90,27 +89,14 @@ public static String getString(String propertyName) { public static String getString( OpenTelemetry openTelemetry, String defaultValue, String... propertyName) { - return requireNonNull(getStringImpl(openTelemetry, defaultValue, propertyName)); - } - - @Nullable - public static String getStringImpl( - OpenTelemetry openTelemetry, @Nullable String defaultValue, String... propertyName) { - String result = - getDeclarativeConfigOrFallback( - openTelemetry, - propertyName, - (node, key) -> node.getString(key), - (key) -> getString(key)); - if (result == null) { - return defaultValue; - } - return result; - } - - @Nullable - public static String getNullableString(OpenTelemetry openTelemetry, String... propertyName) { - return getStringImpl(openTelemetry, null, propertyName); + return getDeclarativeConfigOrFallback( + openTelemetry, + propertyName, + (node, key) -> node.getString(key, defaultValue), + (key) -> { + String strValue = getString(key); + return strValue == null ? defaultValue : strValue; + }); } private static List getList(String propertyName, List defaultValue) { diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java index 6091c512dea3..d15f564d080f 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java @@ -45,8 +45,7 @@ private static Stream configArgs() { Arguments.of("Span-Kind", SpanSuppressionStrategy.SPAN_KIND), Arguments.of("semconv", SpanSuppressionStrategy.SEMCONV), Arguments.of("SemConv", SpanSuppressionStrategy.SEMCONV), - Arguments.of("asdfasdfasdf", SpanSuppressionStrategy.SEMCONV), - Arguments.of(null, SpanSuppressionStrategy.SEMCONV)); + Arguments.of("asdfasdfasdf", SpanSuppressionStrategy.SEMCONV)); } @ParameterizedTest From 894b8360241cb3d932523993de7c1de83498c8c4 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 09:27:06 +0100 Subject: [PATCH 15/33] javadoc --- .../api/internal/ConfigPropertiesUtil.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 1f85537caf79..5c4e530bb007 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -66,6 +66,10 @@ public static boolean getBoolean( (key) -> getBoolean(key, defaultValue)); } + /** + * Returns the int value of the given property name from system properties and environment + * variables. + */ public static int getInt(String propertyName, int defaultValue) { String strValue = getString(propertyName); if (strValue == null) { @@ -78,6 +82,13 @@ public static int getInt(String propertyName, int defaultValue) { } } + /** + * Returns the string value of the given property name from system properties and environment + * variables. + * + *

It's recommended to use {@link #getString(OpenTelemetry, String, String...)} instead to + * support Declarative Config. + */ @Nullable public static String getString(String propertyName) { String value = System.getProperty(propertyName); @@ -87,6 +98,10 @@ public static String getString(String propertyName) { return System.getenv(toEnvVarName(propertyName)); } + /** + * Returns the string value of the given property name from Declarative Config if available, + * otherwise falls back to system properties and environment variables. + */ public static String getString( OpenTelemetry openTelemetry, String defaultValue, String... propertyName) { return getDeclarativeConfigOrFallback( @@ -99,21 +114,23 @@ public static String getString( }); } - private static List getList(String propertyName, List defaultValue) { - String value = getString(propertyName); - if (value == null) { - return defaultValue; - } - return filterBlanksAndNulls(value.split(",")); - } - + /** + * Returns the list of strings value of the given property name from Declarative Config if + * available, otherwise falls back to system properties and environment variables. + */ public static List getList( OpenTelemetry openTelemetry, List defaultValue, String... propertyName) { return getDeclarativeConfigOrFallback( openTelemetry, propertyName, (node, key) -> node.getScalarList(key, String.class, defaultValue), - (key) -> getList(key, defaultValue)); + (key) -> { + String value = getString(key); + if (value == null) { + return defaultValue; + } + return filterBlanksAndNulls(value.split(",")); + }); } private static List filterBlanksAndNulls(String[] values) { From f25fcd53bb04d7ebe5e5a8931f31f3f340e2cd92 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 10:04:08 +0100 Subject: [PATCH 16/33] add contract --- instrumentation-api/build.gradle.kts | 1 + .../api/instrumenter/InstrumenterBuilder.java | 14 ++++++++++---- .../api/instrumenter/SpanSuppressionStrategy.java | 6 +++++- .../api/internal/ConfigPropertiesUtil.java | 11 +++++++++-- .../servlet/ExperimentalSnippetHolder.java | 11 ++++++++++- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/instrumentation-api/build.gradle.kts b/instrumentation-api/build.gradle.kts index 38dfcbf8a6a5..257dfda342af 100644 --- a/instrumentation-api/build.gradle.kts +++ b/instrumentation-api/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { implementation("io.opentelemetry.semconv:opentelemetry-semconv") compileOnly("com.google.auto.value:auto-value-annotations") + compileOnly("org.jetbrains:annotations:26.0.2") annotationProcessor("com.google.auto.value:auto-value") testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common") diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index bfe5a57a5d13..5f9d884f087e 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -368,11 +368,17 @@ private String getSchemaUrl() { } SpanSuppressor buildSpanSuppressor() { + // otel.instrumentation.experimental.* doesn't fit the usual pattern of configuration properties + // for instrumentations, so we need to handle both declarative and non-declarative configs here + + String value = + ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) + ? ConfigPropertiesUtil.getString( + openTelemetry, null, "common", "experimental", "span_suppression_strategy") + : ConfigPropertiesUtil.getString( + "otel.instrumentation.experimental.span-suppression-strategy"); return new SpanSuppressors.ByContextKey( - SpanSuppressionStrategy.fromConfig( - ConfigPropertiesUtil.getString( - openTelemetry, "semconv", "experimental", "span_suppression_strategy")) - .create(getSpanKeysFromAttributesExtractors())); + SpanSuppressionStrategy.fromConfig(value).create(getSpanKeysFromAttributesExtractors())); } private Set getSpanKeysFromAttributesExtractors() { diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java index d9a40e89f164..6210a74c8154 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategy.java @@ -17,6 +17,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import javax.annotation.Nullable; enum SpanSuppressionStrategy { /** Do not suppress spans at all. */ @@ -73,7 +74,10 @@ SpanSuppressor create(Set spanKeys) { abstract SpanSuppressor create(Set spanKeys); - static SpanSuppressionStrategy fromConfig(String value) { + static SpanSuppressionStrategy fromConfig(@Nullable String value) { + if (value == null) { + value = "semconv"; + } switch (value.toLowerCase(Locale.ROOT)) { case "none": return NONE; diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 5c4e530bb007..7538fc860d2d 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import org.jetbrains.annotations.Contract; import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -102,8 +103,9 @@ public static String getString(String propertyName) { * Returns the string value of the given property name from Declarative Config if available, * otherwise falls back to system properties and environment variables. */ + @Contract("_, !null, _ -> !null") public static String getString( - OpenTelemetry openTelemetry, String defaultValue, String... propertyName) { + OpenTelemetry openTelemetry, @Nullable String defaultValue, String... propertyName) { return getDeclarativeConfigOrFallback( openTelemetry, propertyName, @@ -133,6 +135,11 @@ public static List getList( }); } + /** Returns true if the given OpenTelemetry instance supports Declarative Config. */ + public static boolean isDeclarativeConfig(OpenTelemetry openTelemetry) { + return isIncubator && openTelemetry instanceof ExtendedOpenTelemetry; + } + private static List filterBlanksAndNulls(String[] values) { return Arrays.stream(values) .map(String::trim) @@ -159,7 +166,7 @@ private static T getDeclarativeConfigOrFallback( @Nullable private static DeclarativeConfigProperties getDeclarativeConfigNode( OpenTelemetry openTelemetry, String... propertyName) { - if (isIncubator && openTelemetry instanceof ExtendedOpenTelemetry) { + if (isDeclarativeConfig(openTelemetry)) { ExtendedOpenTelemetry extendedOpenTelemetry = (ExtendedOpenTelemetry) openTelemetry; ConfigProvider configProvider = extendedOpenTelemetry.getConfigProvider(); DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig(); diff --git a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java index ebfc41e7b72b..9c1d44b65449 100644 --- a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java +++ b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.bootstrap.servlet; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; public class ExperimentalSnippetHolder { @@ -12,7 +14,14 @@ public class ExperimentalSnippetHolder { private static volatile String snippet = getSnippetSetting(); private static String getSnippetSetting() { - String result = ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet"); + OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); + String result = + // otel.experimental.* does not fit the usual pattern of configuration properties for + // instrumentations, so we need to handle both declarative and non-declarative configs here + ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) + ? ConfigPropertiesUtil.getString( + openTelemetry, null, "servlet", "experimental", "javascript-snippet") + : ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet"); return result == null ? "" : result; } From acc63ddb5150567c573d0235d976cc00435e1995 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 10:04:36 +0100 Subject: [PATCH 17/33] add contract --- .../instrumentation/api/instrumenter/InstrumenterBuilder.java | 1 - .../instrumentation/api/internal/ConfigPropertiesUtil.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index 5f9d884f087e..cbbcc98af574 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -370,7 +370,6 @@ private String getSchemaUrl() { SpanSuppressor buildSpanSuppressor() { // otel.instrumentation.experimental.* doesn't fit the usual pattern of configuration properties // for instrumentations, so we need to handle both declarative and non-declarative configs here - String value = ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) ? ConfigPropertiesUtil.getString( diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 7538fc860d2d..66bc95bbb09d 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -11,7 +11,6 @@ import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import org.jetbrains.annotations.Contract; import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -19,6 +18,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; +import org.jetbrains.annotations.Contract; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at From 55f7cd0aed96c0d41b1ccc6e2e1ddab29444561f Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 10:14:51 +0100 Subject: [PATCH 18/33] remove contract --- instrumentation-api/build.gradle.kts | 1 - .../api/instrumenter/InstrumenterBuilder.java | 2 +- .../api/internal/ConfigPropertiesUtil.java | 27 +++++++++++-------- .../internal/ConfigPropertiesUtilTest.java | 4 +-- .../v2_17/internal/ContextDataKeys.java | 6 ++--- .../servlet/ExperimentalSnippetHolder.java | 2 +- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/instrumentation-api/build.gradle.kts b/instrumentation-api/build.gradle.kts index 257dfda342af..38dfcbf8a6a5 100644 --- a/instrumentation-api/build.gradle.kts +++ b/instrumentation-api/build.gradle.kts @@ -17,7 +17,6 @@ dependencies { implementation("io.opentelemetry.semconv:opentelemetry-semconv") compileOnly("com.google.auto.value:auto-value-annotations") - compileOnly("org.jetbrains:annotations:26.0.2") annotationProcessor("com.google.auto.value:auto-value") testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common") diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index cbbcc98af574..0be54539cb74 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -373,7 +373,7 @@ SpanSuppressor buildSpanSuppressor() { String value = ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) ? ConfigPropertiesUtil.getString( - openTelemetry, null, "common", "experimental", "span_suppression_strategy") + openTelemetry, "common", "experimental", "span_suppression_strategy") : ConfigPropertiesUtil.getString( "otel.instrumentation.experimental.span-suppression-strategy"); return new SpanSuppressors.ByContextKey( diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 66bc95bbb09d..45f8a739c21a 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -18,7 +18,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.jetbrains.annotations.Contract; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -103,17 +102,23 @@ public static String getString(String propertyName) { * Returns the string value of the given property name from Declarative Config if available, * otherwise falls back to system properties and environment variables. */ - @Contract("_, !null, _ -> !null") - public static String getString( - OpenTelemetry openTelemetry, @Nullable String defaultValue, String... propertyName) { + @Nullable + public static String getString(OpenTelemetry openTelemetry, String... propertyName) { return getDeclarativeConfigOrFallback( - openTelemetry, - propertyName, - (node, key) -> node.getString(key, defaultValue), - (key) -> { - String strValue = getString(key); - return strValue == null ? defaultValue : strValue; - }); + openTelemetry, propertyName, (node, key) -> node.getString(key), (key) -> getString(key)); + } + + /** + * Returns the string value of the given property name from Declarative Config if available, + * otherwise falls back to system properties and environment variables. + */ + public static String getStringOrFallback( + OpenTelemetry openTelemetry, String defaultValue, String... propertyName) { + String value = getString(openTelemetry, propertyName); + if (value == null) { + return defaultValue; + } + return value; } /** diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 6631263df632..8985c67ca95f 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -66,7 +66,7 @@ void getString_withOpenTelemetry_none() { private static void assertString(String expected) { assertThat( - ConfigPropertiesUtil.getString( + ConfigPropertiesUtil.getStringOrFallback( OpenTelemetry.noop(), "default_value", "test", "property", "string")) .isEqualTo(expected); } @@ -84,7 +84,7 @@ public static Stream stringValuesProvider() { @MethodSource("stringValuesProvider") void getString_declarativeConfig(Object property, String expected) { assertThat( - ConfigPropertiesUtil.getString( + ConfigPropertiesUtil.getStringOrFallback( DeclarativeConfiguration.create(model(property)), "default_value", "foo", "bar")) .isEqualTo(expected); } diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java index 54fbe5d5890d..082248d0dff8 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java @@ -15,21 +15,21 @@ */ public final class ContextDataKeys { public static final String TRACE_ID_KEY = - ConfigPropertiesUtil.getString( + ConfigPropertiesUtil.getStringOrFallback( GlobalOpenTelemetry.get(), LoggingContextConstants.TRACE_ID, "common", "logging", "trace_id"); public static final String SPAN_ID_KEY = - ConfigPropertiesUtil.getString( + ConfigPropertiesUtil.getStringOrFallback( GlobalOpenTelemetry.get(), LoggingContextConstants.SPAN_ID, "common", "logging", "span_id"); public static final String TRACE_FLAGS_KEY = - ConfigPropertiesUtil.getString( + ConfigPropertiesUtil.getStringOrFallback( GlobalOpenTelemetry.get(), LoggingContextConstants.TRACE_FLAGS, "common", diff --git a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java index 9c1d44b65449..a8033fcceb92 100644 --- a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java +++ b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java @@ -20,7 +20,7 @@ private static String getSnippetSetting() { // instrumentations, so we need to handle both declarative and non-declarative configs here ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) ? ConfigPropertiesUtil.getString( - openTelemetry, null, "servlet", "experimental", "javascript-snippet") + openTelemetry, "servlet", "experimental", "javascript-snippet") : ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet"); return result == null ? "" : result; } From 1ea8025163f3a05bd9af030d3029f4d10dbeed65 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 10:46:37 +0100 Subject: [PATCH 19/33] remove contract --- .../instrumentation/api/internal/ConfigPropertiesUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 45f8a739c21a..09971e145356 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -86,7 +86,7 @@ public static int getInt(String propertyName, int defaultValue) { * Returns the string value of the given property name from system properties and environment * variables. * - *

It's recommended to use {@link #getString(OpenTelemetry, String, String...)} instead to + *

It's recommended to use {@link #getString(OpenTelemetry, String...)} instead to * support Declarative Config. */ @Nullable From 2e8125141eba4871ee92c73ea7caca16f0ff1723 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 18 Nov 2025 10:53:43 +0100 Subject: [PATCH 20/33] inline method to avoid class not found exception for DeclarativeConfigProperties --- .../api/internal/ConfigPropertiesUtil.java | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 09971e145356..edd6bd0754ae 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -14,8 +14,6 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; -import java.util.function.BiFunction; -import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -59,11 +57,11 @@ public static boolean getBoolean(String propertyName, boolean defaultValue) { */ public static boolean getBoolean( OpenTelemetry openTelemetry, boolean defaultValue, String... propertyName) { - return getDeclarativeConfigOrFallback( - openTelemetry, - propertyName, - (node, key) -> node.getBoolean(key, defaultValue), - (key) -> getBoolean(key, defaultValue)); + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return node.getBoolean(leaf(propertyName), defaultValue); + } + return getBoolean(toSystemProperty(propertyName), defaultValue); } /** @@ -86,8 +84,8 @@ public static int getInt(String propertyName, int defaultValue) { * Returns the string value of the given property name from system properties and environment * variables. * - *

It's recommended to use {@link #getString(OpenTelemetry, String...)} instead to - * support Declarative Config. + *

It's recommended to use {@link #getString(OpenTelemetry, String...)} instead to support + * Declarative Config. */ @Nullable public static String getString(String propertyName) { @@ -104,8 +102,11 @@ public static String getString(String propertyName) { */ @Nullable public static String getString(OpenTelemetry openTelemetry, String... propertyName) { - return getDeclarativeConfigOrFallback( - openTelemetry, propertyName, (node, key) -> node.getString(key), (key) -> getString(key)); + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return node.getString(leaf(propertyName)); + } + return getString(toSystemProperty(propertyName)); } /** @@ -127,17 +128,15 @@ public static String getStringOrFallback( */ public static List getList( OpenTelemetry openTelemetry, List defaultValue, String... propertyName) { - return getDeclarativeConfigOrFallback( - openTelemetry, - propertyName, - (node, key) -> node.getScalarList(key, String.class, defaultValue), - (key) -> { - String value = getString(key); - if (value == null) { - return defaultValue; - } - return filterBlanksAndNulls(value.split(",")); - }); + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return node.getScalarList(leaf(propertyName), String.class, defaultValue); + } + String value = getString(toSystemProperty(propertyName)); + if (value == null) { + return defaultValue; + } + return filterBlanksAndNulls(value.split(",")); } /** Returns true if the given OpenTelemetry instance supports Declarative Config. */ @@ -156,16 +155,8 @@ private static String toEnvVarName(String propertyName) { return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_'); } - private static T getDeclarativeConfigOrFallback( - OpenTelemetry openTelemetry, - String[] propertyName, - BiFunction getter, - Function fallback) { - DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); - if (node != null) { - return getter.apply(node, propertyName[propertyName.length - 1]); - } - return fallback.apply(toSystemProperty(propertyName)); + private static String leaf(String[] propertyName) { + return propertyName[propertyName.length - 1]; } @Nullable From 4ac86c4d02b57cb12368993452b45e1c44eb43a0 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 08:18:58 +0100 Subject: [PATCH 21/33] pr review --- .../instrumentation/api/internal/ConfigPropertiesUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index edd6bd0754ae..df207d752aa5 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -23,9 +23,9 @@ */ public final class ConfigPropertiesUtil { - private static final boolean isIncubator = isIncubator(); + private static final boolean supportsDeclarativeConfig = supportsDeclarativeConfig(); - private static boolean isIncubator() { + private static boolean supportsDeclarativeConfig() { try { Class.forName("io.opentelemetry.api.incubator.ExtendedOpenTelemetry"); return true; @@ -141,7 +141,7 @@ public static List getList( /** Returns true if the given OpenTelemetry instance supports Declarative Config. */ public static boolean isDeclarativeConfig(OpenTelemetry openTelemetry) { - return isIncubator && openTelemetry instanceof ExtendedOpenTelemetry; + return supportsDeclarativeConfig && openTelemetry instanceof ExtendedOpenTelemetry; } private static List filterBlanksAndNulls(String[] values) { From 17d3014365f8024cb4512d216cd1c3c517ab241d Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 08:41:54 +0100 Subject: [PATCH 22/33] use optional instead of providing default for boolean --- .../api/internal/ConfigPropertiesUtil.java | 17 ++++++++--------- .../api/internal/ContextPropagationDebug.java | 9 ++++++--- .../api/internal/SupportabilityMetrics.java | 2 +- .../api/internal/ConfigPropertiesUtilTest.java | 11 +++++++---- .../autoconfigure/TracingRequestHandler.java | 6 ++++-- .../v2_2/autoconfigure/AwsSdkSingletons.java | 14 +++++++------- .../awssdk/v2_2/AbstractAws2ClientCoreTest.java | 3 ++- .../AbstractAws2ClientRecordHttpErrorTest.java | 3 ++- .../awssdk/v2_2/AbstractAws2SqsBaseTest.java | 3 ++- .../jdbc/OpenTelemetryDriver.java | 6 ++++-- .../jdbc/internal/JdbcInstrumenterFactory.java | 9 ++++++--- .../v2_6/TracingConsumerInterceptor.java | 8 ++------ .../v2_17/OpenTelemetryContextDataProvider.java | 4 +++- .../javaagent/bootstrap/AgentInitializer.java | 2 +- .../tooling/SpanLoggingCustomizerProvider.java | 2 +- .../tooling/config/EarlyInitAgentConfig.java | 2 +- 16 files changed, 57 insertions(+), 44 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index df207d752aa5..2bef34221e31 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -14,6 +14,7 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -43,25 +44,23 @@ private static boolean supportsDeclarativeConfig() { * Returns the boolean value of the given property name from system properties and environment * variables. * - *

It's recommended to use {@link #getBoolean(OpenTelemetry, boolean, String...)} instead to - * support Declarative Config. + *

It's recommended to use {@link #getBoolean(OpenTelemetry, String...)} instead to support + * Declarative Config. */ - public static boolean getBoolean(String propertyName, boolean defaultValue) { - String strValue = getString(propertyName); - return strValue == null ? defaultValue : Boolean.parseBoolean(strValue); + public static Optional getBoolean(String propertyName) { + return Optional.ofNullable(getString(propertyName)).map(Boolean::parseBoolean); } /** * Returns the boolean value of the given property name from Declarative Config if available, * otherwise falls back to system properties and environment variables. */ - public static boolean getBoolean( - OpenTelemetry openTelemetry, boolean defaultValue, String... propertyName) { + public static Optional getBoolean(OpenTelemetry openTelemetry, String... propertyName) { DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); if (node != null) { - return node.getBoolean(leaf(propertyName), defaultValue); + return Optional.ofNullable(node.getBoolean(leaf(propertyName))); } - return getBoolean(toSystemProperty(propertyName), defaultValue); + return getBoolean(toSystemProperty(propertyName)); } /** diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java index cf698069fc05..4e74e7c50522 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java @@ -32,13 +32,16 @@ public final class ContextPropagationDebug { private static final boolean FAIL_ON_CONTEXT_LEAK; static { - boolean agentDebugEnabled = ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false); + boolean agentDebugEnabled = + ConfigPropertiesUtil.getBoolean("otel.javaagent.debug").orElse(false); THREAD_PROPAGATION_DEBUGGER = ConfigPropertiesUtil.getBoolean( - "otel.javaagent.experimental.thread-propagation-debugger.enabled", agentDebugEnabled); + "otel.javaagent.experimental.thread-propagation-debugger.enabled") + .orElse(agentDebugEnabled); FAIL_ON_CONTEXT_LEAK = - ConfigPropertiesUtil.getBoolean("otel.javaagent.testing.fail-on-context-leak", false); + ConfigPropertiesUtil.getBoolean("otel.javaagent.testing.fail-on-context-leak") + .orElse(false); } // context to which debug locations were added diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java index cf91c4274c32..4e4130c4824c 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java @@ -30,7 +30,7 @@ public final class SupportabilityMetrics { private static final SupportabilityMetrics INSTANCE = new SupportabilityMetrics( - ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false), logger::fine) + ConfigPropertiesUtil.getBoolean("otel.javaagent.debug").orElse(false), logger::fine) .start(); public static SupportabilityMetrics instance() { diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 8985c67ca95f..e844a6caab75 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -132,11 +132,13 @@ void getBoolean_none() { } private static void assertBoolean(boolean expected) { - assertThat(ConfigPropertiesUtil.getBoolean("otel.instrumentation.test.property.boolean", false)) + assertThat( + ConfigPropertiesUtil.getBoolean("otel.instrumentation.test.property.boolean") + .orElse(false)) .isEqualTo(expected); assertThat( - ConfigPropertiesUtil.getBoolean( - OpenTelemetry.noop(), false, "test", "property", "boolean")) + ConfigPropertiesUtil.getBoolean(OpenTelemetry.noop(), "test", "property", "boolean") + .orElse(false)) .isEqualTo(expected); } @@ -154,7 +156,8 @@ public static Stream booleanValuesProvider() { void getBoolean_declarativeConfig(Object property, boolean expected) { assertThat( ConfigPropertiesUtil.getBoolean( - DeclarativeConfiguration.create(model(property)), false, "foo", "bar")) + DeclarativeConfiguration.create(model(property)), "foo", "bar") + .orElse(false)) .isEqualTo(expected); } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java index 8900f1d89764..ea449e6e6ddb 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java @@ -27,10 +27,12 @@ private static RequestHandler2 buildDelegate(OpenTelemetry openTelemetry) { return AwsSdkTelemetry.builder(openTelemetry) .setCaptureExperimentalSpanAttributes( ConfigPropertiesUtil.getBoolean( - openTelemetry, false, "aws_sdk", "experimental_span_attributes")) + openTelemetry, "aws_sdk", "experimental_span_attributes") + .orElse(false)) .setMessagingReceiveInstrumentationEnabled( ConfigPropertiesUtil.getBoolean( - openTelemetry, false, "messaging", "experimental", "receive_telemetry", "enabled")) + openTelemetry, "messaging", "experimental", "receive_telemetry", "enabled") + .orElse(false)) .setCapturedHeaders( ConfigPropertiesUtil.getList( openTelemetry, emptyList(), "messaging", "experimental", "capture_headers")) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java index 4d4dd601e631..60d9a167de99 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java @@ -32,17 +32,17 @@ protected List getCapturedHeaders() { @Override protected boolean messagingReceiveInstrumentationEnabled() { return ConfigPropertiesUtil.getBoolean( - GlobalOpenTelemetry.get(), - false, - "messaging", - "experimental", - "receive_telemetry", - "enabled"); + GlobalOpenTelemetry.get(), + "messaging", + "experimental", + "receive_telemetry", + "enabled") + .orElse(false); } @Override protected boolean getBoolean(boolean defaultValue, String... name) { - return ConfigPropertiesUtil.getBoolean(GlobalOpenTelemetry.get(), defaultValue, name); + return ConfigPropertiesUtil.getBoolean(GlobalOpenTelemetry.get(), name).orElse(defaultValue); } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java index f34767d4a771..de9de748436f 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java @@ -101,7 +101,8 @@ public abstract class AbstractAws2ClientCoreTest { protected static boolean isSqsAttributeInjectionEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging", false); + "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging") + .orElse(false); } protected void configureSdkClient(SdkClientBuilder builder) { diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java index 582af3e4a941..9825935d4b9c 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java @@ -126,7 +126,8 @@ private static void cleanResponses() { public boolean isRecordIndividualHttpErrorEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.aws-sdk.experimental-record-individual-http-error", false); + "otel.instrumentation.aws-sdk.experimental-record-individual-http-error") + .orElse(false); } @SuppressWarnings("deprecation") // using deprecated semconv diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java index 3fb1636d551a..fd435a84c6b2 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java @@ -132,7 +132,8 @@ protected void configureSdkClient(SqsAsyncClientBuilder builder) throws URISynta protected boolean isSqsAttributeInjectionEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging", false); + "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging") + .orElse(false); } @BeforeAll diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java index dd8ed9c3a219..1a4a2803bf66 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/OpenTelemetryDriver.java @@ -66,11 +66,13 @@ public final class OpenTelemetryDriver implements Driver { private static SqlCommenter getSqlCommenter(OpenTelemetry openTelemetry) { boolean defaultValue = ConfigPropertiesUtil.getBoolean( - openTelemetry, false, "common", "experimental", "db_sqlcommenter", "enabled"); + openTelemetry, "common", "experimental", "db_sqlcommenter", "enabled") + .orElse(false); return SqlCommenter.builder() .setEnabled( ConfigPropertiesUtil.getBoolean( - openTelemetry, defaultValue, "jdbc", "experimental", "sqlcommenter", "enabled")) + openTelemetry, "jdbc", "experimental", "sqlcommenter", "enabled") + .orElse(defaultValue)) .build(); } diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java index 07c08fbd34e4..f810a8d345ad 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java @@ -30,7 +30,8 @@ public final class JdbcInstrumenterFactory { public static boolean captureQueryParameters(OpenTelemetry openTelemetry) { return ConfigPropertiesUtil.getBoolean( - openTelemetry, false, "jdbc", "experimental", "capture_query_parameters"); + openTelemetry, "jdbc", "experimental", "capture_query_parameters") + .orElse(false); } public static Instrumenter createStatementInstrumenter( @@ -45,7 +46,8 @@ static Instrumenter createStatementInstrumenter( emptyList(), true, ConfigPropertiesUtil.getBoolean( - openTelemetry, true, "common", "db_statement_sanitizer", "enabled"), + openTelemetry, "common", "db_statement_sanitizer", "enabled") + .orElse(true), captureQueryParameters); } @@ -95,7 +97,8 @@ public static Instrumenter createTransactionInstrumenter( return createTransactionInstrumenter( openTelemetry, ConfigPropertiesUtil.getBoolean( - openTelemetry, false, "jdbc", "experimental", "transaction", "enabled")); + openTelemetry, "jdbc", "experimental", "transaction", "enabled") + .orElse(false)); } public static Instrumenter createTransactionInstrumenter( diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java index cce4f94f7e79..1828f97ec8de 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java @@ -41,12 +41,8 @@ public class TracingConsumerInterceptor implements ConsumerInterceptor staticContextData = getStaticContextData(); diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java index 509d13964d3b..dcd41a32e83e 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java @@ -94,7 +94,7 @@ private static boolean getBoolean(String property, boolean defaultValue) { new PrivilegedAction() { @Override public Boolean run() { - return ConfigPropertiesUtil.getBoolean(property, defaultValue); + return ConfigPropertiesUtil.getBoolean(property).orElse(defaultValue); } }); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java index 00634e858503..14d0fde72e97 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java @@ -19,6 +19,6 @@ public class SpanLoggingCustomizerProvider extends AbstractSpanLoggingCustomizer protected boolean isEnabled(OpenTelemetryConfigurationModel model) { // read from system properties as it's an early init property and the config bridge is not // available here - return ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false); + return ConfigPropertiesUtil.getBoolean("otel.javaagent.debug").orElse(false); } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java index d39f1b9cfd6a..3e4a601877e2 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java @@ -38,7 +38,7 @@ public boolean getBoolean(String propertyName, boolean defaultValue) { String configFileValueStr = configFileContents.get(propertyName); boolean configFileValue = configFileValueStr == null ? defaultValue : Boolean.parseBoolean(configFileValueStr); - return ConfigPropertiesUtil.getBoolean(propertyName, configFileValue); + return ConfigPropertiesUtil.getBoolean(propertyName).orElse(configFileValue); } public int getInt(String propertyName, int defaultValue) { From 2897e57ac6e20bb511000c4f2678b297039c7f98 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 08:49:28 +0100 Subject: [PATCH 23/33] use optional instead of providing default for int --- .../api/internal/ConfigPropertiesUtil.java | 20 +++++++++---------- .../internal/ConfigPropertiesUtilTest.java | 8 ++++---- .../tooling/config/EarlyInitAgentConfig.java | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 2bef34221e31..99ef4708a1a2 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -67,16 +67,16 @@ public static Optional getBoolean(OpenTelemetry openTelemetry, String.. * Returns the int value of the given property name from system properties and environment * variables. */ - public static int getInt(String propertyName, int defaultValue) { - String strValue = getString(propertyName); - if (strValue == null) { - return defaultValue; - } - try { - return Integer.parseInt(strValue); - } catch (NumberFormatException ignored) { - return defaultValue; - } + public static Optional getInt(String propertyName) { + return Optional.ofNullable(getString(propertyName)) + .flatMap( + s -> { + try { + return Optional.of(Integer.parseInt(s)); + } catch (NumberFormatException ignored) { + return Optional.empty(); + } + }); } /** diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index e844a6caab75..e10354052693 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -93,24 +93,24 @@ void getString_declarativeConfig(Object property, String expected) { @SetSystemProperty(key = "test.property.int", value = "42") @Test void getInt_systemProperty() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(42); + assertThat(ConfigPropertiesUtil.getInt("test.property.int")).hasValue(42); } @SetEnvironmentVariable(key = "TEST_PROPERTY_INT", value = "12") @Test void getInt_environmentVariable() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(12); + assertThat(ConfigPropertiesUtil.getInt("test.property.int")).hasValue(12); } @Test void getInt_none() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(-1); + assertThat(ConfigPropertiesUtil.getInt("test.property.int")).isEmpty(); } @SetSystemProperty(key = "test.property.int", value = "not a number") @Test void getInt_invalidNumber() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(-1); + assertThat(ConfigPropertiesUtil.getInt("test.property.int")).isEmpty(); } @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_BOOLEAN", value = "false") diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java index 3e4a601877e2..b1ee741a9e8e 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java @@ -46,7 +46,7 @@ public int getInt(String propertyName, int defaultValue) { String configFileValueStr = configFileContents.get(propertyName); int configFileValue = configFileValueStr == null ? defaultValue : Integer.parseInt(configFileValueStr); - return ConfigPropertiesUtil.getInt(propertyName, configFileValue); + return ConfigPropertiesUtil.getInt(propertyName).orElse(configFileValue); } catch (NumberFormatException ignored) { return defaultValue; } From ce07aa32b1cbfc00a3cc0b964c520e01e04f3d2d Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 08:51:21 +0100 Subject: [PATCH 24/33] use optional instead of providing default for list --- .../api/internal/ConfigPropertiesUtil.java | 8 ++++---- .../api/internal/ConfigPropertiesUtilTest.java | 6 ++---- .../awssdk/v1_11/autoconfigure/TracingRequestHandler.java | 4 +--- .../awssdk/v2_2/autoconfigure/AwsSdkSingletons.java | 4 +--- .../kafkaclients/v2_6/TracingConsumerInterceptor.java | 4 +--- .../kafkaclients/v2_6/TracingProducerInterceptor.java | 4 +--- 6 files changed, 10 insertions(+), 20 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 99ef4708a1a2..feccde0e4c84 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.api.internal; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; +import static java.util.Collections.emptyList; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; @@ -125,15 +126,14 @@ public static String getStringOrFallback( * Returns the list of strings value of the given property name from Declarative Config if * available, otherwise falls back to system properties and environment variables. */ - public static List getList( - OpenTelemetry openTelemetry, List defaultValue, String... propertyName) { + public static List getList(OpenTelemetry openTelemetry, String... propertyName) { DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); if (node != null) { - return node.getScalarList(leaf(propertyName), String.class, defaultValue); + return node.getScalarList(leaf(propertyName), String.class, emptyList()); } String value = getString(toSystemProperty(propertyName)); if (value == null) { - return defaultValue; + return emptyList(); } return filterBlanksAndNulls(value.split(",")); } diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index e10354052693..2500f6227ce0 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -199,9 +199,7 @@ void getList_none() { } private static void assertList(List expected) { - assertThat( - ConfigPropertiesUtil.getList( - OpenTelemetry.noop(), emptyList(), "test", "property", "list")) + assertThat(ConfigPropertiesUtil.getList(OpenTelemetry.noop(), "test", "property", "list")) .isEqualTo(expected); } @@ -219,7 +217,7 @@ public static Stream listValuesProvider() { void getList_declarativeConfig(Object property, List expected) { assertThat( ConfigPropertiesUtil.getList( - DeclarativeConfiguration.create(model(property)), emptyList(), "foo", "bar")) + DeclarativeConfiguration.create(model(property)), "foo", "bar")) .isEqualTo(expected); } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java index ea449e6e6ddb..d7a81f290725 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/autoconfigure/TracingRequestHandler.java @@ -5,8 +5,6 @@ package io.opentelemetry.instrumentation.awssdk.v1_11.autoconfigure; -import static java.util.Collections.emptyList; - import com.amazonaws.AmazonWebServiceRequest; import com.amazonaws.Request; import com.amazonaws.Response; @@ -35,7 +33,7 @@ private static RequestHandler2 buildDelegate(OpenTelemetry openTelemetry) { .orElse(false)) .setCapturedHeaders( ConfigPropertiesUtil.getList( - openTelemetry, emptyList(), "messaging", "experimental", "capture_headers")) + openTelemetry, "messaging", "experimental", "capture_headers")) .build() .newRequestHandler(); } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java index 60d9a167de99..cf5b7b1daada 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java @@ -5,8 +5,6 @@ package io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure; -import static java.util.Collections.emptyList; - import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry; @@ -26,7 +24,7 @@ private static class AwsSdkTelemetryFactory extends AbstractAwsSdkTelemetryFacto @Override protected List getCapturedHeaders() { return ConfigPropertiesUtil.getList( - GlobalOpenTelemetry.get(), emptyList(), "messaging", "experimental", "capture_headers"); + GlobalOpenTelemetry.get(), "messaging", "experimental", "capture_headers"); } @Override diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java index 1828f97ec8de..08b6f0bdd5b9 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/TracingConsumerInterceptor.java @@ -5,8 +5,6 @@ package io.opentelemetry.instrumentation.kafkaclients.v2_6; -import static java.util.Collections.emptyList; - import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; @@ -45,7 +43,7 @@ public class TracingConsumerInterceptor implements ConsumerInterceptor implements ProducerInterceptor Date: Tue, 25 Nov 2025 09:05:46 +0100 Subject: [PATCH 25/33] use optional instead of providing default for string --- .../api/instrumenter/InstrumenterBuilder.java | 6 ++- .../api/internal/ConfigPropertiesUtil.java | 37 +++++-------------- .../api/internal/SemconvStability.java | 2 +- .../internal/ConfigPropertiesUtilTest.java | 16 ++++---- .../v2_17/internal/ContextDataKeys.java | 26 ++++--------- .../servlet/ExperimentalSnippetHolder.java | 5 ++- .../tooling/config/ConfigurationFile.java | 3 +- .../tooling/config/EarlyInitAgentConfig.java | 7 +--- 8 files changed, 39 insertions(+), 63 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index 0be54539cb74..493f8e723de3 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -373,9 +373,11 @@ SpanSuppressor buildSpanSuppressor() { String value = ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) ? ConfigPropertiesUtil.getString( - openTelemetry, "common", "experimental", "span_suppression_strategy") + openTelemetry, "common", "experimental", "span_suppression_strategy") + .orElse(null) : ConfigPropertiesUtil.getString( - "otel.instrumentation.experimental.span-suppression-strategy"); + "otel.instrumentation.experimental.span-suppression-strategy") + .orElse(null); return new SpanSuppressors.ByContextKey( SpanSuppressionStrategy.fromConfig(value).create(getSpanKeysFromAttributesExtractors())); } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index feccde0e4c84..7ad30e2f00e8 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -49,7 +49,7 @@ private static boolean supportsDeclarativeConfig() { * Declarative Config. */ public static Optional getBoolean(String propertyName) { - return Optional.ofNullable(getString(propertyName)).map(Boolean::parseBoolean); + return getString(propertyName).map(Boolean::parseBoolean); } /** @@ -69,7 +69,7 @@ public static Optional getBoolean(OpenTelemetry openTelemetry, String.. * variables. */ public static Optional getInt(String propertyName) { - return Optional.ofNullable(getString(propertyName)) + return getString(propertyName) .flatMap( s -> { try { @@ -87,41 +87,26 @@ public static Optional getInt(String propertyName) { *

It's recommended to use {@link #getString(OpenTelemetry, String...)} instead to support * Declarative Config. */ - @Nullable - public static String getString(String propertyName) { + public static Optional getString(String propertyName) { String value = System.getProperty(propertyName); if (value != null) { - return value; + return Optional.of(value); } - return System.getenv(toEnvVarName(propertyName)); + return Optional.ofNullable(System.getenv(toEnvVarName(propertyName))); } /** * Returns the string value of the given property name from Declarative Config if available, * otherwise falls back to system properties and environment variables. */ - @Nullable - public static String getString(OpenTelemetry openTelemetry, String... propertyName) { + public static Optional getString(OpenTelemetry openTelemetry, String... propertyName) { DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); if (node != null) { - return node.getString(leaf(propertyName)); + return Optional.ofNullable(node.getString(leaf(propertyName))); } return getString(toSystemProperty(propertyName)); } - /** - * Returns the string value of the given property name from Declarative Config if available, - * otherwise falls back to system properties and environment variables. - */ - public static String getStringOrFallback( - OpenTelemetry openTelemetry, String defaultValue, String... propertyName) { - String value = getString(openTelemetry, propertyName); - if (value == null) { - return defaultValue; - } - return value; - } - /** * Returns the list of strings value of the given property name from Declarative Config if * available, otherwise falls back to system properties and environment variables. @@ -131,11 +116,9 @@ public static List getList(OpenTelemetry openTelemetry, String... proper if (node != null) { return node.getScalarList(leaf(propertyName), String.class, emptyList()); } - String value = getString(toSystemProperty(propertyName)); - if (value == null) { - return emptyList(); - } - return filterBlanksAndNulls(value.split(",")); + return getString(toSystemProperty(propertyName)) + .map(value -> filterBlanksAndNulls(value.split(","))) + .orElse(emptyList()); } /** Returns true if the given OpenTelemetry instance supports Declarative Config. */ diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java index e54a62530b67..bc76ae088bab 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java @@ -31,7 +31,7 @@ public final class SemconvStability { boolean oldCode = true; boolean stableCode = false; - String value = ConfigPropertiesUtil.getString("otel.semconv-stability.opt-in"); + String value = ConfigPropertiesUtil.getString("otel.semconv-stability.opt-in").orElse(null); if (value != null) { Set values = new HashSet<>(asList(value.split(","))); diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 2500f6227ce0..5de2f0b87f3e 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -32,18 +32,18 @@ class ConfigPropertiesUtilTest { @SetSystemProperty(key = "test.property.string", value = "sys") @Test void getString_systemProperty() { - assertThat(ConfigPropertiesUtil.getString("test.property.string")).isEqualTo("sys"); + assertThat(ConfigPropertiesUtil.getString("test.property.string")).hasValue("sys"); } @SetEnvironmentVariable(key = "TEST_PROPERTY_STRING", value = "env") @Test void getString_environmentVariable() { - assertThat(ConfigPropertiesUtil.getString("test.property.string")).isEqualTo("env"); + assertThat(ConfigPropertiesUtil.getString("test.property.string")).hasValue("env"); } @Test void getString_none() { - assertThat(ConfigPropertiesUtil.getString("test.property.string")).isNull(); + assertThat(ConfigPropertiesUtil.getString("test.property.string")).isEmpty(); } @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_STRING", value = "env_value") @@ -66,8 +66,9 @@ void getString_withOpenTelemetry_none() { private static void assertString(String expected) { assertThat( - ConfigPropertiesUtil.getStringOrFallback( - OpenTelemetry.noop(), "default_value", "test", "property", "string")) + ConfigPropertiesUtil.getString( + OpenTelemetry.noop(), new String[] {"test", "property", "string"}) + .orElse("default_value")) .isEqualTo(expected); } @@ -83,9 +84,10 @@ public static Stream stringValuesProvider() { @ParameterizedTest @MethodSource("stringValuesProvider") void getString_declarativeConfig(Object property, String expected) { + OpenTelemetry openTelemetry = DeclarativeConfiguration.create(model(property)); assertThat( - ConfigPropertiesUtil.getStringOrFallback( - DeclarativeConfiguration.create(model(property)), "default_value", "foo", "bar")) + ConfigPropertiesUtil.getString(openTelemetry, new String[] {"foo", "bar"}) + .orElse("default_value")) .isEqualTo(expected); } diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java index 082248d0dff8..ed471c1a155a 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/internal/ContextDataKeys.java @@ -15,26 +15,16 @@ */ public final class ContextDataKeys { public static final String TRACE_ID_KEY = - ConfigPropertiesUtil.getStringOrFallback( - GlobalOpenTelemetry.get(), - LoggingContextConstants.TRACE_ID, - "common", - "logging", - "trace_id"); + ConfigPropertiesUtil.getString(GlobalOpenTelemetry.get(), "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + public static final String SPAN_ID_KEY = - ConfigPropertiesUtil.getStringOrFallback( - GlobalOpenTelemetry.get(), - LoggingContextConstants.SPAN_ID, - "common", - "logging", - "span_id"); + ConfigPropertiesUtil.getString(GlobalOpenTelemetry.get(), "common", "logging", "span_id") + .orElse(LoggingContextConstants.SPAN_ID); + public static final String TRACE_FLAGS_KEY = - ConfigPropertiesUtil.getStringOrFallback( - GlobalOpenTelemetry.get(), - LoggingContextConstants.TRACE_FLAGS, - "common", - "logging", - "trace_flags"); + ConfigPropertiesUtil.getString(GlobalOpenTelemetry.get(), "common", "logging", "trace_flags") + .orElse(LoggingContextConstants.TRACE_FLAGS); private ContextDataKeys() {} } diff --git a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java index a8033fcceb92..cc5f10c40e07 100644 --- a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java +++ b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import java.util.Optional; public class ExperimentalSnippetHolder { @@ -15,14 +16,14 @@ public class ExperimentalSnippetHolder { private static String getSnippetSetting() { OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); - String result = + Optional result = // otel.experimental.* does not fit the usual pattern of configuration properties for // instrumentations, so we need to handle both declarative and non-declarative configs here ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) ? ConfigPropertiesUtil.getString( openTelemetry, "servlet", "experimental", "javascript-snippet") : ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet"); - return result == null ? "" : result; + return result.orElse(""); } public static void setSnippet(String newValue) { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java index 4da9ca45f1fb..ddc6e5f740bf 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java @@ -47,7 +47,8 @@ static void resetForTest() { // visible for tests static Map loadConfigFile() { // Reading from system property first and from env after - String configurationFilePath = ConfigPropertiesUtil.getString(CONFIGURATION_FILE_PROPERTY); + String configurationFilePath = + ConfigPropertiesUtil.getString(CONFIGURATION_FILE_PROPERTY).orElse(null); if (configurationFilePath == null) { return emptyMap(); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java index b1ee741a9e8e..e9bb11bfc780 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java @@ -27,11 +27,8 @@ private EarlyInitAgentConfig(Map configFileContents) { @Nullable public String getString(String propertyName) { - String value = ConfigPropertiesUtil.getString(propertyName); - if (value != null) { - return value; - } - return configFileContents.get(propertyName); + return ConfigPropertiesUtil.getString(propertyName) + .orElseGet(() -> configFileContents.get(propertyName)); } public boolean getBoolean(String propertyName, boolean defaultValue) { From 2b5e2c49bd95d7e2458f4a48dceb107f07b74048 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 10:36:42 +0100 Subject: [PATCH 26/33] fix --- .../api/internal/ConfigPropertiesUtilTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index 5de2f0b87f3e..a25e8ca1f3d9 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -66,8 +66,7 @@ void getString_withOpenTelemetry_none() { private static void assertString(String expected) { assertThat( - ConfigPropertiesUtil.getString( - OpenTelemetry.noop(), new String[] {"test", "property", "string"}) + ConfigPropertiesUtil.getString(OpenTelemetry.noop(), "test", "property", "string") .orElse("default_value")) .isEqualTo(expected); } @@ -85,9 +84,7 @@ public static Stream stringValuesProvider() { @MethodSource("stringValuesProvider") void getString_declarativeConfig(Object property, String expected) { OpenTelemetry openTelemetry = DeclarativeConfiguration.create(model(property)); - assertThat( - ConfigPropertiesUtil.getString(openTelemetry, new String[] {"foo", "bar"}) - .orElse("default_value")) + assertThat(ConfigPropertiesUtil.getString(openTelemetry, "foo", "bar").orElse("default_value")) .isEqualTo(expected); } From fdbee40db4b8a89c20356507c66e4053077f23a2 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 11:06:12 +0100 Subject: [PATCH 27/33] fix --- .../ApplicationDeclarativeConfigProperties156Incubator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java index 731defc77272..73e84975b85f 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java @@ -92,8 +92,9 @@ public List getScalarList(String name, Class scalarType, List defau @Nullable @Override public DeclarativeConfigProperties getStructured(String name) { - return new ApplicationDeclarativeConfigProperties156Incubator( - instrumentationConfig.getStructured(name)); + io.opentelemetry.api.incubator.config.DeclarativeConfigProperties config = + instrumentationConfig.getStructured(name); + return config == null ? null : new ApplicationDeclarativeConfigProperties156Incubator(config); } @Nullable From aab3eed338193a40e0cbd1070241cb63f28c5c72 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 17:09:46 +0100 Subject: [PATCH 28/33] fix --- .../api/internal/ConfigPropertiesUtil.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 7ad30e2f00e8..4116d4b03543 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -49,7 +49,12 @@ private static boolean supportsDeclarativeConfig() { * Declarative Config. */ public static Optional getBoolean(String propertyName) { - return getString(propertyName).map(Boolean::parseBoolean); + Optional string = getString(propertyName); + // lambdas must not be used here in early initialization phase on early JDK8 versions + if (string.isPresent()) { + return Optional.ofNullable(Boolean.parseBoolean(string.get())); + } + return Optional.empty(); } /** @@ -69,15 +74,16 @@ public static Optional getBoolean(OpenTelemetry openTelemetry, String.. * variables. */ public static Optional getInt(String propertyName) { - return getString(propertyName) - .flatMap( - s -> { - try { - return Optional.of(Integer.parseInt(s)); - } catch (NumberFormatException ignored) { - return Optional.empty(); - } - }); + Optional string = getString(propertyName); + // lambdas must not be used here in early initialization phase on early JDK8 versions + if (string.isPresent()) { + try { + return Optional.of(Integer.parseInt(string.get())); + } catch (NumberFormatException ignored) { + // ignored + } + } + return Optional.empty(); } /** From 0f400ab997d63313c23dee710ca0c8100ced2542 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 25 Nov 2025 17:23:26 +0100 Subject: [PATCH 29/33] fix --- .../instrumentation/api/internal/ConfigPropertiesUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 4116d4b03543..020eca085f5b 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -52,7 +52,7 @@ public static Optional getBoolean(String propertyName) { Optional string = getString(propertyName); // lambdas must not be used here in early initialization phase on early JDK8 versions if (string.isPresent()) { - return Optional.ofNullable(Boolean.parseBoolean(string.get())); + return Optional.of(Boolean.parseBoolean(string.get())); } return Optional.empty(); } From 3fd7b6fe26d8e83bb9086d3014f38b06d3daf9e7 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 27 Nov 2025 13:50:34 +0100 Subject: [PATCH 30/33] split pr --- .../api/internal/ConfigPropertiesUtil.java | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index 020eca085f5b..ba49c23ccfaf 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.api.internal; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; -import static java.util.Collections.emptyList; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; @@ -48,13 +47,9 @@ private static boolean supportsDeclarativeConfig() { *

It's recommended to use {@link #getBoolean(OpenTelemetry, String...)} instead to support * Declarative Config. */ - public static Optional getBoolean(String propertyName) { - Optional string = getString(propertyName); - // lambdas must not be used here in early initialization phase on early JDK8 versions - if (string.isPresent()) { - return Optional.of(Boolean.parseBoolean(string.get())); - } - return Optional.empty(); + public static boolean getBoolean(String propertyName, boolean defaultValue) { + String strValue = getString(propertyName); + return strValue == null ? defaultValue : Boolean.parseBoolean(strValue); } /** @@ -66,24 +61,24 @@ public static Optional getBoolean(OpenTelemetry openTelemetry, String.. if (node != null) { return Optional.ofNullable(node.getBoolean(leaf(propertyName))); } - return getBoolean(toSystemProperty(propertyName)); + String strValue = getString(toSystemProperty(propertyName)); + return strValue == null ? Optional.empty() : Optional.of(Boolean.parseBoolean(strValue)); } /** * Returns the int value of the given property name from system properties and environment * variables. */ - public static Optional getInt(String propertyName) { - Optional string = getString(propertyName); - // lambdas must not be used here in early initialization phase on early JDK8 versions - if (string.isPresent()) { - try { - return Optional.of(Integer.parseInt(string.get())); - } catch (NumberFormatException ignored) { - // ignored - } + public static int getInt(String propertyName, int defaultValue) { + String strValue = getString(propertyName); + if (strValue == null) { + return defaultValue; + } + try { + return Integer.parseInt(strValue); + } catch (NumberFormatException ignored) { + return defaultValue; } - return Optional.empty(); } /** @@ -93,12 +88,25 @@ public static Optional getInt(String propertyName) { *

It's recommended to use {@link #getString(OpenTelemetry, String...)} instead to support * Declarative Config. */ - public static Optional getString(String propertyName) { + @Nullable + public static String getString(String propertyName) { String value = System.getProperty(propertyName); if (value != null) { - return Optional.of(value); + return value; } - return Optional.ofNullable(System.getenv(toEnvVarName(propertyName))); + return System.getenv(toEnvVarName(propertyName)); + } + + /** + * Returns the string value of the given property name from system properties and environment + * variables. + * + *

It's recommended to use {@link #getString(OpenTelemetry, String...)} instead to support + * Declarative Config. + */ + public static String getString(String propertyName, String defaultValue) { + String strValue = getString(propertyName); + return strValue == null ? defaultValue : strValue; } /** @@ -110,21 +118,19 @@ public static Optional getString(OpenTelemetry openTelemetry, String... if (node != null) { return Optional.ofNullable(node.getString(leaf(propertyName))); } - return getString(toSystemProperty(propertyName)); + return Optional.ofNullable(getString(toSystemProperty(propertyName))); } /** * Returns the list of strings value of the given property name from Declarative Config if * available, otherwise falls back to system properties and environment variables. */ - public static List getList(OpenTelemetry openTelemetry, String... propertyName) { - DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); - if (node != null) { - return node.getScalarList(leaf(propertyName), String.class, emptyList()); + public static List getList(String propertyName, List defaultValue) { + String value = getString(propertyName); + if (value == null) { + return defaultValue; } - return getString(toSystemProperty(propertyName)) - .map(value -> filterBlanksAndNulls(value.split(","))) - .orElse(emptyList()); + return filterBlanksAndNulls(value.split(",")); } /** Returns true if the given OpenTelemetry instance supports Declarative Config. */ From 18d719d56bb871b4b1331251800b2b13c80b0f67 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 27 Nov 2025 14:15:07 +0100 Subject: [PATCH 31/33] split pr --- .../api/instrumenter/InstrumenterBuilder.java | 3 +-- .../api/internal/ConfigPropertiesUtil.java | 25 ++++++------------- .../api/internal/ContextPropagationDebug.java | 9 +++---- .../api/internal/SemconvStability.java | 2 +- .../api/internal/SupportabilityMetrics.java | 2 +- .../SpanSuppressionStrategyTest.java | 3 ++- .../internal/ConfigPropertiesUtilTest.java | 18 ++++++------- .../v2_2/AbstractAws2ClientCoreTest.java | 3 ++- ...AbstractAws2ClientRecordHttpErrorTest.java | 1 + .../awssdk/v2_2/AbstractAws2SqsBaseTest.java | 1 + ...clarativeConfigProperties156Incubator.java | 5 ++-- .../servlet/ExperimentalSnippetHolder.java | 3 ++- .../javaagent/bootstrap/AgentInitializer.java | 2 +- .../SpanLoggingCustomizerProvider.java | 2 +- .../tooling/config/ConfigurationFile.java | 3 +-- .../tooling/config/EarlyInitAgentConfig.java | 11 +++++--- 16 files changed, 42 insertions(+), 51 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index 493f8e723de3..ad6889d5c400 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -376,8 +376,7 @@ SpanSuppressor buildSpanSuppressor() { openTelemetry, "common", "experimental", "span_suppression_strategy") .orElse(null) : ConfigPropertiesUtil.getString( - "otel.instrumentation.experimental.span-suppression-strategy") - .orElse(null); + "otel.instrumentation.experimental.span-suppression-strategy"); return new SpanSuppressors.ByContextKey( SpanSuppressionStrategy.fromConfig(value).create(getSpanKeysFromAttributesExtractors())); } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java index ba49c23ccfaf..c35a6e5fbcb7 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.api.internal; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; +import static java.util.Collections.emptyList; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; @@ -97,18 +98,6 @@ public static String getString(String propertyName) { return System.getenv(toEnvVarName(propertyName)); } - /** - * Returns the string value of the given property name from system properties and environment - * variables. - * - *

It's recommended to use {@link #getString(OpenTelemetry, String...)} instead to support - * Declarative Config. - */ - public static String getString(String propertyName, String defaultValue) { - String strValue = getString(propertyName); - return strValue == null ? defaultValue : strValue; - } - /** * Returns the string value of the given property name from Declarative Config if available, * otherwise falls back to system properties and environment variables. @@ -125,12 +114,14 @@ public static Optional getString(OpenTelemetry openTelemetry, String... * Returns the list of strings value of the given property name from Declarative Config if * available, otherwise falls back to system properties and environment variables. */ - public static List getList(String propertyName, List defaultValue) { - String value = getString(propertyName); - if (value == null) { - return defaultValue; + public static List getList(OpenTelemetry openTelemetry, String... propertyName) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return node.getScalarList(leaf(propertyName), String.class, emptyList()); } - return filterBlanksAndNulls(value.split(",")); + return Optional.ofNullable(getString(toSystemProperty(propertyName))) + .map(value -> filterBlanksAndNulls(value.split(","))) + .orElse(emptyList()); } /** Returns true if the given OpenTelemetry instance supports Declarative Config. */ diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java index 4e74e7c50522..cf698069fc05 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ContextPropagationDebug.java @@ -32,16 +32,13 @@ public final class ContextPropagationDebug { private static final boolean FAIL_ON_CONTEXT_LEAK; static { - boolean agentDebugEnabled = - ConfigPropertiesUtil.getBoolean("otel.javaagent.debug").orElse(false); + boolean agentDebugEnabled = ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false); THREAD_PROPAGATION_DEBUGGER = ConfigPropertiesUtil.getBoolean( - "otel.javaagent.experimental.thread-propagation-debugger.enabled") - .orElse(agentDebugEnabled); + "otel.javaagent.experimental.thread-propagation-debugger.enabled", agentDebugEnabled); FAIL_ON_CONTEXT_LEAK = - ConfigPropertiesUtil.getBoolean("otel.javaagent.testing.fail-on-context-leak") - .orElse(false); + ConfigPropertiesUtil.getBoolean("otel.javaagent.testing.fail-on-context-leak", false); } // context to which debug locations were added diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java index bc76ae088bab..e54a62530b67 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java @@ -31,7 +31,7 @@ public final class SemconvStability { boolean oldCode = true; boolean stableCode = false; - String value = ConfigPropertiesUtil.getString("otel.semconv-stability.opt-in").orElse(null); + String value = ConfigPropertiesUtil.getString("otel.semconv-stability.opt-in"); if (value != null) { Set values = new HashSet<>(asList(value.split(","))); diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java index 4e4130c4824c..cf91c4274c32 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SupportabilityMetrics.java @@ -30,7 +30,7 @@ public final class SupportabilityMetrics { private static final SupportabilityMetrics INSTANCE = new SupportabilityMetrics( - ConfigPropertiesUtil.getBoolean("otel.javaagent.debug").orElse(false), logger::fine) + ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false), logger::fine) .start(); public static SupportabilityMetrics instance() { diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java index d15f564d080f..6091c512dea3 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/SpanSuppressionStrategyTest.java @@ -45,7 +45,8 @@ private static Stream configArgs() { Arguments.of("Span-Kind", SpanSuppressionStrategy.SPAN_KIND), Arguments.of("semconv", SpanSuppressionStrategy.SEMCONV), Arguments.of("SemConv", SpanSuppressionStrategy.SEMCONV), - Arguments.of("asdfasdfasdf", SpanSuppressionStrategy.SEMCONV)); + Arguments.of("asdfasdfasdf", SpanSuppressionStrategy.SEMCONV), + Arguments.of(null, SpanSuppressionStrategy.SEMCONV)); } @ParameterizedTest diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java index a25e8ca1f3d9..1fbd082af88d 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java @@ -32,18 +32,18 @@ class ConfigPropertiesUtilTest { @SetSystemProperty(key = "test.property.string", value = "sys") @Test void getString_systemProperty() { - assertThat(ConfigPropertiesUtil.getString("test.property.string")).hasValue("sys"); + assertThat(ConfigPropertiesUtil.getString("test.property.string")).isEqualTo("sys"); } @SetEnvironmentVariable(key = "TEST_PROPERTY_STRING", value = "env") @Test void getString_environmentVariable() { - assertThat(ConfigPropertiesUtil.getString("test.property.string")).hasValue("env"); + assertThat(ConfigPropertiesUtil.getString("test.property.string")).isEqualTo("env"); } @Test void getString_none() { - assertThat(ConfigPropertiesUtil.getString("test.property.string")).isEmpty(); + assertThat(ConfigPropertiesUtil.getString("test.property.string")).isNull(); } @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_STRING", value = "env_value") @@ -92,24 +92,24 @@ void getString_declarativeConfig(Object property, String expected) { @SetSystemProperty(key = "test.property.int", value = "42") @Test void getInt_systemProperty() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int")).hasValue(42); + assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(42); } @SetEnvironmentVariable(key = "TEST_PROPERTY_INT", value = "12") @Test void getInt_environmentVariable() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int")).hasValue(12); + assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(12); } @Test void getInt_none() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int")).isEmpty(); + assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(-1); } @SetSystemProperty(key = "test.property.int", value = "not a number") @Test void getInt_invalidNumber() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int")).isEmpty(); + assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(-1); } @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_BOOLEAN", value = "false") @@ -131,9 +131,7 @@ void getBoolean_none() { } private static void assertBoolean(boolean expected) { - assertThat( - ConfigPropertiesUtil.getBoolean("otel.instrumentation.test.property.boolean") - .orElse(false)) + assertThat(ConfigPropertiesUtil.getBoolean("otel.instrumentation.test.property.boolean", false)) .isEqualTo(expected); assertThat( ConfigPropertiesUtil.getBoolean(OpenTelemetry.noop(), "test", "property", "boolean") diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java index de9de748436f..e8d61732224b 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java @@ -98,9 +98,10 @@ public abstract class AbstractAws2ClientCoreTest { protected abstract ClientOverrideConfiguration.Builder createOverrideConfigurationBuilder(); - protected static boolean isSqsAttributeInjectionEnabled() { + protected boolean isSqsAttributeInjectionEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( + getTesting().getOpenTelemetry(), "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging") .orElse(false); } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java index 9825935d4b9c..c795afc07cf0 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java @@ -126,6 +126,7 @@ private static void cleanResponses() { public boolean isRecordIndividualHttpErrorEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( + getTesting().getOpenTelemetry(), "otel.instrumentation.aws-sdk.experimental-record-individual-http-error") .orElse(false); } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java index fd435a84c6b2..b0eb548ec694 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java @@ -132,6 +132,7 @@ protected void configureSdkClient(SqsAsyncClientBuilder builder) throws URISynta protected boolean isSqsAttributeInjectionEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( + getTesting().getOpenTelemetry(), "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging") .orElse(false); } diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java index 73e84975b85f..731defc77272 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.56/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_56/incubator/config/ApplicationDeclarativeConfigProperties156Incubator.java @@ -92,9 +92,8 @@ public List getScalarList(String name, Class scalarType, List defau @Nullable @Override public DeclarativeConfigProperties getStructured(String name) { - io.opentelemetry.api.incubator.config.DeclarativeConfigProperties config = - instrumentationConfig.getStructured(name); - return config == null ? null : new ApplicationDeclarativeConfigProperties156Incubator(config); + return new ApplicationDeclarativeConfigProperties156Incubator( + instrumentationConfig.getStructured(name)); } @Nullable diff --git a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java index cc5f10c40e07..df5d4d90d2d4 100644 --- a/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java +++ b/instrumentation/servlet/servlet-common/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/servlet/ExperimentalSnippetHolder.java @@ -22,7 +22,8 @@ private static String getSnippetSetting() { ConfigPropertiesUtil.isDeclarativeConfig(openTelemetry) ? ConfigPropertiesUtil.getString( openTelemetry, "servlet", "experimental", "javascript-snippet") - : ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet"); + : Optional.ofNullable( + ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet")); return result.orElse(""); } diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java index dcd41a32e83e..509d13964d3b 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java @@ -94,7 +94,7 @@ private static boolean getBoolean(String property, boolean defaultValue) { new PrivilegedAction() { @Override public Boolean run() { - return ConfigPropertiesUtil.getBoolean(property).orElse(defaultValue); + return ConfigPropertiesUtil.getBoolean(property, defaultValue); } }); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java index 14d0fde72e97..00634e858503 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java @@ -19,6 +19,6 @@ public class SpanLoggingCustomizerProvider extends AbstractSpanLoggingCustomizer protected boolean isEnabled(OpenTelemetryConfigurationModel model) { // read from system properties as it's an early init property and the config bridge is not // available here - return ConfigPropertiesUtil.getBoolean("otel.javaagent.debug").orElse(false); + return ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false); } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java index ddc6e5f740bf..4da9ca45f1fb 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFile.java @@ -47,8 +47,7 @@ static void resetForTest() { // visible for tests static Map loadConfigFile() { // Reading from system property first and from env after - String configurationFilePath = - ConfigPropertiesUtil.getString(CONFIGURATION_FILE_PROPERTY).orElse(null); + String configurationFilePath = ConfigPropertiesUtil.getString(CONFIGURATION_FILE_PROPERTY); if (configurationFilePath == null) { return emptyMap(); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java index e9bb11bfc780..d39f1b9cfd6a 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java @@ -27,15 +27,18 @@ private EarlyInitAgentConfig(Map configFileContents) { @Nullable public String getString(String propertyName) { - return ConfigPropertiesUtil.getString(propertyName) - .orElseGet(() -> configFileContents.get(propertyName)); + String value = ConfigPropertiesUtil.getString(propertyName); + if (value != null) { + return value; + } + return configFileContents.get(propertyName); } public boolean getBoolean(String propertyName, boolean defaultValue) { String configFileValueStr = configFileContents.get(propertyName); boolean configFileValue = configFileValueStr == null ? defaultValue : Boolean.parseBoolean(configFileValueStr); - return ConfigPropertiesUtil.getBoolean(propertyName).orElse(configFileValue); + return ConfigPropertiesUtil.getBoolean(propertyName, configFileValue); } public int getInt(String propertyName, int defaultValue) { @@ -43,7 +46,7 @@ public int getInt(String propertyName, int defaultValue) { String configFileValueStr = configFileContents.get(propertyName); int configFileValue = configFileValueStr == null ? defaultValue : Integer.parseInt(configFileValueStr); - return ConfigPropertiesUtil.getInt(propertyName).orElse(configFileValue); + return ConfigPropertiesUtil.getInt(propertyName, configFileValue); } catch (NumberFormatException ignored) { return defaultValue; } From 7c09f40d2b21dee0bb8a6da707cd74cf77bd9de4 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 27 Nov 2025 16:52:08 +0100 Subject: [PATCH 32/33] fix --- .../instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java index b8d1892f062a..f02531ee7514 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java @@ -273,7 +273,7 @@ public abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest + " " + ""; - private static void assumeSupportedConfig(String operation) { + private void assumeSupportedConfig(String operation) { Assumptions.assumeFalse( operation.equals("SendMessage") && isSqsAttributeInjectionEnabled(), "Cannot check Sqs.SendMessage here due to hard-coded MD5."); From 55146b8fac39ce671d68872eae2bacb90b29579c Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 27 Nov 2025 17:51:42 +0100 Subject: [PATCH 33/33] fix --- .../awssdk/v2_2/AbstractAws2ClientCoreTest.java | 3 +-- .../awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java | 3 +-- .../instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java index e8d61732224b..bc8794acecb3 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java @@ -101,8 +101,7 @@ public abstract class AbstractAws2ClientCoreTest { protected boolean isSqsAttributeInjectionEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( - getTesting().getOpenTelemetry(), - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging") + getTesting().getOpenTelemetry(), "aws_sdk", "experimental_use_propagator_for_messaging") .orElse(false); } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java index c795afc07cf0..0de2f015e9fc 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java @@ -126,8 +126,7 @@ private static void cleanResponses() { public boolean isRecordIndividualHttpErrorEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( - getTesting().getOpenTelemetry(), - "otel.instrumentation.aws-sdk.experimental-record-individual-http-error") + getTesting().getOpenTelemetry(), "aws_sdk", "experimental_record_individual_http_error") .orElse(false); } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java index b0eb548ec694..bb11e984a93e 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsBaseTest.java @@ -132,8 +132,7 @@ protected void configureSdkClient(SqsAsyncClientBuilder builder) throws URISynta protected boolean isSqsAttributeInjectionEnabled() { // See io.opentelemetry.instrumentation.awssdk.v2_2.autoconfigure.TracingExecutionInterceptor return ConfigPropertiesUtil.getBoolean( - getTesting().getOpenTelemetry(), - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging") + getTesting().getOpenTelemetry(), "aws_sdk", "experimental_use_propagator_for_messaging") .orElse(false); }