Skip to content

Commit 16a1333

Browse files
committed
buffer errors
1 parent 39eff12 commit 16a1333

File tree

7 files changed

+103
-29
lines changed

7 files changed

+103
-29
lines changed

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.javaagent.bootstrap.AgentStarter;
1212
import io.opentelemetry.javaagent.extension.instrumentation.internal.AsmApi;
1313
import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig;
14+
import io.opentelemetry.javaagent.tooling.config.ErrorBuffer;
1415
import java.io.File;
1516
import java.lang.instrument.ClassFileTransformer;
1617
import java.lang.instrument.Instrumentation;
@@ -96,7 +97,7 @@ public void start() {
9697
Throwable startupError = null;
9798
try {
9899
loggingCustomizer.init(earlyConfig);
99-
earlyConfig.logEarlyConfigErrorsIfAny();
100+
ErrorBuffer.logErrorIfAny();
100101

101102
AgentInstaller.installBytebuddyAgent(instrumentation, extensionClassLoader, earlyConfig);
102103
WeakConcurrentMapCleaner.start();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.tooling.config;
7+
8+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
9+
import javax.annotation.Nullable;
10+
11+
public final class BrokenEarlyInitAgentConfig implements EarlyInitAgentConfig {
12+
13+
BrokenEarlyInitAgentConfig() {}
14+
15+
@Override
16+
public boolean isAgentEnabled() {
17+
return false;
18+
}
19+
20+
@Nullable
21+
@Override
22+
public String getString(String propertyName) {
23+
return null;
24+
}
25+
26+
@Override
27+
public boolean getBoolean(String propertyName, boolean defaultValue) {
28+
return defaultValue;
29+
}
30+
31+
@Override
32+
public int getInt(String propertyName, int defaultValue) {
33+
return defaultValue;
34+
}
35+
36+
@Override
37+
public AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(ClassLoader extensionClassLoader) {
38+
throw new IllegalStateException("agent is not enabled, cannot install OpenTelemetry SDK");
39+
}
40+
}

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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
package io.opentelemetry.javaagent.tooling.config;
77

8+
import static io.opentelemetry.javaagent.tooling.config.ErrorBuffer.setErrorMessage;
89
import static java.util.Collections.emptyMap;
9-
import static java.util.logging.Level.SEVERE;
1010

1111
import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil;
1212
import java.io.File;
@@ -17,7 +17,6 @@
1717
import java.nio.charset.StandardCharsets;
1818
import java.util.Map;
1919
import java.util.Properties;
20-
import java.util.logging.Logger;
2120
import java.util.stream.Collectors;
2221
import javax.annotation.Nullable;
2322

@@ -59,7 +58,7 @@ static Map<String, String> loadConfigFile() {
5958
// Configuration properties file is optional
6059
File configurationFile = new File(configurationFilePath);
6160
if (!configurationFile.exists()) {
62-
fileLoadErrorMessage = "Configuration file \"" + configurationFilePath + "\" not found.";
61+
setErrorMessage("Configuration file \"" + configurationFilePath + "\" not found.");
6362
return emptyMap();
6463
}
6564

@@ -68,24 +67,17 @@ static Map<String, String> loadConfigFile() {
6867
new InputStreamReader(new FileInputStream(configurationFile), StandardCharsets.UTF_8)) {
6968
properties.load(reader);
7069
} catch (FileNotFoundException fnf) {
71-
fileLoadErrorMessage = "Configuration file \"" + configurationFilePath + "\" not found.";
70+
setErrorMessage("Configuration file \"" + configurationFilePath + "\" not found.");
7271
} catch (IOException ioe) {
73-
fileLoadErrorMessage =
72+
setErrorMessage(
7473
"Configuration file \""
7574
+ configurationFilePath
76-
+ "\" cannot be accessed or correctly parsed.";
75+
+ "\" cannot be accessed or correctly parsed.");
7776
}
7877

7978
return properties.entrySet().stream()
8079
.collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue().toString()));
8180
}
8281

83-
static void logErrorIfAny() {
84-
if (fileLoadErrorMessage != null) {
85-
Logger.getLogger(ConfigurationPropertiesSupplier.class.getName())
86-
.log(SEVERE, fileLoadErrorMessage);
87-
}
88-
}
89-
9082
private ConfigurationFile() {}
9183
}

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package io.opentelemetry.javaagent.tooling.config;
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
9-
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
109
import io.opentelemetry.api.incubator.config.GlobalConfigProvider;
1110
import io.opentelemetry.javaagent.bootstrap.OpenTelemetrySdkAccess;
1211
import io.opentelemetry.javaagent.extension.DeclarativeConfigPropertiesBridge;
@@ -26,6 +25,7 @@
2625
import java.util.Arrays;
2726
import java.util.Objects;
2827
import javax.annotation.Nullable;
28+
import org.jetbrains.annotations.NotNull;
2929

