diff --git a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigProperties.java b/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigProperties.java index 4890d55a7eeb..13a7aaa49097 100644 --- a/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigProperties.java +++ b/declarative-config-bridge/src/main/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigProperties.java @@ -29,6 +29,12 @@ public final class ConfigPropertiesBackedDeclarativeConfigProperties private static final String GENERAL_PEER_SERVICE_MAPPING = "general.peer.service_mapping"; + private static final String AGENT_INSTRUMENTATION_MODE = "java.agent.instrumentation_mode"; + private static final String SPRING_STARTER_INSTRUMENTATION_MODE = + "java.spring_starter.instrumentation_mode"; + private static final String COMMON_DEFAULT_ENABLED = + "otel.instrumentation.common.default-enabled"; + private static final Map SPECIAL_MAPPINGS; static { @@ -109,6 +115,17 @@ private ConfigPropertiesBackedDeclarativeConfigProperties( @Nullable @Override public String getString(String name) { + String fullPath = pathWithName(name); + + if (fullPath.equals(AGENT_INSTRUMENTATION_MODE) + || fullPath.equals(SPRING_STARTER_INSTRUMENTATION_MODE)) { + Boolean value = configProperties.getBoolean(COMMON_DEFAULT_ENABLED); + if (value != null) { + return value ? "default" : "none"; + } + return null; + } + return configProperties.getString(resolvePropertyKey(name)); } diff --git a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigPropertiesTest.java b/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigPropertiesTest.java index 47e80f15d0cd..82bd2f60d0e6 100644 --- a/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigPropertiesTest.java +++ b/declarative-config-bridge/src/test/java/io/opentelemetry/instrumentation/config/bridge/ConfigPropertiesBackedDeclarativeConfigPropertiesTest.java @@ -225,6 +225,61 @@ void testWithoutJavaPrefix_doesNotMatch() { .isNull(); } + @Test + void testAgentInstrumentationMode_getString_booleanTrue() { + DeclarativeConfigProperties config = + createConfig("otel.instrumentation.common.default-enabled", "true"); + + assertThat( + config.getStructured("java").getStructured("agent").getString("instrumentation_mode")) + .isEqualTo("default"); + } + + @Test + void testAgentInstrumentationMode_getString_booleanFalse() { + DeclarativeConfigProperties config = + createConfig("otel.instrumentation.common.default-enabled", "false"); + + assertThat( + config.getStructured("java").getStructured("agent").getString("instrumentation_mode")) + .isEqualTo("none"); + } + + @Test + void testSpringStarterInstrumentationMode_getString_booleanTrue() { + DeclarativeConfigProperties config = + createConfig("otel.instrumentation.common.default-enabled", "true"); + + assertThat( + config + .getStructured("java") + .getStructured("spring_starter") + .getString("instrumentation_mode")) + .isEqualTo("default"); + } + + @Test + void testSpringStarterInstrumentationMode_getString_booleanFalse() { + DeclarativeConfigProperties config = + createConfig("otel.instrumentation.common.default-enabled", "false"); + + assertThat( + config + .getStructured("java") + .getStructured("spring_starter") + .getString("instrumentation_mode")) + .isEqualTo("none"); + } + + @Test + void testAgentInstrumentationMode_notSet() { + DeclarativeConfigProperties config = createConfig("some.other.property", "value"); + + assertThat( + config.getStructured("java").getStructured("agent").getString("instrumentation_mode")) + .isNull(); + } + private static DeclarativeConfigProperties createConfig(String key, String value) { Map properties = new HashMap<>(); properties.put(key, value); diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java b/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java index 0cd2cd3da663..ba2b1d0de1e2 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java17/Java17RuntimeMetricsInstaller.java @@ -9,8 +9,8 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.extension.AgentListener; +import io.opentelemetry.javaagent.tooling.config.AgentConfig; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; /** An {@link AgentListener} that enables runtime metrics during agent startup. */ @@ -21,7 +21,9 @@ public class Java17RuntimeMetricsInstaller implements AgentListener { public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) { RuntimeMetrics runtimeMetrics = RuntimeMetricsConfigUtil.configure( - RuntimeMetrics.builder(GlobalOpenTelemetry.get()), AgentInstrumentationConfig.get()); + RuntimeMetrics.builder(GlobalOpenTelemetry.get()), + GlobalOpenTelemetry.get(), + AgentConfig.instrumentationMode()); if (runtimeMetrics != null) { Runtime.getRuntime() .addShutdownHook( 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 8ddd5f5d8082..221e1e86db89 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 @@ -5,7 +5,8 @@ package io.opentelemetry.instrumentation.runtimemetrics.java17.internal; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetricsBuilder; import javax.annotation.Nullable; @@ -19,18 +20,20 @@ private RuntimeMetricsConfigUtil() {} @Nullable public static RuntimeMetrics configure( - RuntimeMetricsBuilder builder, InstrumentationConfig config) { + RuntimeMetricsBuilder builder, OpenTelemetry openTelemetry, String 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 */ - boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true); - if (config.getBoolean("otel.instrumentation.runtime-telemetry-java17.enable-all", false)) { + if (DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry_java17") + .getBoolean("enable_all", false)) { builder.enableAllFeatures(); - } else if (config.getBoolean("otel.instrumentation.runtime-telemetry-java17.enabled", false)) { + } else if (DeclarativeConfigUtil.getInstrumentationConfig( + openTelemetry, "runtime_telemetry_java17") + .getBoolean("enabled", false)) { // default configuration - } else if (config.getBoolean( - "otel.instrumentation.runtime-telemetry.enabled", defaultEnabled)) { + } else if (DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") + .getBoolean("enabled", instrumentationMode.equals("default"))) { // This only uses metrics gathered by JMX builder.disableAllFeatures(); } else { @@ -38,12 +41,13 @@ public static RuntimeMetrics configure( return null; } - if (config.getBoolean( - "otel.instrumentation.runtime-telemetry.emit-experimental-telemetry", false)) { + if (DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") + .getBoolean("emit_experimental_telemetry/development", false)) { builder.emitExperimentalTelemetry(); } - if (config.getBoolean("otel.instrumentation.runtime-telemetry.capture-gc-cause", false)) { + if (DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") + .getBoolean("capture_gc_cause", false)) { builder.captureGcCause(); } diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java index 0713e0c6c7ef..4b6a8c5b7030 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/runtimemetrics/java8/Java8RuntimeMetricsInstaller.java @@ -9,8 +9,8 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.RuntimeMetricsConfigUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.extension.AgentListener; +import io.opentelemetry.javaagent.tooling.config.AgentConfig; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; /** An {@link AgentListener} that enables runtime metrics during agent startup. */ @@ -25,7 +25,9 @@ public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) { RuntimeMetrics runtimeMetrics = RuntimeMetricsConfigUtil.configure( - RuntimeMetrics.builder(GlobalOpenTelemetry.get()), AgentInstrumentationConfig.get()); + RuntimeMetrics.builder(GlobalOpenTelemetry.get()), + GlobalOpenTelemetry.get(), + AgentConfig.instrumentationMode()); if (runtimeMetrics != null) { Runtime.getRuntime() .addShutdownHook( 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 c0f3ef37afee..0e611e80a6f9 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 @@ -5,7 +5,8 @@ package io.opentelemetry.instrumentation.runtimemetrics.java8.internal; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetricsBuilder; import javax.annotation.Nullable; @@ -19,19 +20,20 @@ private RuntimeMetricsConfigUtil() {} @Nullable public static RuntimeMetrics configure( - RuntimeMetricsBuilder builder, InstrumentationConfig config) { - boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true); - if (!config.getBoolean("otel.instrumentation.runtime-telemetry.enabled", defaultEnabled)) { + RuntimeMetricsBuilder builder, OpenTelemetry openTelemetry, String instrumentationMode) { + if (!DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") + .getBoolean("enabled", instrumentationMode.equals("default"))) { // nothing is enabled return null; } - if (config.getBoolean( - "otel.instrumentation.runtime-telemetry.emit-experimental-telemetry", false)) { + if (DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") + .getBoolean("emit_experimental_telemetry/development", false)) { builder.emitExperimentalTelemetry(); } - if (config.getBoolean("otel.instrumentation.runtime-telemetry.capture-gc-cause", false)) { + if (DeclarativeConfigUtil.getInstrumentationConfig(openTelemetry, "runtime_telemetry") + .getBoolean("capture_gc_cause", false)) { builder.captureGcCause(); } 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 6518099c4bcc..0616792fbf34 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,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RuntimeMetricsConfigUtil; import javax.annotation.Nullable; @@ -29,8 +28,9 @@ public int minJavaVersion() { @Nullable @Override - public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { + public AutoCloseable start(OpenTelemetry openTelemetry, String instrumentationMode) { logger.debug("Use runtime metrics instrumentation for Java 17+"); - return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), config); + 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 3b7f334ca815..21425c9737b7 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,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics; import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.RuntimeMetricsConfigUtil; import javax.annotation.Nullable; @@ -29,8 +28,9 @@ public int minJavaVersion() { @Nullable @Override - public AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config) { + public AutoCloseable start(OpenTelemetry openTelemetry, String instrumentationMode) { logger.debug("Use runtime metrics instrumentation for Java 8"); - return RuntimeMetricsConfigUtil.configure(RuntimeMetrics.builder(openTelemetry), config); + 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 d32c13904fdd..59c21691df7d 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,8 +6,9 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; +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 java.util.Comparator; import java.util.Optional; import javax.annotation.Nullable; @@ -45,7 +46,6 @@ public void stopMetrics() throws Exception { public void handleApplicationReadyEvent(ApplicationReadyEvent event) { ConfigurableApplicationContext applicationContext = event.getApplicationContext(); OpenTelemetry openTelemetry = applicationContext.getBean(OpenTelemetry.class); - InstrumentationConfig config = applicationContext.getBean(InstrumentationConfig.class); double version = Math.max(8, Double.parseDouble(System.getProperty("java.specification.version"))); @@ -56,9 +56,20 @@ public void handleApplicationReadyEvent(ApplicationReadyEvent event) { .findFirst(); if (metricsProvider.isPresent()) { - this.closeable = metricsProvider.get().start(openTelemetry, config); + this.closeable = + metricsProvider.get().start(openTelemetry, instrumentationMode(openTelemetry)); } 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 8549f9394e61..f6f85b21fea6 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,7 +6,6 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig; import javax.annotation.Nullable; /** @@ -19,5 +18,5 @@ public interface RuntimeMetricsProvider { int minJavaVersion(); @Nullable - AutoCloseable start(OpenTelemetry openTelemetry, InstrumentationConfig config); + AutoCloseable start(OpenTelemetry openTelemetry, String 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 a59fe6b11432..4e0d51497cb5 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 @@ -5,7 +5,10 @@ package io.opentelemetry.javaagent.tooling.config; +import io.opentelemetry.api.GlobalOpenTelemetry; +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 { @@ -13,5 +16,15 @@ public static boolean isDebugModeEnabled(ConfigProperties config) { return config.getBoolean("otel.javaagent.debug", false); } + public static String instrumentationMode() { + String mode = + 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; + } + private AgentConfig() {} }