diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 4428bae677..10a6fee959 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -16,7 +16,6 @@ import static net.bytebuddy.matcher.ElementMatchers.any; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextStorage; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties; import io.opentelemetry.javaagent.bootstrap.AgentClassLoader; import io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder; @@ -32,6 +31,7 @@ import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesConfigurer; import io.opentelemetry.javaagent.tooling.bytebuddy.SafeTypeStrategy; import io.opentelemetry.javaagent.tooling.config.AgentConfig; import io.opentelemetry.javaagent.tooling.config.ConfigPropertiesBridge; +import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import io.opentelemetry.javaagent.tooling.ignore.IgnoredClassLoadersMatcher; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesMatcher; @@ -87,7 +87,8 @@ public class AgentInstaller { } logVersionInfo(); - if (ConfigPropertiesUtil.getBoolean(JAVAAGENT_ENABLED_CONFIG, true)) { + EarlyInitAgentConfig agentConfig = EarlyInitAgentConfig.create(); + if (agentConfig.getBoolean(JAVAAGENT_ENABLED_CONFIG, true)) { setupUnsafe(inst); List agentListeners = loadOrdered(AgentListener.class, extensionClassLoader); installBytebuddyAgent(inst, extensionClassLoader, agentListeners); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoader.java index 52df5b1a7f..0005be8aaa 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoader.java @@ -30,9 +30,18 @@ public final class ConfigurationFileLoader implements AutoConfigurationCustomize static final String CONFIGURATION_FILE_PROPERTY = "otel.javaagent.configuration-file"; + private static Map configFileContents; + @Override public void customize(AutoConfigurationCustomizer autoConfiguration) { - autoConfiguration.addPropertiesSupplier(ConfigurationFileLoader::loadConfigFile); + autoConfiguration.addPropertiesSupplier(ConfigurationFileLoader::getConfigFileContents); + } + + static Map getConfigFileContents() { + if (configFileContents == null) { + configFileContents = loadConfigFile(); + } + return configFileContents; } // visible for tests 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 new file mode 100644 index 0000000000..25ff044e30 --- /dev/null +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.config; + +import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import java.util.Map; + +/** + * Agent config class that is only supposed to be used before the SDK (and {@link + * io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties}) is initialized. + */ +public final class EarlyInitAgentConfig { + + public static EarlyInitAgentConfig create() { + return new EarlyInitAgentConfig(ConfigurationFileLoader.getConfigFileContents()); + } + + private final Map configFileContents; + + private EarlyInitAgentConfig(Map configFileContents) { + this.configFileContents = configFileContents; + } + + 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); + } +}