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 88e90510e91a..fac25b75c85c 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 @@ -22,7 +22,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapSetter; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.instrumentation.api.internal.DeprecatedLibraryConfigPropertiesUtil; import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties; import io.opentelemetry.instrumentation.api.internal.Experimental; import io.opentelemetry.instrumentation.api.internal.InstrumenterBuilderAccess; @@ -386,10 +386,12 @@ private String getSpanSuppressionStrategy() { .getConfigProvider() .getInstrumentationConfig("common"); } + + @SuppressWarnings("deprecation") // using deprecated config property String result = commonConfig.getString( "span_suppression_strategy/development", - ConfigPropertiesUtil.getString( + DeprecatedLibraryConfigPropertiesUtil.getString( "otel.instrumentation.experimental.span-suppression-strategy", "")); return result.isEmpty() ? null : result; } 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..ebe1fa48db84 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,17 @@ public final class ContextPropagationDebug { private static final boolean FAIL_ON_CONTEXT_LEAK; static { - boolean agentDebugEnabled = ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false); + THREAD_PROPAGATION_DEBUGGER = isDebuggerEnabled(); + FAIL_ON_CONTEXT_LEAK = Boolean.getBoolean("otel.javaagent.testing.fail-on-context-leak"); + } - THREAD_PROPAGATION_DEBUGGER = - ConfigPropertiesUtil.getBoolean( - "otel.javaagent.experimental.thread-propagation-debugger.enabled", agentDebugEnabled); - FAIL_ON_CONTEXT_LEAK = - ConfigPropertiesUtil.getBoolean("otel.javaagent.testing.fail-on-context-leak", false); + private static boolean isDebuggerEnabled() { + String enabled = + System.getProperty("otel.javaagent.testing.thread-propagation-debugger.enabled"); + if (enabled != null) { + return Boolean.parseBoolean(enabled); + } + return DebugUtil.isAgentDebugEnabled(); } // context to which debug locations were added diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/DebugUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/DebugUtil.java new file mode 100644 index 000000000000..615b046868e8 --- /dev/null +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/DebugUtil.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.internal; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public class DebugUtil { + + static boolean isAgentDebugEnabled() { + return Boolean.parseBoolean(SemconvStability.getString("otel.javaagent.debug")); + } + + private DebugUtil() {} +} 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/DeprecatedLibraryConfigPropertiesUtil.java similarity index 64% rename from instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java rename to instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/DeprecatedLibraryConfigPropertiesUtil.java index 81962afbf656..34347674eb3a 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/DeprecatedLibraryConfigPropertiesUtil.java @@ -15,15 +15,16 @@ * 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 { +public final class DeprecatedLibraryConfigPropertiesUtil { /** * Returns the boolean value of the given property name from system properties and environment * variables. * - *

It's recommended to use {@link io.opentelemetry.api.incubator.config.ConfigProvider} instead - * to support Declarative Config. + * @deprecated allows library configuration via system properties and environment variables, which + * will be removed in 3.0. */ + @Deprecated public static boolean getBoolean(String propertyName, boolean defaultValue) { Boolean value = getBoolean(propertyName); return value == null ? defaultValue : value; @@ -33,43 +34,26 @@ public static boolean getBoolean(String propertyName, boolean defaultValue) { * Returns the boolean value of the given property name from system properties and environment * variables. * - *

It's recommended to use {@link io.opentelemetry.api.incubator.config.ConfigProvider} instead - * to support Declarative Config. + * @deprecated allows library configuration via system properties and environment variables, which + * will be removed in 3.0. */ @Nullable + @Deprecated public static Boolean getBoolean(String propertyName) { String strValue = getString(propertyName); return strValue == null ? null : Boolean.parseBoolean(strValue); } - /** - * Returns the int value of the given property name from system properties and environment - * variables. - * - *

It's recommended to use {@link io.opentelemetry.api.incubator.config.ConfigProvider} instead - * to support Declarative Config. - */ - 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; - } - } - /** * Returns the string value of the given property name from system properties and environment * variables. * - *

