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/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index eb80bd8dd1d7..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 @@ -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; @@ -373,8 +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, "common", "experimental", "span_suppression_strategy") + .orElse(null) + : ConfigPropertiesUtil.getString( + "otel.instrumentation.experimental.span-suppression-strategy"); return new SpanSuppressors.ByContextKey( - spanSuppressionStrategy.create(getSpanKeysFromAttributesExtractors())); + SpanSuppressionStrategy.fromConfig(value).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 862cd6b13588..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 @@ -5,9 +5,17 @@ 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; +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.Optional; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -17,43 +25,111 @@ */ public final class ConfigPropertiesUtil { - public static boolean getBoolean(String propertyName, boolean defaultValue) { - String strValue = getString(propertyName); - return strValue == null ? defaultValue : Boolean.parseBoolean(strValue); + private static final boolean supportsDeclarativeConfig = supportsDeclarativeConfig(); + + private static boolean supportsDeclarativeConfig() { + 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; + } } - public static int getInt(String propertyName, int defaultValue) { - String strValue = getString(propertyName); - if (strValue == null) { - return defaultValue; + /** + * Returns the boolean value of the given property name from system properties and environment + * variables. + * + *

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())); } - try { - return Integer.parseInt(strValue); - } catch (NumberFormatException ignored) { - return defaultValue; + return Optional.empty(); + } + + /** + * 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 Optional getBoolean(OpenTelemetry openTelemetry, String... propertyName) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return Optional.ofNullable(node.getBoolean(leaf(propertyName))); } + return getBoolean(toSystemProperty(propertyName)); } - @Nullable - public static String getString(String propertyName) { + /** + * 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 + } + } + return Optional.empty(); + } + + /** + * 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 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))); } - 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. + */ + public static Optional getString(OpenTelemetry openTelemetry, String... propertyName) { + DeclarativeConfigProperties node = getDeclarativeConfigNode(openTelemetry, propertyName); + if (node != null) { + return Optional.ofNullable(node.getString(leaf(propertyName))); + } + return getString(toSystemProperty(propertyName)); } - public static List getList(String propertyName, List defaultValue) { - String value = getString(propertyName); - if (value == null) { - return defaultValue; + /** + * 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()); } - 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. */ + public static boolean isDeclarativeConfig(OpenTelemetry openTelemetry) { + return supportsDeclarativeConfig && openTelemetry instanceof ExtendedOpenTelemetry; } private static List filterBlanksAndNulls(String[] values) { @@ -67,5 +143,33 @@ 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) { + if (isDeclarativeConfig(openTelemetry)) { + 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; + } + + public static String toSystemProperty(String[] propertyName) { + return "otel.instrumentation." + String.join(".", propertyName).replace('_', '-'); + } + private ConfigPropertiesUtil() {} } 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/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/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 8a496322b6e0..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 @@ -5,9 +5,24 @@ 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; +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.List; +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; @@ -17,59 +32,191 @@ 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") + @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(OpenTelemetry.noop(), "test", "property", "string") + .orElse("default_value")) + .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) { + OpenTelemetry openTelemetry = DeclarativeConfiguration.create(model(property)); + assertThat(ConfigPropertiesUtil.getString(openTelemetry, "foo", "bar").orElse("default_value")) + .isEqualTo(expected); } @SetEnvironmentVariable(key = "TEST_PROPERTY_INT", value = "12") @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 = "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); + } + + private static void assertBoolean(boolean expected) { + assertThat( + ConfigPropertiesUtil.getBoolean("otel.instrumentation.test.property.boolean") + .orElse(false)) + .isEqualTo(expected); + assertThat( + ConfigPropertiesUtil.getBoolean(OpenTelemetry.noop(), "test", "property", "boolean") + .orElse(false)) + .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(property)), "foo", "bar") + .orElse(false)) + .isEqualTo(expected); + } + + 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"); + } + + @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(asList("x", "y", "z")); + } + + @SetEnvironmentVariable(key = "OTEL_INSTRUMENTATION_TEST_PROPERTY_LIST", value = "a,b,c") + @Test + void getList_environmentVariable() { + assertList(asList("a", "b", "c")); + } + + @Test + void getList_none() { + assertList(emptyList()); + } + + private static void assertList(List expected) { + assertThat(ConfigPropertiesUtil.getList(OpenTelemetry.noop(), "test", "property", "list")) + .isEqualTo(expected); + } + + public static Stream listValuesProvider() { + return Stream.of( + 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(Object property, List expected) { + assertThat( + ConfigPropertiesUtil.getList( + 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 2d92c041c0be..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,13 +5,12 @@ 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; 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 +19,24 @@ */ 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, "aws_sdk", "experimental_span_attributes") + .orElse(false)) + .setMessagingReceiveInstrumentationEnabled( + ConfigPropertiesUtil.getBoolean( + openTelemetry, "messaging", "experimental", "receive_telemetry", "enabled") + .orElse(false)) + .setCapturedHeaders( + ConfigPropertiesUtil.getList( + openTelemetry, "messaging", "experimental", "capture_headers")) + .build() + .newRequestHandler(); + } @Override public void beforeRequest(Request request) { 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 089757bea505..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,7 @@ 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; import io.opentelemetry.instrumentation.awssdk.v2_2.internal.AbstractAwsSdkTelemetryFactory; @@ -25,18 +24,23 @@ private static class AwsSdkTelemetryFactory extends AbstractAwsSdkTelemetryFacto @Override protected List getCapturedHeaders() { return ConfigPropertiesUtil.getList( - "otel.instrumentation.messaging.experimental.capture-headers", emptyList()); + GlobalOpenTelemetry.get(), "messaging", "experimental", "capture_headers"); } @Override protected boolean messagingReceiveInstrumentationEnabled() { return ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false); + GlobalOpenTelemetry.get(), + "messaging", + "experimental", + "receive_telemetry", + "enabled") + .orElse(false); } @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(), name).orElse(defaultValue); } } 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..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,26 +17,24 @@ public abstract class AbstractAwsSdkTelemetryFactory { protected abstract List getCapturedHeaders(); private boolean captureExperimentalSpanAttributes() { - return getBoolean("otel.instrumentation.aws-sdk.experimental-span-attributes", false); + return getBoolean(false, "aws_sdk", "experimental_span_attributes"); } protected abstract boolean messagingReceiveInstrumentationEnabled(); private boolean useMessagingPropagator() { - return getBoolean( - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging", false); + return getBoolean(false, "aws_sdk", "experimental_use_propagator_for_messaging"); } private boolean recordIndividualHttpError() { - return getBoolean( - "otel.instrumentation.aws-sdk.experimental-record-individual-http-error", false); + return getBoolean(false, "aws_sdk", "experimental_record_individual_http_error"); } private boolean genaiCaptureMessageContent() { - return getBoolean("otel.instrumentation.genai.capture-message-content", false); + return getBoolean(false, "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()) 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..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,10 +98,12 @@ 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( - "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging", false); + getTesting().getOpenTelemetry(), + "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..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,7 +126,9 @@ 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); + getTesting().getOpenTelemetry(), + "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..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,7 +132,9 @@ 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); + getTesting().getOpenTelemetry(), + "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 617da2b99f03..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 @@ -63,14 +63,18 @@ 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, "common", "experimental", "db_sqlcommenter", "enabled") + .orElse(false); + return SqlCommenter.builder() + .setEnabled( + ConfigPropertiesUtil.getBoolean( + openTelemetry, "jdbc", "experimental", "sqlcommenter", "enabled") + .orElse(defaultValue)) + .build(); + } static { try { @@ -256,7 +260,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 +270,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..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 @@ -28,14 +28,15 @@ 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, "jdbc", "experimental", "capture_query_parameters") + .orElse(false); } public static Instrumenter createStatementInstrumenter( OpenTelemetry openTelemetry) { - return createStatementInstrumenter(openTelemetry, captureQueryParameters()); + return createStatementInstrumenter(openTelemetry, captureQueryParameters(openTelemetry)); } static Instrumenter createStatementInstrumenter( @@ -45,7 +46,8 @@ static Instrumenter createStatementInstrumenter( emptyList(), true, ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.common.db-statement-sanitizer.enabled", true), + openTelemetry, "common", "db_statement_sanitizer", "enabled") + .orElse(true), captureQueryParameters); } @@ -95,7 +97,8 @@ public static Instrumenter createTransactionInstrumenter( return createTransactionInstrumenter( openTelemetry, ConfigPropertiesUtil.getBoolean( - "otel.instrumentation.jdbc.experimental.transaction.enabled", false)); + 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 96c040074088..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,10 +5,9 @@ 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; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.api.internal.Timer; @@ -32,15 +31,21 @@ @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, "messaging", "experimental", "receive_telemetry", "enabled") + .orElse(false)) + .setCapturedHeaders( + ConfigPropertiesUtil.getList( + openTelemetry, "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..d5b458ef923d 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 @@ -5,10 +5,9 @@ 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; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import java.util.Map; import java.util.Objects; @@ -28,12 +27,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, "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..050d31337c4c 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(), "log4j_context_data", "add_baggage") + .orElse(false); + private static final boolean configuredResourceAttributeAccessible = isConfiguredResourceAttributeAccessible(); private static final Map staticContextData = getStaticContextData(); 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..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 @@ -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; @@ -14,14 +15,16 @@ */ public final class ContextDataKeys { public static final String TRACE_ID_KEY = - ConfigPropertiesUtil.getString( - "otel.instrumentation.common.logging.trace-id", LoggingContextConstants.TRACE_ID); + ConfigPropertiesUtil.getString(GlobalOpenTelemetry.get(), "common", "logging", "trace_id") + .orElse(LoggingContextConstants.TRACE_ID); + public static final String SPAN_ID_KEY = - ConfigPropertiesUtil.getString( - "otel.instrumentation.common.logging.span-id", LoggingContextConstants.SPAN_ID); + ConfigPropertiesUtil.getString(GlobalOpenTelemetry.get(), "common", "logging", "span_id") + .orElse(LoggingContextConstants.SPAN_ID); + public static final String TRACE_FLAGS_KEY = - ConfigPropertiesUtil.getString( - "otel.instrumentation.common.logging.trace-flags", LoggingContextConstants.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 ebfc41e7b72b..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 @@ -5,15 +5,26 @@ package io.opentelemetry.javaagent.bootstrap.servlet; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import java.util.Optional; public class ExperimentalSnippetHolder { private static volatile String snippet = getSnippetSetting(); private static String getSnippetSetting() { - String result = ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet"); - return result == null ? "" : result; + OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); + 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") + : Optional.ofNullable( + ConfigPropertiesUtil.getString("otel.experimental.javascript-snippet")); + return result.orElse(""); } public static void setSnippet(String newValue) { 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/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 d39f1b9cfd6a..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,18 +27,15 @@ 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) { 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) { @@ -46,7 +43,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; }