Make config file available in early agent initialization phase (#7550)

Fixes #7540

I think this kind of early config might be useful in general -- for
instance, I think I'd like to use it for properties introduced in
https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/7339
This commit is contained in:
Mateusz Rzeszutek 2023-01-12 05:26:28 +01:00 committed by GitHub
parent 09b63d2294
commit 18cffb7aeb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 3 deletions

View File

@ -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<AgentListener> agentListeners = loadOrdered(AgentListener.class, extensionClassLoader);
installBytebuddyAgent(inst, extensionClassLoader, agentListeners);

View File

@ -30,9 +30,18 @@ public final class ConfigurationFileLoader implements AutoConfigurationCustomize
static final String CONFIGURATION_FILE_PROPERTY = "otel.javaagent.configuration-file";
private static Map<String, String> configFileContents;
@Override
public void customize(AutoConfigurationCustomizer autoConfiguration) {
autoConfiguration.addPropertiesSupplier(ConfigurationFileLoader::loadConfigFile);
autoConfiguration.addPropertiesSupplier(ConfigurationFileLoader::getConfigFileContents);
}
static Map<String, String> getConfigFileContents() {
if (configFileContents == null) {
configFileContents = loadConfigFile();
}
return configFileContents;
}
// visible for tests

View File

@ -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<String, String> configFileContents;
private EarlyInitAgentConfig(Map<String, String> 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);
}
}