From 0dbedb60518e5b2d3a07149607ad2f756e0af1f4 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 2 Jan 2026 10:17:13 -0800 Subject: [PATCH 1/4] Ensure consistent EarlyInitAgentConfig access --- ...plicationLoggingInstrumentationModule.java | 3 +- .../WithSpanInstrumentation.java | 5 +- .../ApplicationLoggingCustomizer.java | 3 +- .../simple/Slf4jSimpleLoggingCustomizer.java | 2 +- .../javaagent/tooling/AgentInstaller.java | 4 +- .../javaagent/tooling/AgentStarterImpl.java | 4 +- .../AgentTracerProviderConfigurer.java | 4 +- .../tooling/ExtensionClassLoader.java | 3 +- .../tooling/OpenTelemetryInstaller.java | 4 +- .../SpanLoggingCustomizerProvider.java | 6 +-- .../javaagent/tooling/config/AgentConfig.java | 5 -- .../tooling/config/EarlyInitAgentConfig.java | 48 +++++++++++++++++++ ...ieldBackedImplementationConfiguration.java | 3 +- .../InstrumentationModuleInstaller.java | 16 +++---- .../instrumentation/MuzzleMatcher.java | 9 ++-- .../javaagent/test/HelperInjectionTest.java | 2 +- .../tooling/OpenTelemetryInstallerTest.java | 4 +- .../ConfigurationPropertiesSupplierTest.java | 2 +- .../OtlpProtocolPropertiesSupplierTest.java | 4 +- 19 files changed, 80 insertions(+), 51 deletions(-) diff --git a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java index b9a728f7d2ed..d77eb357f41f 100644 --- a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java +++ b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java @@ -10,6 +10,7 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @@ -24,7 +25,7 @@ public ApplicationLoggingInstrumentationModule() { public boolean defaultEnabled(ConfigProperties config) { // only enable this instrumentation if the application logger is enabled return super.defaultEnabled(config) - && "application".equals(config.getString("otel.javaagent.logging")); + && "application".equals(EarlyInitAgentConfig.get().getOtelJavaagentLogging()); } @Override diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java index 1afa737ca656..6d65b623c2ee 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java @@ -18,12 +18,12 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.extension.instrumentation.internal.AsmApi; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.AnnotationExcludedMethods; import io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.instrumentationannotations.SpanAttributeUtil.Parameter; +import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import java.util.Arrays; import java.util.List; import kotlin.coroutines.Continuation; @@ -58,8 +58,7 @@ class WithSpanInstrumentation implements TypeInstrumentation { private static final boolean CHECK_CLASS = DeclarativeConfigUtil.getInstrumentationConfig( GlobalOpenTelemetry.get(), "kotlinx_coroutines") - .getBoolean( - "check_class", ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false)); + .getBoolean("check_class", EarlyInitAgentConfig.get().isOtelJavaagentDebug()); private final ElementMatcher.Junction annotatedMethodMatcher; // this matcher matches all methods that should be excluded from transformation diff --git a/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java b/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java index 19256cb499bd..78ce0ae3b562 100644 --- a/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java +++ b/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java @@ -21,8 +21,7 @@ public String name() { @Override public void init(EarlyInitAgentConfig earlyConfig) { - int limit = - earlyConfig.getInt("otel.javaagent.logging.application.logs-buffer-max-records", 2048); + int limit = earlyConfig.getOtelJavaagentLoggingApplicationLogsBufferMaxRecords(); InMemoryLogStore inMemoryLogStore = new InMemoryLogStore(limit); ApplicationLoggerFactory loggerFactory = new ApplicationLoggerFactory(inMemoryLogStore); // register a shutdown hook that'll dump the logs to stderr in case something goes wrong diff --git a/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java b/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java index 148f7a5ec3d7..de5aa99dd948 100644 --- a/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java +++ b/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java @@ -36,7 +36,7 @@ public void init(EarlyInitAgentConfig earlyConfig) { setSystemPropertyDefault( SIMPLE_LOGGER_DATE_TIME_FORMAT_PROPERTY, SIMPLE_LOGGER_DATE_TIME_FORMAT_DEFAULT); - if (earlyConfig.getBoolean("otel.javaagent.debug", false)) { + if (earlyConfig.isOtelJavaagentDebug()) { setSystemPropertyDefault(SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY, "DEBUG"); setSystemPropertyDefault(SIMPLE_LOGGER_PREFIX + "okhttp3.internal.http2", "INFO"); setSystemPropertyDefault( 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 330a85305f1c..07678d2b34b1 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 @@ -80,8 +80,6 @@ public class AgentInstaller { private static final Logger logger = Logger.getLogger(AgentInstaller.class.getName()); - static final String JAVAAGENT_ENABLED_CONFIG = "otel.javaagent.enabled"; - // This property may be set to force synchronous AgentListener#afterAgent() execution: the // condition for delaying the AgentListener initialization is pretty broad and in case it covers // too much javaagent users can file a bug, force sync execution by setting this property to true @@ -107,7 +105,7 @@ public static void installBytebuddyAgent( } logVersionInfo(); - if (earlyConfig.getBoolean(JAVAAGENT_ENABLED_CONFIG, true)) { + if (earlyConfig.isOtelJavaagentEnabled()) { List agentListeners = loadOrdered(AgentListener.class, extensionClassLoader); installBytebuddyAgent(inst, extensionClassLoader, agentListeners, earlyConfig); } else { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java index c501509f771c..e8fc9ca5ee40 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java @@ -71,12 +71,12 @@ public boolean delayStart() { public void start() { installTransformers(); - EarlyInitAgentConfig earlyConfig = EarlyInitAgentConfig.create(); + EarlyInitAgentConfig earlyConfig = EarlyInitAgentConfig.get(); extensionClassLoader = createExtensionClassLoader(getClass().getClassLoader(), earlyConfig); // allows loading instrumenter customizers from agent and extensions ServiceLoaderUtil.setLoadFunction(clazz -> ServiceLoader.load(clazz, extensionClassLoader)); - String loggerImplementationName = earlyConfig.getString("otel.javaagent.logging"); + String loggerImplementationName = earlyConfig.getOtelJavaagentLogging(); // default to the built-in stderr slf4j-simple logger if (loggerImplementationName == null) { loggerImplementationName = "simple"; diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java index 02f6c7a892a9..9e945672cd20 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java @@ -11,7 +11,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.instrumentation.thread.internal.AddThreadDetailsSpanProcessor; -import io.opentelemetry.javaagent.tooling.config.AgentConfig; +import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @@ -44,7 +44,7 @@ private static SdkTracerProviderBuilder configure( private static void maybeEnableLoggingExporter( SdkTracerProviderBuilder builder, ConfigProperties config) { - if (AgentConfig.isDebugModeEnabled(config)) { + if (EarlyInitAgentConfig.get().isOtelJavaagentDebug()) { // don't install another instance if the user has already explicitly requested it. if (loggingExporterIsNotAlreadyConfigured(config)) { builder.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java index 25b6562148a4..cb0d475560f4 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java @@ -42,7 +42,6 @@ // TODO find a way to initialize logging before using this class @SuppressWarnings("SystemOut") public class ExtensionClassLoader extends URLClassLoader { - public static final String EXTENSIONS_CONFIG = "otel.javaagent.extensions"; private final boolean isSecurityManagerSupportEnabled; @@ -62,7 +61,7 @@ public static ClassLoader getInstance( includeEmbeddedExtensionsIfFound(extensions, javaagentFile); - extensions.addAll(parseLocation(earlyConfig.getString(EXTENSIONS_CONFIG), javaagentFile)); + extensions.addAll(parseLocation(earlyConfig.getOtelJavaagentExtensions(), javaagentFile)); // TODO when logging is configured add warning about deprecated property diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java index 9e9789145f14..4bde466c432f 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java @@ -74,8 +74,8 @@ static ConfigProperties getDeclarativeConfigBridgedProperties( // these properties are used to initialize the SDK before the configuration file // is loaded for consistency, we pass them to the bridge, so that they can be read // later with the same value from the {@link DeclarativeConfigPropertiesBridge} - .addOverride("otel.javaagent.debug", earlyConfig.getBoolean("otel.javaagent.debug", false)) - .addOverride("otel.javaagent.logging", earlyConfig.getString("otel.javaagent.logging")) + .addOverride("otel.javaagent.debug", earlyConfig.isOtelJavaagentDebug()) + .addOverride("otel.javaagent.logging", earlyConfig.getOtelJavaagentLogging()) .buildFromInstrumentationConfig(configProvider.getInstrumentationConfig()); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java index 00634e858503..849bbc394f8c 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.tooling; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.logging.internal.AbstractSpanLoggingCustomizerProvider; +import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; @@ -17,8 +17,6 @@ public class SpanLoggingCustomizerProvider extends AbstractSpanLoggingCustomizer @Override protected boolean isEnabled(OpenTelemetryConfigurationModel model) { - // read from system properties as it's an early init property and the config bridge is not - // available here - return ConfigPropertiesUtil.getBoolean("otel.javaagent.debug", false); + return EarlyInitAgentConfig.get().isOtelJavaagentDebug(); } } 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..10d2af1220c3 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 @@ -7,15 +7,10 @@ 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 { - public static boolean isDebugModeEnabled(ConfigProperties config) { - return config.getBoolean("otel.javaagent.debug", false); - } - public static String instrumentationMode() { String mode = DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "agent") 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 d39f1b9cfd6a..aa5655042458 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 @@ -15,6 +15,16 @@ */ public final class EarlyInitAgentConfig { + private static final EarlyInitAgentConfig INSTANCE = create(); + + public static EarlyInitAgentConfig get() { + return INSTANCE; + } + + /** + * @deprecated Use {@link #get()} instead. + */ + @Deprecated public static EarlyInitAgentConfig create() { return new EarlyInitAgentConfig(ConfigurationFile.getProperties()); } @@ -26,6 +36,36 @@ private EarlyInitAgentConfig(Map configFileContents) { } @Nullable + public String getOtelJavaagentLogging() { + return getString("otel.javaagent.logging"); + } + + @Nullable + public String getOtelJavaagentExtensions() { + return getString("otel.javaagent.extensions"); + } + + public boolean isOtelJavaagentDebug() { + return getBoolean("otel.javaagent.debug", false); + } + + public boolean isOtelJavaagentEnabled() { + return getBoolean("otel.javaagent.enabled", true); + } + + public boolean isOtelJavaagentExperimentalFieldInjectionEnabled() { + return getBoolean("otel.javaagent.experimental.field-injection.enabled", true); + } + + public int getOtelJavaagentLoggingApplicationLogsBufferMaxRecords() { + return getInt("otel.javaagent.logging.application.logs-buffer-max-records", 2048); + } + + /** + * @deprecated Use specific property accessors instead. + */ + @Nullable + @Deprecated public String getString(String propertyName) { String value = ConfigPropertiesUtil.getString(propertyName); if (value != null) { @@ -34,6 +74,10 @@ public String getString(String propertyName) { return configFileContents.get(propertyName); } + /** + * @deprecated Use specific property accessors instead. + */ + @Deprecated public boolean getBoolean(String propertyName, boolean defaultValue) { String configFileValueStr = configFileContents.get(propertyName); boolean configFileValue = @@ -41,6 +85,10 @@ public boolean getBoolean(String propertyName, boolean defaultValue) { return ConfigPropertiesUtil.getBoolean(propertyName, configFileValue); } + /** + * @deprecated Use specific property accessors instead. + */ + @Deprecated public int getInt(String propertyName, int defaultValue) { try { String configFileValueStr = configFileContents.get(propertyName); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java index 370ca2e85662..9fa392209066 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java @@ -11,8 +11,7 @@ public final class FieldBackedImplementationConfiguration { static boolean fieldInjectionEnabled = true; public static void configure(EarlyInitAgentConfig config) { - fieldInjectionEnabled = - config.getBoolean("otel.javaagent.experimental.field-injection.enabled", true); + fieldInjectionEnabled = config.isOtelJavaagentExperimentalFieldInjectionEnabled(); } private FieldBackedImplementationConfiguration() {} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java index 14b3b72ced10..f9f0f611b129 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java @@ -77,16 +77,14 @@ AgentBuilder install( } if (instrumentationModule.isIndyModule()) { - return installIndyModule(instrumentationModule, parentAgentBuilder, config); + return installIndyModule(instrumentationModule, parentAgentBuilder); } else { - return installInjectingModule(instrumentationModule, parentAgentBuilder, config); + return installInjectingModule(instrumentationModule, parentAgentBuilder); } } private AgentBuilder installIndyModule( - InstrumentationModule instrumentationModule, - AgentBuilder parentAgentBuilder, - ConfigProperties config) { + InstrumentationModule instrumentationModule, AgentBuilder parentAgentBuilder) { List helperClassNames = InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule); HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl(); @@ -118,7 +116,7 @@ private AgentBuilder installIndyModule( .injectClasses(injectedClassesCollector); } - MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule, config); + MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule); Function> helperGenerator = cl -> { @@ -170,9 +168,7 @@ private AgentBuilder installIndyModule( } private AgentBuilder installInjectingModule( - InstrumentationModule instrumentationModule, - AgentBuilder parentAgentBuilder, - ConfigProperties config) { + InstrumentationModule instrumentationModule, AgentBuilder parentAgentBuilder) { List helperClassNames = InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule); HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl(); @@ -189,7 +185,7 @@ private AgentBuilder installInjectingModule( return parentAgentBuilder; } - MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule, config); + MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule); AgentBuilder.Transformer helperInjector = new HelperInjector( instrumentationModule.instrumentationName(), diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java index fd9f84924e5f..6b649bf2f272 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java @@ -13,12 +13,11 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TransformSafeLogger; import io.opentelemetry.javaagent.tooling.Utils; -import io.opentelemetry.javaagent.tooling.config.AgentConfig; +import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import io.opentelemetry.javaagent.tooling.instrumentation.indy.IndyModuleRegistry; import io.opentelemetry.javaagent.tooling.instrumentation.indy.InstrumentationModuleClassLoader; import io.opentelemetry.javaagent.tooling.muzzle.Mismatch; import io.opentelemetry.javaagent.tooling.muzzle.ReferenceMatcher; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.security.ProtectionDomain; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -45,12 +44,10 @@ class MuzzleMatcher implements AgentBuilder.RawMatcher { private volatile ReferenceMatcher referenceMatcher; MuzzleMatcher( - TransformSafeLogger instrumentationLogger, - InstrumentationModule instrumentationModule, - ConfigProperties config) { + TransformSafeLogger instrumentationLogger, InstrumentationModule instrumentationModule) { this.instrumentationLogger = instrumentationLogger; this.instrumentationModule = instrumentationModule; - this.muzzleLogLevel = AgentConfig.isDebugModeEnabled(config) ? WARNING : FINE; + this.muzzleLogLevel = EarlyInitAgentConfig.get().isOtelJavaagentDebug() ? WARNING : FINE; } @Override diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java index 20c84ef8a031..38551a949a2a 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java @@ -106,7 +106,7 @@ void helpersInjectedOnBootstrapClassloader() throws Exception { AgentInstaller.installBytebuddyAgent( ByteBuddyAgent.getInstrumentation(), this.getClass().getClassLoader(), - EarlyInitAgentConfig.create()); + EarlyInitAgentConfig.get()); String helperClassName = HelperInjectionTest.class.getPackage().getName() + ".HelperClass"; HelperInjector injector = diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java index c522bb4ecb23..8f3f89f5c8de 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java @@ -37,7 +37,7 @@ void setUp() { void globalOpenTelemetry() { AutoConfiguredOpenTelemetrySdk sdk = OpenTelemetryInstaller.installOpenTelemetrySdk( - EarlyInitAgentConfig.class.getClassLoader(), EarlyInitAgentConfig.create()); + EarlyInitAgentConfig.class.getClassLoader(), EarlyInitAgentConfig.get()); assertThat(sdk).isNotNull().isNotEqualTo(OpenTelemetry.noop()); } @@ -63,7 +63,7 @@ void defaultEnabledInDeclarativeConfigPropertiesBridge( Supplier configPropertiesSupplier = () -> OpenTelemetryInstaller.getDeclarativeConfigBridgedProperties( - EarlyInitAgentConfig.create(), + EarlyInitAgentConfig.get(), SdkConfigProvider.create( DeclarativeConfiguration.parse( new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))))); diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java index 93c4b7574999..2017639b43c2 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java @@ -47,7 +47,7 @@ void fileConfigOverwritesUserPropertiesSupplier(@TempDir Path tempDir) throws IO // when AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = OpenTelemetryInstaller.installOpenTelemetrySdk( - this.getClass().getClassLoader(), EarlyInitAgentConfig.create()); + this.getClass().getClassLoader(), EarlyInitAgentConfig.get()); // then assertThat(AutoConfigureUtil.getConfig(autoConfiguredSdk).getString("custom.key")) diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java index cbca89d51548..d0fc16abf32e 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java @@ -32,7 +32,7 @@ void keepUserOtlpProtocolConfiguration() { // when AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = OpenTelemetryInstaller.installOpenTelemetrySdk( - this.getClass().getClassLoader(), EarlyInitAgentConfig.create()); + this.getClass().getClassLoader(), EarlyInitAgentConfig.get()); // then assertThat( @@ -45,7 +45,7 @@ void defaultHttpProtobufOtlpProtocolConfiguration() { // when AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = OpenTelemetryInstaller.installOpenTelemetrySdk( - this.getClass().getClassLoader(), EarlyInitAgentConfig.create()); + this.getClass().getClassLoader(), EarlyInitAgentConfig.get()); // then assertThat( From 217ac6abb2f5d5dfa90b2cdc96bf8736d40a7d29 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 20:53:02 +0100 Subject: [PATCH 2/4] no need to deprecate --- .../tooling/config/EarlyInitAgentConfig.java | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) 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 aa5655042458..c65b328de7be 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 @@ -15,20 +15,13 @@ */ public final class EarlyInitAgentConfig { - private static final EarlyInitAgentConfig INSTANCE = create(); + private static final EarlyInitAgentConfig INSTANCE = + new EarlyInitAgentConfig(ConfigurationFile.getProperties()); public static EarlyInitAgentConfig get() { return INSTANCE; } - /** - * @deprecated Use {@link #get()} instead. - */ - @Deprecated - public static EarlyInitAgentConfig create() { - return new EarlyInitAgentConfig(ConfigurationFile.getProperties()); - } - private final Map configFileContents; private EarlyInitAgentConfig(Map configFileContents) { @@ -61,12 +54,8 @@ public int getOtelJavaagentLoggingApplicationLogsBufferMaxRecords() { return getInt("otel.javaagent.logging.application.logs-buffer-max-records", 2048); } - /** - * @deprecated Use specific property accessors instead. - */ @Nullable - @Deprecated - public String getString(String propertyName) { + private String getString(String propertyName) { String value = ConfigPropertiesUtil.getString(propertyName); if (value != null) { return value; @@ -74,22 +63,14 @@ public String getString(String propertyName) { return configFileContents.get(propertyName); } - /** - * @deprecated Use specific property accessors instead. - */ - @Deprecated - public boolean getBoolean(String propertyName, boolean defaultValue) { + private boolean getBoolean(String propertyName, boolean defaultValue) { String configFileValueStr = configFileContents.get(propertyName); boolean configFileValue = configFileValueStr == null ? defaultValue : Boolean.parseBoolean(configFileValueStr); return ConfigPropertiesUtil.getBoolean(propertyName, configFileValue); } - /** - * @deprecated Use specific property accessors instead. - */ - @Deprecated - public int getInt(String propertyName, int defaultValue) { + private int getInt(String propertyName, int defaultValue) { try { String configFileValueStr = configFileContents.get(propertyName); int configFileValue = From bb9d180eaba5ed9bb2cef9de541f8402d825d21c Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 21:01:34 +0100 Subject: [PATCH 3/4] don't pass around singleton --- .../ApplicationLoggingCustomizer.java | 4 ++-- .../simple/Slf4jSimpleLoggingCustomizer.java | 4 ++-- .../javaagent/tooling/AgentInstaller.java | 14 ++++++-------- .../javaagent/tooling/AgentStarterImpl.java | 16 +++++++--------- .../javaagent/tooling/ExtensionClassLoader.java | 8 +++----- .../javaagent/tooling/LoggingCustomizer.java | 5 ++--- .../javaagent/tooling/NoopLoggingCustomizer.java | 3 +-- .../tooling/OpenTelemetryInstaller.java | 11 +++++------ .../FieldBackedImplementationConfiguration.java | 5 +++-- .../javaagent/test/HelperInjectionTest.java | 5 +---- .../tooling/OpenTelemetryInstallerTest.java | 4 +--- .../ConfigurationPropertiesSupplierTest.java | 3 +-- .../OtlpProtocolPropertiesSupplierTest.java | 6 ++---- 13 files changed, 36 insertions(+), 52 deletions(-) diff --git a/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java b/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java index 78ce0ae3b562..ed88cd7aa527 100644 --- a/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java +++ b/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java @@ -20,8 +20,8 @@ public String name() { } @Override - public void init(EarlyInitAgentConfig earlyConfig) { - int limit = earlyConfig.getOtelJavaagentLoggingApplicationLogsBufferMaxRecords(); + public void init() { + int limit = EarlyInitAgentConfig.get().getOtelJavaagentLoggingApplicationLogsBufferMaxRecords(); InMemoryLogStore inMemoryLogStore = new InMemoryLogStore(limit); ApplicationLoggerFactory loggerFactory = new ApplicationLoggerFactory(inMemoryLogStore); // register a shutdown hook that'll dump the logs to stderr in case something goes wrong diff --git a/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java b/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java index de5aa99dd948..4e430b69f130 100644 --- a/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java +++ b/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java @@ -31,12 +31,12 @@ public String name() { } @Override - public void init(EarlyInitAgentConfig earlyConfig) { + public void init() { setSystemPropertyDefault(SIMPLE_LOGGER_SHOW_DATE_TIME_PROPERTY, "true"); setSystemPropertyDefault( SIMPLE_LOGGER_DATE_TIME_FORMAT_PROPERTY, SIMPLE_LOGGER_DATE_TIME_FORMAT_DEFAULT); - if (earlyConfig.isOtelJavaagentDebug()) { + if (EarlyInitAgentConfig.get().isOtelJavaagentDebug()) { setSystemPropertyDefault(SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY, "DEBUG"); setSystemPropertyDefault(SIMPLE_LOGGER_PREFIX + "okhttp3.internal.http2", "INFO"); setSystemPropertyDefault( 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 07678d2b34b1..cf46f39d14fd 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 @@ -94,8 +94,7 @@ public class AgentInstaller { private static volatile boolean instrumentationInstalled; - public static void installBytebuddyAgent( - Instrumentation inst, ClassLoader extensionClassLoader, EarlyInitAgentConfig earlyConfig) { + public static void installBytebuddyAgent(Instrumentation inst, ClassLoader extensionClassLoader) { addByteBuddyRawSetting(); Integer strictContextStressorMillis = Integer.getInteger(STRICT_CONTEXT_STRESSOR_MILLIS); @@ -105,9 +104,9 @@ public static void installBytebuddyAgent( } logVersionInfo(); - if (earlyConfig.isOtelJavaagentEnabled()) { + if (EarlyInitAgentConfig.get().isOtelJavaagentEnabled()) { List agentListeners = loadOrdered(AgentListener.class, extensionClassLoader); - installBytebuddyAgent(inst, extensionClassLoader, agentListeners, earlyConfig); + installBytebuddyAgent(inst, extensionClassLoader, agentListeners); } else { logger.fine("Agent is disabled, not installing instrumentations."); } @@ -116,13 +115,12 @@ public static void installBytebuddyAgent( private static void installBytebuddyAgent( Instrumentation inst, ClassLoader extensionClassLoader, - Iterable agentListeners, - EarlyInitAgentConfig earlyConfig) { + Iterable agentListeners) { WeakRefAsyncOperationEndStrategies.initialize(); EmbeddedInstrumentationProperties.setPropertiesLoader(extensionClassLoader); setDefineClassHandler(); - FieldBackedImplementationConfiguration.configure(earlyConfig); + FieldBackedImplementationConfiguration.configure(); // preload ThreadLocalRandom to avoid occasional // java.lang.ClassCircularityError: java/util/concurrent/ThreadLocalRandom // see https://github.com/raphw/byte-buddy/issues/1666 and @@ -161,7 +159,7 @@ private static void installBytebuddyAgent( installEarlyInstrumentation(agentBuilder, inst); AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = - installOpenTelemetrySdk(extensionClassLoader, earlyConfig); + installOpenTelemetrySdk(extensionClassLoader); ConfigProperties sdkConfig = AutoConfigureUtil.getConfig(autoConfiguredSdk); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java index e8fc9ca5ee40..310509e54214 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java @@ -71,12 +71,11 @@ public boolean delayStart() { public void start() { installTransformers(); - EarlyInitAgentConfig earlyConfig = EarlyInitAgentConfig.get(); - extensionClassLoader = createExtensionClassLoader(getClass().getClassLoader(), earlyConfig); + extensionClassLoader = createExtensionClassLoader(getClass().getClassLoader()); // allows loading instrumenter customizers from agent and extensions ServiceLoaderUtil.setLoadFunction(clazz -> ServiceLoader.load(clazz, extensionClassLoader)); - String loggerImplementationName = earlyConfig.getOtelJavaagentLogging(); + String loggerImplementationName = EarlyInitAgentConfig.get().getOtelJavaagentLogging(); // default to the built-in stderr slf4j-simple logger if (loggerImplementationName == null) { loggerImplementationName = "simple"; @@ -98,10 +97,10 @@ public void start() { Throwable startupError = null; try { - loggingCustomizer.init(earlyConfig); - earlyConfig.logEarlyConfigErrorsIfAny(); + loggingCustomizer.init(); + EarlyInitAgentConfig.get().logEarlyConfigErrorsIfAny(); - AgentInstaller.installBytebuddyAgent(instrumentation, extensionClassLoader, earlyConfig); + AgentInstaller.installBytebuddyAgent(instrumentation, extensionClassLoader); WeakConcurrentMapCleaner.start(); // LazyStorage reads system properties. Initialize it here where we have permissions to avoid @@ -141,10 +140,9 @@ public ClassLoader getExtensionClassLoader() { return extensionClassLoader; } - private ClassLoader createExtensionClassLoader( - ClassLoader agentClassLoader, EarlyInitAgentConfig earlyConfig) { + private ClassLoader createExtensionClassLoader(ClassLoader agentClassLoader) { return ExtensionClassLoader.getInstance( - agentClassLoader, javaagentFile, isSecurityManagerSupportEnabled, earlyConfig); + agentClassLoader, javaagentFile, isSecurityManagerSupportEnabled); } private static class LaunchHelperClassFileTransformer implements ClassFileTransformer { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java index cb0d475560f4..29c93646261c 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java @@ -53,15 +53,13 @@ public class ExtensionClassLoader extends URLClassLoader { } public static ClassLoader getInstance( - ClassLoader parent, - File javaagentFile, - boolean isSecurityManagerSupportEnabled, - EarlyInitAgentConfig earlyConfig) { + ClassLoader parent, File javaagentFile, boolean isSecurityManagerSupportEnabled) { List extensions = new ArrayList<>(); includeEmbeddedExtensionsIfFound(extensions, javaagentFile); - extensions.addAll(parseLocation(earlyConfig.getOtelJavaagentExtensions(), javaagentFile)); + extensions.addAll( + parseLocation(EarlyInitAgentConfig.get().getOtelJavaagentExtensions(), javaagentFile)); // TODO when logging is configured add warning about deprecated property diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/LoggingCustomizer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/LoggingCustomizer.java index c26c0a878001..68fc8ee616f1 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/LoggingCustomizer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/LoggingCustomizer.java @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.tooling; -import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; // only one LoggingCustomizer is allowed, and its presence will suppress the @@ -22,7 +21,7 @@ public interface LoggingCustomizer { // note that if this throws an exception, it will end up calling onStartupFailure, because // otherwise that exception will bubble up to OpenTelemetryAgent where a distro cannot control the // logging of it. - void init(EarlyInitAgentConfig earlyConfig); + void init(); /** * Register a callback which will be called on synchronous startup success. @@ -35,7 +34,7 @@ public interface LoggingCustomizer { /** * Register a callback which will be called on synchronous startup failure (including if {@link - * #init(EarlyInitAgentConfig)} fails). + * #init()} fails). * *

Synchronous startup may or may not include running {@link * io.opentelemetry.javaagent.extension.AgentListener#afterAgent( diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/NoopLoggingCustomizer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/NoopLoggingCustomizer.java index b2dc61b9470b..47de6e2a8c7f 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/NoopLoggingCustomizer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/NoopLoggingCustomizer.java @@ -6,7 +6,6 @@ package io.opentelemetry.javaagent.tooling; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; @AutoService(LoggingCustomizer.class) public final class NoopLoggingCustomizer implements LoggingCustomizer { @@ -17,7 +16,7 @@ public String name() { } @Override - public void init(EarlyInitAgentConfig earlyConfig) {} + public void init() {} @Override @SuppressWarnings("SystemOut") diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java index 4bde466c432f..791296b893cb 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java @@ -33,7 +33,7 @@ public final class OpenTelemetryInstaller { * @return the {@link AutoConfiguredOpenTelemetrySdk} */ public static AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk( - ClassLoader extensionClassLoader, EarlyInitAgentConfig earlyConfig) { + ClassLoader extensionClassLoader) { AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = AutoConfiguredOpenTelemetrySdk.builder() @@ -52,7 +52,7 @@ public static AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk( // Provide a fake ConfigProperties until we have migrated all runtime configuration // access to use declarative configuration API configProvider = ((ExtendedOpenTelemetry) sdk).getConfigProvider(); - configProperties = getDeclarativeConfigBridgedProperties(earlyConfig, configProvider); + configProperties = getDeclarativeConfigBridgedProperties(configProvider); } setForceFlush(sdk); @@ -66,16 +66,15 @@ public static AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk( } // Visible for testing - static ConfigProperties getDeclarativeConfigBridgedProperties( - EarlyInitAgentConfig earlyConfig, ConfigProvider configProvider) { + static ConfigProperties getDeclarativeConfigBridgedProperties(ConfigProvider configProvider) { return new DeclarativeConfigPropertiesBridgeBuilder() .addMapping("otel.javaagent", "agent") .addOverride("otel.instrumentation.common.default-enabled", defaultEnabled(configProvider)) // these properties are used to initialize the SDK before the configuration file // is loaded for consistency, we pass them to the bridge, so that they can be read // later with the same value from the {@link DeclarativeConfigPropertiesBridge} - .addOverride("otel.javaagent.debug", earlyConfig.isOtelJavaagentDebug()) - .addOverride("otel.javaagent.logging", earlyConfig.getOtelJavaagentLogging()) + .addOverride("otel.javaagent.debug", EarlyInitAgentConfig.get().isOtelJavaagentDebug()) + .addOverride("otel.javaagent.logging", EarlyInitAgentConfig.get().getOtelJavaagentLogging()) .buildFromInstrumentationConfig(configProvider.getInstrumentationConfig()); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java index 9fa392209066..21ed7b81f03e 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java @@ -10,8 +10,9 @@ public final class FieldBackedImplementationConfiguration { static boolean fieldInjectionEnabled = true; - public static void configure(EarlyInitAgentConfig config) { - fieldInjectionEnabled = config.isOtelJavaagentExperimentalFieldInjectionEnabled(); + public static void configure() { + fieldInjectionEnabled = + EarlyInitAgentConfig.get().isOtelJavaagentExperimentalFieldInjectionEnabled(); } private FieldBackedImplementationConfiguration() {} diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java index 38551a949a2a..bfd037eba346 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/test/HelperInjectionTest.java @@ -15,7 +15,6 @@ import io.opentelemetry.javaagent.tooling.AgentInstaller; import io.opentelemetry.javaagent.tooling.HelperInjector; import io.opentelemetry.javaagent.tooling.Utils; -import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; import java.lang.ref.WeakReference; import java.net.URL; import java.net.URLClassLoader; @@ -104,9 +103,7 @@ void helpersInjectedToNonDelegatingClassloader() throws Exception { void helpersInjectedOnBootstrapClassloader() throws Exception { ByteBuddyAgent.install(); AgentInstaller.installBytebuddyAgent( - ByteBuddyAgent.getInstrumentation(), - this.getClass().getClassLoader(), - EarlyInitAgentConfig.get()); + ByteBuddyAgent.getInstrumentation(), this.getClass().getClassLoader()); String helperClassName = HelperInjectionTest.class.getPackage().getName() + ".HelperClass"; HelperInjector injector = diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java index 8f3f89f5c8de..bbb2a3fc084f 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java @@ -36,8 +36,7 @@ void setUp() { @Test void globalOpenTelemetry() { AutoConfiguredOpenTelemetrySdk sdk = - OpenTelemetryInstaller.installOpenTelemetrySdk( - EarlyInitAgentConfig.class.getClassLoader(), EarlyInitAgentConfig.get()); + OpenTelemetryInstaller.installOpenTelemetrySdk(EarlyInitAgentConfig.class.getClassLoader()); assertThat(sdk).isNotNull().isNotEqualTo(OpenTelemetry.noop()); } @@ -63,7 +62,6 @@ void defaultEnabledInDeclarativeConfigPropertiesBridge( Supplier configPropertiesSupplier = () -> OpenTelemetryInstaller.getDeclarativeConfigBridgedProperties( - EarlyInitAgentConfig.get(), SdkConfigProvider.create( DeclarativeConfiguration.parse( new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))))); diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java index 2017639b43c2..d319e2006614 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationPropertiesSupplierTest.java @@ -46,8 +46,7 @@ void fileConfigOverwritesUserPropertiesSupplier(@TempDir Path tempDir) throws IO // when AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = - OpenTelemetryInstaller.installOpenTelemetrySdk( - this.getClass().getClassLoader(), EarlyInitAgentConfig.get()); + OpenTelemetryInstaller.installOpenTelemetrySdk(this.getClass().getClassLoader()); // then assertThat(AutoConfigureUtil.getConfig(autoConfiguredSdk).getString("custom.key")) diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java index d0fc16abf32e..267018dfe2f2 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/OtlpProtocolPropertiesSupplierTest.java @@ -31,8 +31,7 @@ void setUp() { void keepUserOtlpProtocolConfiguration() { // when AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = - OpenTelemetryInstaller.installOpenTelemetrySdk( - this.getClass().getClassLoader(), EarlyInitAgentConfig.get()); + OpenTelemetryInstaller.installOpenTelemetrySdk(this.getClass().getClassLoader()); // then assertThat( @@ -44,8 +43,7 @@ void keepUserOtlpProtocolConfiguration() { void defaultHttpProtobufOtlpProtocolConfiguration() { // when AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = - OpenTelemetryInstaller.installOpenTelemetrySdk( - this.getClass().getClassLoader(), EarlyInitAgentConfig.get()); + OpenTelemetryInstaller.installOpenTelemetrySdk(this.getClass().getClassLoader()); // then assertThat( From e76a91780daadc096232a3661a864c6d04186b00 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 9 Jan 2026 08:42:12 +0100 Subject: [PATCH 4/4] pr review --- .../ApplicationLoggingInstrumentationModule.java | 2 +- .../WithSpanInstrumentation.java | 2 +- .../application/ApplicationLoggingCustomizer.java | 2 +- .../logging/simple/Slf4jSimpleLoggingCustomizer.java | 2 +- .../javaagent/tooling/AgentInstaller.java | 2 +- .../javaagent/tooling/AgentStarterImpl.java | 2 +- .../tooling/AgentTracerProviderConfigurer.java | 2 +- .../javaagent/tooling/ExtensionClassLoader.java | 3 +-- .../javaagent/tooling/OpenTelemetryInstaller.java | 4 ++-- .../tooling/SpanLoggingCustomizerProvider.java | 2 +- .../tooling/config/EarlyInitAgentConfig.java | 12 ++++++------ .../FieldBackedImplementationConfiguration.java | 3 +-- .../tooling/instrumentation/MuzzleMatcher.java | 2 +- 13 files changed, 19 insertions(+), 21 deletions(-) diff --git a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java index d77eb357f41f..4a31c6057de9 100644 --- a/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java +++ b/instrumentation/internal/internal-application-logger/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/logging/ApplicationLoggingInstrumentationModule.java @@ -25,7 +25,7 @@ public ApplicationLoggingInstrumentationModule() { public boolean defaultEnabled(ConfigProperties config) { // only enable this instrumentation if the application logger is enabled return super.defaultEnabled(config) - && "application".equals(EarlyInitAgentConfig.get().getOtelJavaagentLogging()); + && "application".equals(EarlyInitAgentConfig.get().getLogging()); } @Override diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java index 6d65b623c2ee..47e5b6430d22 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/WithSpanInstrumentation.java @@ -58,7 +58,7 @@ class WithSpanInstrumentation implements TypeInstrumentation { private static final boolean CHECK_CLASS = DeclarativeConfigUtil.getInstrumentationConfig( GlobalOpenTelemetry.get(), "kotlinx_coroutines") - .getBoolean("check_class", EarlyInitAgentConfig.get().isOtelJavaagentDebug()); + .getBoolean("check_class", EarlyInitAgentConfig.get().isDebug()); private final ElementMatcher.Junction annotatedMethodMatcher; // this matcher matches all methods that should be excluded from transformation diff --git a/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java b/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java index ed88cd7aa527..be875bbb1bb4 100644 --- a/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java +++ b/javaagent-internal-logging-application/src/main/java/io/opentelemetry/javaagent/logging/application/ApplicationLoggingCustomizer.java @@ -21,7 +21,7 @@ public String name() { @Override public void init() { - int limit = EarlyInitAgentConfig.get().getOtelJavaagentLoggingApplicationLogsBufferMaxRecords(); + int limit = EarlyInitAgentConfig.get().getLoggingApplicationLogsBufferMaxRecords(); InMemoryLogStore inMemoryLogStore = new InMemoryLogStore(limit); ApplicationLoggerFactory loggerFactory = new ApplicationLoggerFactory(inMemoryLogStore); // register a shutdown hook that'll dump the logs to stderr in case something goes wrong diff --git a/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java b/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java index 4e430b69f130..f6c1da316637 100644 --- a/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java +++ b/javaagent-internal-logging-simple/src/main/java/io/opentelemetry/javaagent/logging/simple/Slf4jSimpleLoggingCustomizer.java @@ -36,7 +36,7 @@ public void init() { setSystemPropertyDefault( SIMPLE_LOGGER_DATE_TIME_FORMAT_PROPERTY, SIMPLE_LOGGER_DATE_TIME_FORMAT_DEFAULT); - if (EarlyInitAgentConfig.get().isOtelJavaagentDebug()) { + if (EarlyInitAgentConfig.get().isDebug()) { setSystemPropertyDefault(SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY, "DEBUG"); setSystemPropertyDefault(SIMPLE_LOGGER_PREFIX + "okhttp3.internal.http2", "INFO"); setSystemPropertyDefault( 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 cf46f39d14fd..46e05f0ac5cc 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 @@ -104,7 +104,7 @@ public static void installBytebuddyAgent(Instrumentation inst, ClassLoader exten } logVersionInfo(); - if (EarlyInitAgentConfig.get().isOtelJavaagentEnabled()) { + if (EarlyInitAgentConfig.get().isEnabled()) { List agentListeners = loadOrdered(AgentListener.class, extensionClassLoader); installBytebuddyAgent(inst, extensionClassLoader, agentListeners); } else { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java index 310509e54214..9128e2ab754f 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java @@ -75,7 +75,7 @@ public void start() { // allows loading instrumenter customizers from agent and extensions ServiceLoaderUtil.setLoadFunction(clazz -> ServiceLoader.load(clazz, extensionClassLoader)); - String loggerImplementationName = EarlyInitAgentConfig.get().getOtelJavaagentLogging(); + String loggerImplementationName = EarlyInitAgentConfig.get().getLogging(); // default to the built-in stderr slf4j-simple logger if (loggerImplementationName == null) { loggerImplementationName = "simple"; diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java index 9e945672cd20..4a30548f4d44 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentTracerProviderConfigurer.java @@ -44,7 +44,7 @@ private static SdkTracerProviderBuilder configure( private static void maybeEnableLoggingExporter( SdkTracerProviderBuilder builder, ConfigProperties config) { - if (EarlyInitAgentConfig.get().isOtelJavaagentDebug()) { + if (EarlyInitAgentConfig.get().isDebug()) { // don't install another instance if the user has already explicitly requested it. if (loggingExporterIsNotAlreadyConfigured(config)) { builder.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java index 29c93646261c..5133949d87a8 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java @@ -58,8 +58,7 @@ public static ClassLoader getInstance( includeEmbeddedExtensionsIfFound(extensions, javaagentFile); - extensions.addAll( - parseLocation(EarlyInitAgentConfig.get().getOtelJavaagentExtensions(), javaagentFile)); + extensions.addAll(parseLocation(EarlyInitAgentConfig.get().getExtensions(), javaagentFile)); // TODO when logging is configured add warning about deprecated property diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java index 791296b893cb..83554f955d54 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java @@ -73,8 +73,8 @@ static ConfigProperties getDeclarativeConfigBridgedProperties(ConfigProvider con // these properties are used to initialize the SDK before the configuration file // is loaded for consistency, we pass them to the bridge, so that they can be read // later with the same value from the {@link DeclarativeConfigPropertiesBridge} - .addOverride("otel.javaagent.debug", EarlyInitAgentConfig.get().isOtelJavaagentDebug()) - .addOverride("otel.javaagent.logging", EarlyInitAgentConfig.get().getOtelJavaagentLogging()) + .addOverride("otel.javaagent.debug", EarlyInitAgentConfig.get().isDebug()) + .addOverride("otel.javaagent.logging", EarlyInitAgentConfig.get().getLogging()) .buildFromInstrumentationConfig(configProvider.getInstrumentationConfig()); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java index 849bbc394f8c..1d62a4ae4a20 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/SpanLoggingCustomizerProvider.java @@ -17,6 +17,6 @@ public class SpanLoggingCustomizerProvider extends AbstractSpanLoggingCustomizer @Override protected boolean isEnabled(OpenTelemetryConfigurationModel model) { - return EarlyInitAgentConfig.get().isOtelJavaagentDebug(); + return EarlyInitAgentConfig.get().isDebug(); } } 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 c65b328de7be..c1493ba9eab2 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 @@ -29,28 +29,28 @@ private EarlyInitAgentConfig(Map configFileContents) { } @Nullable - public String getOtelJavaagentLogging() { + public String getLogging() { return getString("otel.javaagent.logging"); } @Nullable - public String getOtelJavaagentExtensions() { + public String getExtensions() { return getString("otel.javaagent.extensions"); } - public boolean isOtelJavaagentDebug() { + public boolean isDebug() { return getBoolean("otel.javaagent.debug", false); } - public boolean isOtelJavaagentEnabled() { + public boolean isEnabled() { return getBoolean("otel.javaagent.enabled", true); } - public boolean isOtelJavaagentExperimentalFieldInjectionEnabled() { + public boolean isExperimentalFieldInjectionEnabled() { return getBoolean("otel.javaagent.experimental.field-injection.enabled", true); } - public int getOtelJavaagentLoggingApplicationLogsBufferMaxRecords() { + public int getLoggingApplicationLogsBufferMaxRecords() { return getInt("otel.javaagent.logging.application.logs-buffer-max-records", 2048); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java index 21ed7b81f03e..94a738ced62c 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java @@ -11,8 +11,7 @@ public final class FieldBackedImplementationConfiguration { static boolean fieldInjectionEnabled = true; public static void configure() { - fieldInjectionEnabled = - EarlyInitAgentConfig.get().isOtelJavaagentExperimentalFieldInjectionEnabled(); + fieldInjectionEnabled = EarlyInitAgentConfig.get().isExperimentalFieldInjectionEnabled(); } private FieldBackedImplementationConfiguration() {} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java index 6b649bf2f272..2f49e81ff02a 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java @@ -47,7 +47,7 @@ class MuzzleMatcher implements AgentBuilder.RawMatcher { TransformSafeLogger instrumentationLogger, InstrumentationModule instrumentationModule) { this.instrumentationLogger = instrumentationLogger; this.instrumentationModule = instrumentationModule; - this.muzzleLogLevel = EarlyInitAgentConfig.get().isOtelJavaagentDebug() ? WARNING : FINE; + this.muzzleLogLevel = EarlyInitAgentConfig.get().isDebug() ? WARNING : FINE; } @Override