Skip to content

Commit 907995b

Browse files
committed
revert to using system props for early init with declarative config to avoid classloading issues
1 parent 775c0b2 commit 907995b

File tree

8 files changed

+43
-91
lines changed

8 files changed

+43
-91
lines changed

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridge.java

Lines changed: 12 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,14 @@
88
import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty;
99

1010
import io.opentelemetry.api.incubator.config.ConfigProvider;
11-
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1211
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1312
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1413
import java.time.Duration;
15-
import java.util.Arrays;
1614
import java.util.Collections;
1715
import java.util.HashMap;
18-
import java.util.HashSet;
1916
import java.util.List;
2017
import java.util.Map;
2118
import java.util.Objects;
22-
import java.util.Set;
2319
import java.util.function.BiFunction;
2420
import java.util.stream.Collectors;
2521
import javax.annotation.Nullable;
@@ -60,8 +56,6 @@ public final class DeclarativeConfigPropertiesBridge implements ConfigProperties
6056

6157
private static final Map<String, String> JAVA_MAPPING_RULES = new HashMap<>();
6258
private static final Map<String, String> GENERAL_MAPPING_RULES = new HashMap<>();
63-
private static final Set<String> AGENT_LOGGING_OUTPUTS =
64-
new HashSet<>(Arrays.asList("application", "simple"));
6559

6660
// The node at .instrumentation.java
6761
private final DeclarativeConfigProperties instrumentationJavaNode;
@@ -91,6 +85,8 @@ public final class DeclarativeConfigPropertiesBridge implements ConfigProperties
9185
"http.server.response_captured_headers");
9286
}
9387

88+
private final Map<String, Object> earlyInitProperties;
89+
9490
private static Map<String, String> getPeerServiceMapping(
9591
DeclarativeConfigPropertiesBridge bridge) {
9692
List<DeclarativeConfigProperties> configProperties =
@@ -105,7 +101,9 @@ private static Map<String, String> getPeerServiceMapping(
105101
e -> Objects.requireNonNull(e.getString("service"), "service must not be null")));
106102
}
107103

