diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/InstrumentationMode.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/InstrumentationMode.java new file mode 100644 index 000000000000..d507c26ec7d0 --- /dev/null +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/InstrumentationMode.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.incubator.config; + +/** + * The instrumentation mode to use when configuring instrumentations via declarative configuration. + */ +public enum InstrumentationMode { + /** Most instrumentations are enabled and configured with their default settings. */ + DEFAULT, + /** All instrumentations are disabled by default. */ + NONE; + + public static InstrumentationMode from(String mode) { + switch (mode) { + case "none": + return InstrumentationMode.NONE; + case "default": + return InstrumentationMode.DEFAULT; + default: + throw new IllegalArgumentException("Unknown instrumentation mode: " + mode); + } + } +} diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java index 221e1e86db89..11fb8245a35c 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/RuntimeMetricsConfigUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.runtimemetrics.java17.internal; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.InstrumentationMode; import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetricsBuilder; @@ -20,7 +21,9 @@ private RuntimeMetricsConfigUtil() {} @Nullable public static RuntimeMetrics configure( - RuntimeMetricsBuilder builder, OpenTelemetry openTelemetry, String instrumentationMode) { + RuntimeMetricsBuilder builder, + OpenTelemetry openTelemetry, + InstrumentationMode instrumentationMode) { /* By default, don't use any JFR metrics. May change this once semantic conventions are updated. If enabled, default to only the metrics not already covered by runtime-telemetry-java8 @@ -33,7 +36,7 @@ public static RuntimeMetrics configure( .getBoolean("enabled", false)) { // default configuration } else if (DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") - .getBoolean("enabled", instrumentationMode.equals("default"))) { + .getBoolean("enabled", instrumentationMode.equals(InstrumentationMode.DEFAULT))) { // This only uses metrics gathered by JMX builder.disableAllFeatures(); } else { diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/build.gradle.kts b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/build.gradle.kts index 24be66977afe..05a5e1ba96c2 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/build.gradle.kts +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/build.gradle.kts @@ -3,5 +3,5 @@ plugins { } dependencies { - implementation(project(":instrumentation-api")) + implementation(project(":instrumentation-api-incubator")) } diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java index 0e611e80a6f9..afed52e4bb1f 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/RuntimeMetricsConfigUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.runtimemetrics.java8.internal; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.InstrumentationMode; import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetricsBuilder; @@ -20,9 +21,11 @@ private RuntimeMetricsConfigUtil() {} @Nullable public static RuntimeMetrics configure( - RuntimeMetricsBuilder builder, OpenTelemetry openTelemetry, String instrumentationMode) { + RuntimeMetricsBuilder builder, + OpenTelemetry openTelemetry, + InstrumentationMode instrumentationMode) { if (!DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") - .getBoolean("enabled", instrumentationMode.equals("default"))) { + .getBoolean("enabled", instrumentationMode.equals(InstrumentationMode.DEFAULT))) { // nothing is enabled return null; } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/EarlyConfig.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/EarlyConfig.java index 19a64749a5b9..27f9235cbfba 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/EarlyConfig.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/EarlyConfig.java @@ -5,7 +5,7 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.instrumentation.api.incubator.config.InstrumentationMode; import org.springframework.core.env.Environment; /** @@ -28,7 +28,7 @@ public static boolean isDeclarativeConfig(Environment environment) { return environment.getProperty("otel.file_format", String.class) != null; } - public static boolean isDefaultEnabled(Environment environment) { + public static InstrumentationMode getInstrumentationMode(Environment environment) { if (isDeclarativeConfig(environment)) { String mode = environment.getProperty( @@ -36,17 +36,12 @@ public static boolean isDefaultEnabled(Environment environment) { String.class, "default"); - switch (mode) { - case "none": - return false; - case "default": - return true; - default: - throw new ConfigurationException("Unknown instrumentation mode: " + mode); - } + return InstrumentationMode.from(mode); } else { return environment.getProperty( - "otel.instrumentation.common.default-enabled", Boolean.class, true); + "otel.instrumentation.common.default-enabled", Boolean.class, true) + ? InstrumentationMode.DEFAULT + : InstrumentationMode.NONE; } } @@ -81,10 +76,7 @@ public static boolean isInstrumentationEnabled( if (explicit != null) { return explicit; } - if (!defaultValue) { - return false; - } - return isDefaultEnabled(environment); + return defaultValue && getInstrumentationMode(environment).equals(InstrumentationMode.DEFAULT); } private static String getPropertyName( diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java index 0616792fbf34..95cdb03b7a0b 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java17RuntimeMetricsProvider.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.InstrumentationMode; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; import javax.annotation.Nullable; @@ -28,7 +29,7 @@ public int minJavaVersion() { @Nullable @Override - public AutoCloseable start(OpenTelemetry openTelemetry, String instrumentationMode) { + public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationMode instrumentationMode) { logger.debug("Use runtime metrics instrumentation for Java 17+"); return RuntimeMetricsConfigUtil.configure( RuntimeMetrics.builder(openTelemetry), openTelemetry, instrumentationMode); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java index 21425c9737b7..7e6ed0814331 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/Java8RuntimeMetricsProvider.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.InstrumentationMode; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.RuntimeMetricsConfigUtil; import javax.annotation.Nullable; @@ -28,7 +29,7 @@ public int minJavaVersion() { @Nullable @Override - public AutoCloseable start(OpenTelemetry openTelemetry, String instrumentationMode) { + public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationMode instrumentationMode) { logger.debug("Use runtime metrics instrumentation for Java 8"); return RuntimeMetricsConfigUtil.configure( RuntimeMetrics.builder(openTelemetry), openTelemetry, instrumentationMode); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java index 59c21691df7d..fc3366e9ce18 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java @@ -6,9 +6,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.instrumentation.spring.autoconfigure.internal.EarlyConfig; import java.util.Comparator; import java.util.Optional; import javax.annotation.Nullable; @@ -57,19 +56,13 @@ public void handleApplicationReadyEvent(ApplicationReadyEvent event) { if (metricsProvider.isPresent()) { this.closeable = - metricsProvider.get().start(openTelemetry, instrumentationMode(openTelemetry)); + metricsProvider + .get() + .start( + openTelemetry, + EarlyConfig.getInstrumentationMode(applicationContext.getEnvironment())); } else { logger.debug("No runtime metrics instrumentation available for Java {}", version); } } - - private static String instrumentationMode(OpenTelemetry openTelemetry) { - String mode = - DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "spring_starter") - .getString("instrumentation_mode", "default"); - if (!mode.equals("default") && !mode.equals("none")) { - throw new ConfigurationException("Unknown instrumentation mode: " + mode); - } - return mode; - } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java index f6f85b21fea6..f775c8eeb027 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsProvider.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.InstrumentationMode; import javax.annotation.Nullable; /** @@ -18,5 +19,5 @@ public interface RuntimeMetricsProvider { int minJavaVersion(); @Nullable - AutoCloseable start(OpenTelemetry openTelemetry, String instrumentationMode); + AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationMode instrumentationMode); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/AgentConfig.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/AgentConfig.java index 4e0d51497cb5..6a7160b4afd0 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/AgentConfig.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/AgentConfig.java @@ -6,9 +6,9 @@ package io.opentelemetry.javaagent.tooling.config; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.InstrumentationMode; import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; public final class AgentConfig { @@ -16,14 +16,10 @@ public static boolean isDebugModeEnabled(ConfigProperties config) { return config.getBoolean("otel.javaagent.debug", false); } - public static String instrumentationMode() { - String mode = + public static InstrumentationMode instrumentationMode() { + return InstrumentationMode.from( DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "agent") - .getString("instrumentation_mode", "default"); - if (!mode.equals("default") && !mode.equals("none")) { - throw new ConfigurationException("Unknown instrumentation mode: " + mode); - } - return mode; + .getString("instrumentation_mode", "default")); } private AgentConfig() {}