It's recommended to use {@link io.opentelemetry.api.incubator.config.ConfigProvider} instead - * to support Declarative Config. + * @deprecated allows library configuration via system properties and environment variables, which + * will be removed in 3.0. */ @Nullable - public static String getString(String propertyName) { + @Deprecated + private static String getString(String propertyName) { String value = System.getProperty(propertyName); if (value != null) { return value; @@ -81,9 +65,10 @@ public static String getString(String propertyName) { * Returns the string value of the given property name from system properties and environment * variables, or the default value if not found. * - *

It's recommended to use {@link io.opentelemetry.api.incubator.config.ConfigProvider} instead - * to support Declarative Config. + * @deprecated allows library configuration via system properties and environment variables, which + * will be removed in 3.0. */ + @Deprecated public static String getString(String propertyName, String defaultValue) { String strValue = getString(propertyName); return strValue == null ? defaultValue : strValue; @@ -94,9 +79,10 @@ public static String getString(String propertyName, String defaultValue) { * environment variables, or the default value if not found. The property value is expected to be * a comma-separated list. * - *

It's recommended to use {@link io.opentelemetry.api.incubator.config.ConfigProvider} instead - * to support Declarative Config. + * @deprecated allows library configuration via system properties and environment variables, which + * will be removed in 3.0. */ + @Deprecated public static List getList(String propertyName, List defaultValue) { String value = getString(propertyName); if (value == null) { @@ -116,5 +102,5 @@ private static String toEnvVarName(String propertyName) { return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_'); } - private ConfigPropertiesUtil() {} + private DeprecatedLibraryConfigPropertiesUtil() {} } 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..63c5994a2122 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 @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.HashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -31,7 +32,7 @@ public final class SemconvStability { boolean oldCode = true; boolean stableCode = false; - String value = ConfigPropertiesUtil.getString("otel.semconv-stability.opt-in"); + String value = getString("otel.semconv-stability.opt-in"); if (value != null) { Set values = new HashSet<>(asList(value.split(","))); @@ -64,6 +65,18 @@ public final class SemconvStability { emitStableCodeSemconv = stableCode; } + static String getString(String propertyName) { + String value = System.getProperty(propertyName); + if (value != null) { + return value; + } + return System.getenv(toEnvVarName(propertyName)); + } + + private static String toEnvVarName(String propertyName) { + return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_'); + } + public static boolean emitOldDatabaseSemconv() { return emitOldDatabaseSemconv; } 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..6602e4f74399 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 @@ -29,9 +29,7 @@ public final class SupportabilityMetrics { private final ConcurrentMap counters = new ConcurrentHashMap<>(); private static final SupportabilityMetrics INSTANCE = - new SupportabilityMetrics( - ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false), logger::fine) - .start(); + new SupportabilityMetrics(DebugUtil.isAgentDebugEnabled(), logger::fine).start(); public static SupportabilityMetrics instance() { return INSTANCE; diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/DeprecatedLibraryConfigPropertiesUtilTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/DeprecatedLibraryConfigPropertiesUtilTest.java new file mode 100644 index 000000000000..5933a00af04c --- /dev/null +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/DeprecatedLibraryConfigPropertiesUtilTest.java @@ -0,0 +1,37 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.internal; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.SetEnvironmentVariable; +import org.junitpioneer.jupiter.SetSystemProperty; + +@SuppressWarnings("deprecation") // using deprecated config property +class DeprecatedLibraryConfigPropertiesUtilTest { + + @SetEnvironmentVariable(key = "TEST_PROPERTY_BOOLEAN", value = "false") + @SetSystemProperty(key = "test.property.boolean", value = "true") + @Test + void getBoolean_systemProperty() { + assertThat(DeprecatedLibraryConfigPropertiesUtil.getBoolean("test.property.boolean", false)) + .isTrue(); + } + + @SetEnvironmentVariable(key = "TEST_PROPERTY_BOOLEAN", value = "true") + @Test + void getBoolean_environmentVariable() { + assertThat(DeprecatedLibraryConfigPropertiesUtil.getBoolean("test.property.boolean", false)) + .isTrue(); + } + + @Test + void getBoolean_none() { + assertThat(DeprecatedLibraryConfigPropertiesUtil.getBoolean("test.property.boolean", false)) + .isFalse(); + } +} 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 c08e316e8eaf..335bc6cc990a 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 @@ -15,7 +15,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.instrumentation.api.internal.DeprecatedLibraryConfigPropertiesUtil; import io.opentelemetry.instrumentation.awssdk.v1_11.AwsSdkTelemetry; /** @@ -25,6 +25,7 @@ public class TracingRequestHandler extends RequestHandler2 { private static final RequestHandler2 DELEGATE = buildDelegate(GlobalOpenTelemetry.get()); + @SuppressWarnings("deprecation") // using deprecated config property private static RequestHandler2 buildDelegate(OpenTelemetry openTelemetry) { DeclarativeConfigProperties messaging = DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "common").get("messaging"); @@ -33,21 +34,21 @@ private static RequestHandler2 buildDelegate(OpenTelemetry openTelemetry) { DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "aws_sdk") .getBoolean( "experimental_span_attributes/development", - ConfigPropertiesUtil.getBoolean( + DeprecatedLibraryConfigPropertiesUtil.getBoolean( "otel.instrumentation.aws-sdk.experimental-span-attributes", false))) .setMessagingReceiveTelemetryEnabled( messaging .get("receive_telemetry/development") .getBoolean( "enabled", - ConfigPropertiesUtil.getBoolean( + DeprecatedLibraryConfigPropertiesUtil.getBoolean( "otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false))) .setCapturedHeaders( messaging.getScalarList( "capture_headers/development", String.class, - ConfigPropertiesUtil.getList( + DeprecatedLibraryConfigPropertiesUtil.getList( "otel.instrumentation.messaging.experimental.capture-headers", emptyList()))) .build() .createRequestHandler(); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkTelemetryFactory.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkTelemetryFactory.java index 4f9b421d61cb..11e0f02b2571 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkTelemetryFactory.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkTelemetryFactory.java @@ -11,7 +11,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.instrumentation.api.internal.DeprecatedLibraryConfigPropertiesUtil; import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry; import java.util.List; @@ -81,12 +81,16 @@ private static AwsSdkTelemetry telemetry(boolean useLegacyLibraryConfig) { .build(); } + @SuppressWarnings("deprecation") // using deprecated config property private List legacyListValue(String key) { - return useLegacyLibraryConfig ? ConfigPropertiesUtil.getList(key, emptyList()) : emptyList(); + return useLegacyLibraryConfig + ? DeprecatedLibraryConfigPropertiesUtil.getList(key, emptyList()) + : emptyList(); } + @SuppressWarnings("deprecation") // using deprecated config property private boolean legacyBooleanValue(String key) { - return useLegacyLibraryConfig && ConfigPropertiesUtil.getBoolean(key, false); + return useLegacyLibraryConfig && DeprecatedLibraryConfigPropertiesUtil.getBoolean(key, false); } private AwsSdkTelemetryFactory(boolean useLegacyLibraryConfig) { 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..32fc75b5f360 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 @@ -41,7 +41,6 @@ import com.google.common.collect.ImmutableMap; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; @@ -99,9 +98,9 @@ public abstract class AbstractAws2ClientCoreTest { protected abstract ClientOverrideConfiguration.Builder createOverrideConfigurationBuilder(); 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); + // See io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkTelemetryFactory + return Boolean.getBoolean( + "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging"); } 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..f3e5ce47c4fe 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 @@ -24,7 +24,6 @@ import static java.util.Collections.singletonList; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.testing.internal.armeria.common.HttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpStatus; @@ -124,9 +123,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); + // See io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkTelemetryFactory + return Boolean.getBoolean( + "otel.instrumentation.aws-sdk.experimental-record-individual-http-error"); } @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..b6340651ba5e 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 @@ -26,7 +26,6 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; @@ -130,9 +129,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); + // See io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkTelemetryFactory + return Boolean.getBoolean( + "otel.instrumentation.aws-sdk.experimental-use-propagator-for-messaging"); } @BeforeAll diff --git a/instrumentation/grpc-1.6/javaagent/build.gradle.kts b/instrumentation/grpc-1.6/javaagent/build.gradle.kts index d4eca5080f1d..7796efaf6a77 100644 --- a/instrumentation/grpc-1.6/javaagent/build.gradle.kts +++ b/instrumentation/grpc-1.6/javaagent/build.gradle.kts @@ -35,7 +35,7 @@ tasks { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) // The agent context debug mechanism isn't compatible with the bridge approach which may add a // gRPC context to the root. - jvmArgs("-Dotel.javaagent.experimental.thread-propagation-debugger.enabled=false") + jvmArgs("-Dotel.javaagent.testing.thread-propagation-debugger.enabled=false") jvmArgs("-Dotel.instrumentation.grpc.capture-metadata.client.request=some-client-key") jvmArgs("-Dotel.instrumentation.grpc.capture-metadata.server.request=some-server-key") jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") @@ -58,7 +58,7 @@ tasks { // replicated base config from standard test task systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) - jvmArgs("-Dotel.javaagent.experimental.thread-propagation-debugger.enabled=false") + jvmArgs("-Dotel.javaagent.testing.thread-propagation-debugger.enabled=false") jvmArgs("-Dotel.instrumentation.grpc.capture-metadata.client.request=some-client-key") jvmArgs("-Dotel.instrumentation.grpc.capture-metadata.server.request=some-server-key") jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") 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 95256834d246..401cfe14ce2b 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 @@ -26,7 +26,7 @@ import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.SqlCommenter; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.instrumentation.api.internal.DeprecatedLibraryConfigPropertiesUtil; import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties; import io.opentelemetry.instrumentation.jdbc.internal.DbRequest; import io.opentelemetry.instrumentation.jdbc.internal.JdbcConnectionUrlParser; @@ -64,6 +64,7 @@ public final class OpenTelemetryDriver implements Driver { private static final AtomicBoolean REGISTERED = new AtomicBoolean(); private static final List DRIVER_CANDIDATES = new CopyOnWriteArrayList<>(); + @SuppressWarnings("deprecation") // using deprecated config property private static SqlCommenter getSqlCommenter(OpenTelemetry openTelemetry) { Boolean enabled = DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "jdbc") @@ -71,7 +72,7 @@ private static SqlCommenter getSqlCommenter(OpenTelemetry openTelemetry) { .getBoolean("enabled"); if (enabled == null) { enabled = - ConfigPropertiesUtil.getBoolean( + DeprecatedLibraryConfigPropertiesUtil.getBoolean( "otel.instrumentation.jdbc.experimental.sqlcommenter.enabled"); } if (enabled == null) { @@ -83,7 +84,7 @@ private static SqlCommenter getSqlCommenter(OpenTelemetry openTelemetry) { } if (enabled == null) { enabled = - ConfigPropertiesUtil.getBoolean( + DeprecatedLibraryConfigPropertiesUtil.getBoolean( "otel.instrumentation.common.experimental.db-sqlcommenter.enabled"); } if (enabled == null) { 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 dc91d6549c93..0fb74db402ad 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 @@ -17,7 +17,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.instrumentation.api.internal.DeprecatedLibraryConfigPropertiesUtil; import io.opentelemetry.instrumentation.jdbc.internal.dbinfo.DbInfo; import java.util.List; import javax.sql.DataSource; @@ -29,11 +29,12 @@ public final class JdbcInstrumenterFactory { public static final String INSTRUMENTATION_NAME = "io.opentelemetry.jdbc"; + @SuppressWarnings("deprecation") // using deprecated config property public static boolean captureQueryParameters(OpenTelemetry openTelemetry) { return DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "jdbc") .getBoolean( "capture_query_parameters/development", - ConfigPropertiesUtil.getBoolean( + DeprecatedLibraryConfigPropertiesUtil.getBoolean( "otel.instrumentation.jdbc.experimental.capture-query-parameters", false)); } @@ -44,13 +45,14 @@ public static Instrumenter createStatementInstrumenter( static Instrumenter createStatementInstrumenter( OpenTelemetry openTelemetry, boolean captureQueryParameters) { + @SuppressWarnings("deprecation") // using deprecated config property boolean statementSanitizationEnabled = DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "common") .get("database") .get("statement_sanitizer") .getBoolean( "enabled", - ConfigPropertiesUtil.getBoolean( + DeprecatedLibraryConfigPropertiesUtil.getBoolean( "otel.instrumentation.common.db-statement-sanitizer.enabled", true)); return createStatementInstrumenter( openTelemetry, emptyList(), true, statementSanitizationEnabled, captureQueryParameters); @@ -99,12 +101,13 @@ public static Instrumenter createDataSourceInstrumenter( public static Instrumenter createTransactionInstrumenter( OpenTelemetry openTelemetry) { + @SuppressWarnings("deprecation") // using deprecated config property boolean enabled = DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "jdbc") .get("transaction/development") .getBoolean( "enabled", - ConfigPropertiesUtil.getBoolean( + DeprecatedLibraryConfigPropertiesUtil.getBoolean( "otel.instrumentation.jdbc.experimental.transaction.enabled", false)); return createTransactionInstrumenter(openTelemetry, enabled); } 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 97ea0a7a36d1..0ba64ac8968b 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 @@ -13,7 +13,7 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.instrumentation.api.internal.DeprecatedLibraryConfigPropertiesUtil; import io.opentelemetry.instrumentation.api.internal.Timer; import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaConsumerContext; import io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal.KafkaConsumerContextUtil; @@ -49,14 +49,14 @@ public class TracingConsumerInterceptor implements ConsumerInterceptor implements ProducerInterceptor().configureEach { // required on jdk17 jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("--add-opens=java.base/java.util=ALL-UNNAMED") jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") } diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentClassLoader.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentClassLoader.java index 4baba3e19085..f9004305ab3c 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentClassLoader.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentClassLoader.java @@ -43,8 +43,9 @@ public class AgentClassLoader extends URLClassLoader { ClassLoader.registerAsParallelCapable(); } + @Nullable private static final String AGENT_INITIALIZER_JAR = - System.getProperty("otel.javaagent.experimental.initializer.jar", ""); + ConfigPropertiesUtil.getString("otel.javaagent.experimental.initializer.jar"); private static final String META_INF = "META-INF/"; private static final String META_INF_VERSIONS = META_INF + "versions/"; @@ -131,7 +132,7 @@ public AgentClassLoader( throw new IllegalStateException("Unable to open agent jar", e); } - if (!AGENT_INITIALIZER_JAR.isEmpty()) { + if (AGENT_INITIALIZER_JAR != null && !AGENT_INITIALIZER_JAR.isEmpty()) { URL url; try { url = new File(AGENT_INITIALIZER_JAR).toURI().toURL(); 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..b25a1345cf0b 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 @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.bootstrap; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import java.io.File; import java.lang.instrument.Instrumentation; import java.lang.reflect.Constructor; diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfigPropertiesUtil.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfigPropertiesUtil.java new file mode 100644 index 000000000000..081ffd681b78 --- /dev/null +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfigPropertiesUtil.java @@ -0,0 +1,44 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.bootstrap; + +import java.util.Locale; +import javax.annotation.Nullable; + +/** + * 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 { + + /** + * Returns the boolean value of the given property name from system properties and environment + * variables. + */ + public static boolean getBoolean(String propertyName, boolean defaultValue) { + String value = getString(propertyName); + return value == null ? defaultValue : Boolean.parseBoolean(value); + } + + /** + * Returns the string value of the given property name from system properties and environment + * variables. + */ + @Nullable + public static String getString(String propertyName) { + String value = System.getProperty(propertyName); + if (value != null) { + return value; + } + return System.getenv(toEnvVarName(propertyName)); + } + + private static String toEnvVarName(String propertyName) { + return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_'); + } + + private ConfigPropertiesUtil() {} +} diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java b/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfigPropertiesUtilTest.java similarity index 65% rename from instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java rename to javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfigPropertiesUtilTest.java index 8a496322b6e0..409544eacfb1 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtilTest.java +++ b/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfigPropertiesUtilTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.api.internal; +package io.opentelemetry.javaagent.bootstrap; import static org.assertj.core.api.Assertions.assertThat; @@ -31,30 +31,6 @@ void getString_none() { assertThat(ConfigPropertiesUtil.getString("test.property.string")).isNull(); } - @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); - } - - @SetEnvironmentVariable(key = "TEST_PROPERTY_INT", value = "12") - @Test - void getInt_environmentVariable() { - assertThat(ConfigPropertiesUtil.getInt("test.property.int", -1)).isEqualTo(12); - } - - @Test - void getInt_none() { - 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", -1)).isEqualTo(-1); - } - @SetEnvironmentVariable(key = "TEST_PROPERTY_BOOLEAN", value = "false") @SetSystemProperty(key = "test.property.boolean", value = "true") @Test 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..d4d24210cf7f 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 @@ -8,7 +8,7 @@ import static java.util.Collections.emptyMap; import static java.util.logging.Level.SEVERE; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.javaagent.bootstrap.ConfigPropertiesUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; 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 c1493ba9eab2..73d73a3ed6a2 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 @@ -5,7 +5,7 @@ package io.opentelemetry.javaagent.tooling.config; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.javaagent.bootstrap.ConfigPropertiesUtil; import java.util.Map; import javax.annotation.Nullable; @@ -72,10 +72,15 @@ private boolean getBoolean(String propertyName, boolean defaultValue) { private int getInt(String propertyName, int defaultValue) { try { + String value = ConfigPropertiesUtil.getString(propertyName); + if (value != null) { + return Integer.parseInt(value); + } String configFileValueStr = configFileContents.get(propertyName); - int configFileValue = - configFileValueStr == null ? defaultValue : Integer.parseInt(configFileValueStr); - return ConfigPropertiesUtil.getInt(propertyName, configFileValue); + if (configFileValueStr != null) { + return Integer.parseInt(configFileValueStr); + } + return defaultValue; } catch (NumberFormatException ignored) { return defaultValue; } diff --git a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java index 7598dd30ff6d..f5e0dc00403a 100644 --- a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java +++ b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java @@ -6,10 +6,8 @@ package io.opentelemetry.javaagent.tooling.muzzle; import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.api.internal.cache.Cache; import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder; -import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldAccessorMarker; import java.lang.instrument.Instrumentation; import java.lang.ref.WeakReference; import java.lang.reflect.Method; @@ -52,8 +50,6 @@ public class AgentCachingPoolStrategy implements AgentBuilder.PoolStrategy { // Many things are package visible for testing purposes -- // others to avoid creation of synthetic accessors - private static final boolean REFLECTION_ENABLED = - ConfigPropertiesUtil.getBoolean("otel.instrumentation.internal-reflection.enabled", true); private static final Method findLoadedClassMethod = getFindLoadedClassMethod(); static final int TYPE_CAPACITY = 64; @@ -623,12 +619,6 @@ public TypeList.Generic getInterfaces() { Class clazz = classRef.get(); if (clazz != null) { for (Class interfaceClass : clazz.getInterfaces()) { - // virtual field accessors are removed by internal-reflection instrumentation - // we do this extra check for tests run with internal-reflection disabled - if (!REFLECTION_ENABLED - && VirtualFieldAccessorMarker.class.isAssignableFrom(interfaceClass)) { - continue; - } // using raw type result.add(newTypeDescription(interfaceClass)); }