108-
public DeclarativeConfigPropertiesBridge(ConfigProvider configProvider) {
104+
public DeclarativeConfigPropertiesBridge(
105+
ConfigProvider configProvider, Map<String, Object> earlyInitProperties) {
106+
this.earlyInitProperties = earlyInitProperties;
109107
DeclarativeConfigProperties inst = configProvider.getInstrumentationConfig();
110108
if (inst == null) {
111109
inst = DeclarativeConfigProperties.empty();
@@ -117,16 +115,20 @@ public DeclarativeConfigPropertiesBridge(ConfigProvider configProvider) {
117115
@Nullable
118116
@Override
119117
public String getString(String propertyName) {
120-
if ("otel.javaagent.logging".equals(propertyName)) {
121-
return agentLoggerName();
118+
Object value = earlyInitProperties.get(propertyName);
119+
if (value != null) {
120+
return value.toString();
122121
}
123-
124122
return getPropertyValue(propertyName, DeclarativeConfigProperties::getString);
125123
}
126124

127125
@Nullable
128126
@Override
129127
public Boolean getBoolean(String propertyName) {
128+
Object value = earlyInitProperties.get(propertyName);
129+
if (value != null) {
130+
return (Boolean) value;
131+
}
130132
return getPropertyValue(propertyName, DeclarativeConfigProperties::getBoolean);
131133
}
132134

@@ -237,40 +239,4 @@ private static String getJavaPath(String property) {
237239
}
238240
return null;
239241
}
240-
241-
@Nullable
242-
private String agentLoggerName() {
243-
DeclarativeConfigProperties logOutput = getLogOutput();
244-
Set<String> names = logOutput.getPropertyKeys();
245-
246-
if (names.isEmpty()) {
247-
// no log output configured
248-
return null;
249-
}
250-
251-
if (names.size() > 1) {
252-
throw new DeclarativeConfigException(
253-
"Multiple log output formats are configured: "
254-
+ String.join(", ", names)
255-
+ ". Please choose one of them.");
256-
}
257-
258-
String name = names.iterator().next();
259-
if (!AGENT_LOGGING_OUTPUTS.contains(name)) {
260-
throw new DeclarativeConfigException(
261-
"Unsupported log output format: '"
262-
+ name
263-
+ "' . Supported formats are: "
264-
+ String.join(", ", AGENT_LOGGING_OUTPUTS));
265-
}
266-
return name;
267-
}
268-
269-
private DeclarativeConfigProperties getLogOutput() {
270-
return getAgent().getStructured("logging", empty()).getStructured("output", empty());
271-
}
272-
273-
private DeclarativeConfigProperties getAgent() {
274-
return instrumentationJavaNode.getStructured("agent", empty());
275-
}
276242
}

javaagent-extension-api/src/test/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridgeTest.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@
66
package io.opentelemetry.javaagent.extension;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
109
import static org.assertj.core.data.MapEntry.entry;
1110

12-
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1311
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1412
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
1513
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
1614
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel;
1715
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
1816
import java.time.Duration;
1917
import java.util.Arrays;
18+
import java.util.Collections;
2019
import java.util.HashMap;
2120
import java.util.Map;
2221
import java.util.Objects;
@@ -25,30 +24,29 @@
2524
import org.junit.jupiter.api.Test;
2625

2726
class DeclarativeConfigPropertiesBridgeTest {
28-
2927
private ConfigProperties bridge;
3028
private ConfigProperties emptyBridge;
3129

3230
@BeforeEach
3331
void setup() {
34-
bridge = create("config.yaml");
32+
bridge = create("config.yaml", Collections.emptyMap());
3533

3634
OpenTelemetryConfigurationModel emptyModel =
3735
new OpenTelemetryConfigurationModel()
3836
.withAdditionalProperty("instrumentation/development", new InstrumentationModel());
39-
SdkConfigProvider emptyConfigProvider = SdkConfigProvider.create(emptyModel);
4037
emptyBridge =
41-
new DeclarativeConfigPropertiesBridge(Objects.requireNonNull(emptyConfigProvider));
38+
new DeclarativeConfigPropertiesBridge(
39+
Objects.requireNonNull(SdkConfigProvider.create(emptyModel)), Collections.emptyMap());
4240
}
4341

44-
private static DeclarativeConfigPropertiesBridge create(String name) {
42+
private static DeclarativeConfigPropertiesBridge create(
43+
String name, Map<String, Object> earlyInitProperties) {
4544
OpenTelemetryConfigurationModel model =
4645
DeclarativeConfiguration.parse(
4746
DeclarativeConfigPropertiesBridgeTest.class.getClassLoader().getResourceAsStream(name));
4847
SdkConfigProvider configProvider = SdkConfigProvider.create(model);
49-
DeclarativeConfigPropertiesBridge configPropertiesBridge =
50-
new DeclarativeConfigPropertiesBridge(Objects.requireNonNull(configProvider));
51-
return configPropertiesBridge;
48+
return new DeclarativeConfigPropertiesBridge(
49+
Objects.requireNonNull(configProvider), earlyInitProperties);
5250
}
5351

5452
@Test
@@ -143,15 +141,13 @@ void common() {
143141

144142
@Test
145143
void agent() {
144+
Map<String, Object> earlyInitProperties = new HashMap<>();
145+
earlyInitProperties.put("otel.javaagent.debug", true);
146+
earlyInitProperties.put("otel.javaagent.logging", "application");
147+
DeclarativeConfigPropertiesBridge bridge = create("config.yaml", earlyInitProperties);
148+
146149
assertThat(bridge.getBoolean("otel.javaagent.debug")).isTrue();
147150
assertThat(bridge.getBoolean("otel.javaagent.experimental.indy")).isTrue();
148-
149151
assertThat(bridge.getString("otel.javaagent.logging")).isEqualTo("application");
150-
assertThat(bridge.getInt("otel.javaagent.logging.application.logs-buffer-max-records"))
151-
.isEqualTo(1000);
152-
assertThat(create("agent-logging-simple.yaml").getString("otel.javaagent.logging"))
153-
.isEqualTo("simple");
154-
assertThatThrownBy(() -> create("agent-logging-both.yaml").getString("otel.javaagent.logging"))
155-
.isInstanceOf(DeclarativeConfigException.class);
156152
}
157153
}

javaagent-extension-api/src/test/resources/agent-logging-both.yaml

Lines changed: 0 additions & 10 deletions
This file was deleted.

javaagent-extension-api/src/test/resources/agent-logging-simple.yaml

Lines changed: 0 additions & 9 deletions
This file was deleted.

javaagent-extension-api/src/test/resources/config.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
file_format: 0.4
2-
disabled: true
3-
log_level: DEBUG
42
instrumentation/development:
53
general:
64
peer:
@@ -32,10 +30,6 @@ instrumentation/development:
3230
agent:
3331
experimental:
3432
indy: true
35-
logging:
36-
output:
37-
application:
38-
logs_buffer_max_records: 1000
3933
common:
4034
default:
4135
enabled: false

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/DeclarativeConfigEarlyInitAgentConfig.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import io.opentelemetry.sdk.resources.Resource;
2020
import java.io.FileInputStream;
2121
import java.io.IOException;
22+
import java.util.HashMap;
23+
import java.util.Map;
2224
import javax.annotation.Nullable;
2325
import org.jetbrains.annotations.NotNull;
2426

@@ -70,7 +72,7 @@ public AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(ClassLoader extens
7072
OpenTelemetryConfigurationModel model = loadConfigurationModel(configurationFile);
7173
SdkConfigProvider configProvider = SdkConfigProvider.create(model);
7274
DeclarativeConfigPropertiesBridge configProperties =
73-
new DeclarativeConfigPropertiesBridge(configProvider);
75+
new DeclarativeConfigPropertiesBridge(configProvider, getEarlyInitProperties());
7476
OpenTelemetrySdk sdk =
7577
DeclarativeConfiguration.create(
7678
model, SpiHelper.serviceComponentLoader(extensionClassLoader));
@@ -82,4 +84,13 @@ public AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(ClassLoader extens
8284
sdk, Resource.getDefault(), configProperties, configProvider);
8385
}
8486

87+
// these properties are used to initialize the SDK before the configuration file is loaded
88+
// for consistency, we pass them to the bridge, so that they can be read later with the same
89+
// value from the {@link DeclarativeConfigPropertiesBridge}
90+
private Map<String, Object> getEarlyInitProperties() {
91+
Map<String, Object> earlyInitProperties = new HashMap<>();
92+
earlyInitProperties.put("otel.javaagent.debug", this.getBoolean("otel.javaagent.debug", false));
93+
earlyInitProperties.put("otel.javaagent.logging", this.getString("otel.javaagent.logging"));
94+
return earlyInitProperties;
95+
}
8596
}

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/EarlyInitAgentConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ static EarlyInitAgentConfig create() {
3939

4040
return configurationFile != null
4141
? DeclarativeConfigEarlyInitAgentConfig.create(configurationFile)
42-
: new LegacyConfigFileEarlyInitAgentConfig();
42+
: LegacyConfigFileEarlyInitAgentConfig.create();
4343
}
4444

4545
static void setForceFlush(OpenTelemetrySdk sdk) {

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/config/LegacyConfigFileEarlyInitAgentConfig.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ public final class LegacyConfigFileEarlyInitAgentConfig implements EarlyInitAgen
2020

2121
private final Map<String, String> configFileContents;
2222

23-
LegacyConfigFileEarlyInitAgentConfig() {
23+
public static LegacyConfigFileEarlyInitAgentConfig create() {
24+
return new LegacyConfigFileEarlyInitAgentConfig();
25+
}
26+
27+
private LegacyConfigFileEarlyInitAgentConfig() {
2428
this.configFileContents = ConfigurationFile.getProperties();
2529
}
2630

0 commit comments

Comments
 (0)