3030
/**
3131
* Agent config class that is only supposed to be used before the SDK (and {@link
@@ -36,14 +36,25 @@ public final class DeclarativeConfigEarlyInitAgentConfig implements EarlyInitAge
3636
private final ConfigProperties declarativeConfigProperties;
3737
private final SdkConfigProvider configProvider;
3838

39-
DeclarativeConfigEarlyInitAgentConfig(String configurationFile) {
40-
this.configurationModel = loadConfigurationModel(configurationFile);
39+
DeclarativeConfigEarlyInitAgentConfig(OpenTelemetryConfigurationModel model) {
40+
this.configurationModel = model;
4141
configProvider = SdkConfigProvider.create(configurationModel);
4242
this.declarativeConfigProperties =
4343
new DeclarativeConfigPropertiesBridge(
4444
configProvider, this.configurationModel.getLogLevel());
4545
}
4646

47+
@NotNull
48+
public static EarlyInitAgentConfig create(String configurationFile) {
49+
OpenTelemetryConfigurationModel model = loadConfigurationModel(configurationFile);
50+
if (model == null) {
51+
// broken configuration file, return a broken config, error is logged later
52+
return new BrokenEarlyInitAgentConfig();
53+
}
54+
55+
return new DeclarativeConfigEarlyInitAgentConfig(model);
56+
}
57+
4758
@Override
4859
public boolean isAgentEnabled() {
4960
return !Objects.equals(configurationModel.getDisabled(), true);
@@ -65,14 +76,14 @@ public int getInt(String propertyName, int defaultValue) {
6576
return declarativeConfigProperties.getInt(propertyName, defaultValue);
6677
}
6778

68-
@Override
69-
public void logEarlyConfigErrorsIfAny() {}
70-
79+
@Nullable
7180
private static OpenTelemetryConfigurationModel loadConfigurationModel(String configurationFile) {
7281
try (FileInputStream fis = new FileInputStream(configurationFile)) {
7382
return DeclarativeConfiguration.parse(fis);
7483
} catch (IOException e) {
75-
throw new DeclarativeConfigException("unable to read " + configurationFile, e);
84+
ErrorBuffer.setErrorMessage(
85+
"Error reading configuration file: " + configurationFile + ". " + e.getMessage());
86+
return null;
7687
}
7788
}
7889

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ public interface EarlyInitAgentConfig {
2121

2222
int getInt(String propertyName, int defaultValue);
2323

24-
void logEarlyConfigErrorsIfAny();
25-
2624
/**
2725
* Install the {@link OpenTelemetrySdk} using autoconfigure, and return the {@link
2826
* AutoConfiguredOpenTelemetrySdk}.
@@ -37,7 +35,7 @@ static EarlyInitAgentConfig create() {
3735
.getString("otel.experimental.config.file");
3836

3937
return configurationFile != null
40-
? new DeclarativeConfigEarlyInitAgentConfig(configurationFile)
38+
? DeclarativeConfigEarlyInitAgentConfig.create(configurationFile)
4139
: new LegacyConfigFileEarlyInitAgentConfig();
4240
}
4341
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.tooling.config;
7+
8+
import static java.util.logging.Level.SEVERE;
9+
10+
import java.util.logging.Logger;
11+
import javax.annotation.Nullable;
12+
13+
/**
14+
* This class is used to buffer error messages that occur during early initialization of the agent.
15+
* It allows for logging these errors later, once the logging subsystem is fully initialized.
16+
*/
17+
public final class ErrorBuffer {
18+
19+
// this class is used early, and must not use logging in most of its methods
20+
// in case any file loading/parsing error occurs, we save the error message and log it later, when
21+
// the logging subsystem is initialized
22+
@Nullable private static String errorMessage;
23+
24+
static void setErrorMessage(String errorMessage) {
25+
if (ErrorBuffer.errorMessage == null) {
26+
ErrorBuffer.errorMessage = errorMessage;
27+
} else {
28+
ErrorBuffer.errorMessage += "\n" + errorMessage;
29+
}
30+
}
31+
32+
public static void logErrorIfAny() {
33+
if (errorMessage != null) {
34+
Logger.getLogger(ConfigurationPropertiesSupplier.class.getName()).log(SEVERE, errorMessage);
35+
}
36+
}
37+
}

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ public int getInt(String propertyName, int defaultValue) {
6060
}
6161
}
6262

63-
@Override
64-
public void logEarlyConfigErrorsIfAny() {
65-
ConfigurationFile.logErrorIfAny();
66-
}
67-
6863
@Override
6964
public AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(ClassLoader extensionClassLoader) {
7065
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =

0 commit comments

Comments
 (0)