Skip to content

Commit 9b8db74

Browse files
Improve agent to avoid loading global config on main thread (#9190)
* feat(env): Migrate Agent and its bootstrap to environment component * chore(env): Refactor CommandLine * chore(env): Clean up InitializationTelemetryCheck * feat(env): Catch agent start failure * feat(agent): Avoid DJM to use Config on main thread
1 parent 13efd64 commit 9b8db74

File tree

8 files changed

+139
-126
lines changed

8 files changed

+139
-126
lines changed

components/environment/src/main/java/datadog/environment/CommandLine.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
*/
2525
class CommandLine {
2626
private static final String SUN_JAVA_COMMAND_PROPERTY = "sun.java.command";
27-
final List<String> fullCommand = findFullCommand();
27+
private final List<String> fullCommand = findFullCommand();
2828
final String name = getCommandName();
2929
final List<String> arguments = getCommandArguments();
3030

@@ -35,14 +35,14 @@ private List<String> findFullCommand() {
3535
}
3636

3737
private String getCommandName() {
38-
return fullCommand.isEmpty() ? null : fullCommand.get(0);
38+
return this.fullCommand.isEmpty() ? null : this.fullCommand.get(0);
3939
}
4040

4141
private List<String> getCommandArguments() {
42-
if (fullCommand.isEmpty()) {
43-
return fullCommand;
42+
if (this.fullCommand.isEmpty()) {
43+
return this.fullCommand;
4444
} else {
45-
return fullCommand.subList(1, fullCommand.size());
45+
return this.fullCommand.subList(1, this.fullCommand.size());
4646
}
4747
}
4848
}

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java

Lines changed: 108 additions & 94 deletions
Large diffs are not rendered by default.

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Library.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.bootstrap;
22

3+
import datadog.environment.EnvironmentVariables;
34
import java.util.EnumSet;
45
import org.slf4j.Logger;
56

@@ -15,7 +16,7 @@ public enum Library {
1516
public static EnumSet<Library> detectLibraries(final Logger log) {
1617
final EnumSet<Library> libraries = EnumSet.noneOf(Library.class);
1718

18-
final String jbossHome = System.getenv("JBOSS_HOME");
19+
final String jbossHome = EnvironmentVariables.get("JBOSS_HOME");
1920
if (jbossHome != null) {
2021
log.debug("Env - jboss: {}", jbossHome);
2122
libraries.add(WILDFLY);

dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/ddlogger/DDLoggerFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datadog.trace.logging.ddlogger;
22

3+
import datadog.environment.EnvironmentVariables;
4+
import datadog.environment.SystemProperties;
35
import datadog.trace.api.Platform;
46
import datadog.trace.logging.LogLevel;
57
import datadog.trace.logging.LogLevelSwitcher;
@@ -99,14 +101,14 @@ && isFlagEnabled(
99101

100102
private static boolean isFlagEnabled(
101103
final String systemProperty, final String envVar, final boolean defaultValue) {
102-
String value = System.getProperty(systemProperty);
104+
String value = SystemProperties.get(systemProperty);
103105
if ("true".equalsIgnoreCase(value)) {
104106
return true;
105107
}
106108
if ("false".equalsIgnoreCase(value)) {
107109
return false;
108110
}
109-
value = System.getenv(envVar);
111+
value = EnvironmentVariables.get(envVar);
110112
if ("true".equalsIgnoreCase(value)) {
111113
return true;
112114
}

dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentBootstrap.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,16 +152,20 @@ private static void agentmainImpl(
152152
if (agentClass.getClassLoader() != null) {
153153
throw new IllegalStateException("DD Java Agent NOT added to bootstrap classpath.");
154154
}
155-
final Method startMethod =
156-
agentClass.getMethod("start", Object.class, Instrumentation.class, URL.class, String.class);
157-
158-
startMethod.invoke(null, initTelemetry, inst, agentJarURL, agentArgs);
155+
try {
156+
final Method startMethod =
157+
agentClass.getMethod(
158+
"start", Object.class, Instrumentation.class, URL.class, String.class);
159+
startMethod.invoke(null, initTelemetry, inst, agentJarURL, agentArgs);
160+
} catch (Throwable e) {
161+
throw new IllegalStateException("Unable to start DD Java Agent.", e);
162+
}
159163
}
160164

161165
static boolean getConfig(String configName) {
162166
switch (configName) {
163167
case LIB_INJECTION_ENABLED_ENV_VAR:
164-
return System.getenv(LIB_INJECTION_ENABLED_ENV_VAR) != null;
168+
return EnvironmentVariables.get(LIB_INJECTION_ENABLED_ENV_VAR) != null;
165169
case LIB_INJECTION_FORCE_SYS_PROP:
166170
{
167171
String envVarName =

dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentJar.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.bootstrap;
22

3+
import datadog.trace.bootstrap.environment.SystemProperties;
34
import de.thetaphi.forbiddenapis.SuppressForbidden;
45
import java.io.BufferedReader;
56
import java.io.IOException;
@@ -174,7 +175,7 @@ public static String getAgentVersion() throws IOException {
174175
}
175176

176177
private static void checkProfilerEnv(final String[] args) throws Exception {
177-
String tmpDir = args.length == 2 ? args[1] : System.getProperty("java.io.tmpdir");
178+
String tmpDir = args.length == 2 ? args[1] : SystemProperties.get("java.io.tmpdir");
178179

179180
installAgentCLI().getMethod("checkProfilerEnv", String.class).invoke(null, tmpDir);
180181
}

dd-java-agent/src/test/java/jvmbootstraptest/InitializationTelemetryCheck.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ protected boolean checkFileExecutePermission(FilePermission perm, Object ctx, St
8888
}
8989
}
9090

91-
public static final Result runTestJvm(Class<? extends TestSecurityManager> securityManagerClass)
91+
public static Result runTestJvm(Class<? extends TestSecurityManager> securityManagerClass)
9292
throws Exception {
9393
return runTestJvm(securityManagerClass, DEFAULT_TRACE_AGENT_PORT);
9494
}
9595

96-
public static final Result runTestJvm(
96+
public static Result runTestJvm(
9797
Class<? extends TestSecurityManager> securityManagerClass, int port) throws Exception {
9898

9999
File jarFile =
@@ -130,8 +130,8 @@ public static final Result runTestJvm(
130130
}
131131
}
132132

133-
static final File createTempFile(
134-
String baseName, String extension, Set<PosixFilePermission> perms) throws IOException {
133+
static File createTempFile(String baseName, String extension, Set<PosixFilePermission> perms)
134+
throws IOException {
135135
Path path =
136136
Files.createTempFile(
137137
baseName + "-integration-telemetry-check",
@@ -142,25 +142,25 @@ static final File createTempFile(
142142
return file;
143143
}
144144

145-
static final void write(File file, String... lines) throws IOException {
145+
static void write(File file, String... lines) throws IOException {
146146
Files.write(file.toPath(), Arrays.asList(lines));
147147
}
148148

149-
static final String read(File file) {
149+
static String read(File file) {
150150
try {
151151
return new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
152152
} catch (IOException e) {
153153
return null;
154154
}
155155
}
156156

157-
static final void delete(File... tempFiles) {
157+
static void delete(File... tempFiles) {
158158
for (File file : tempFiles) {
159159
file.delete();
160160
}
161161
}
162162

163-
public static final Class<?>[] requiredClasses(
163+
public static Class<?>[] requiredClasses(
164164
Class<? extends TestSecurityManager> securityManagerClass) {
165165

166166
if (securityManagerClass == null) {
@@ -178,7 +178,7 @@ public static final Class<?>[] requiredClasses(
178178
}
179179
}
180180

181-
public static final Map<String, String> envVars(File forwarderFile) {
181+
public static Map<String, String> envVars(File forwarderFile) {
182182
Map<String, String> envVars = new HashMap<>();
183183
envVars.put("DD_TELEMETRY_FORWARDER_PATH", forwarderFile.getAbsolutePath());
184184
return envVars;

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,6 @@
323323
import static datadog.trace.api.config.GeneralConfig.APPLICATION_KEY;
324324
import static datadog.trace.api.config.GeneralConfig.APPLICATION_KEY_FILE;
325325
import static datadog.trace.api.config.GeneralConfig.AZURE_APP_SERVICES;
326-
import static datadog.trace.api.config.GeneralConfig.DATA_JOBS_COMMAND_PATTERN;
327326
import static datadog.trace.api.config.GeneralConfig.DATA_JOBS_ENABLED;
328327
import static datadog.trace.api.config.GeneralConfig.DATA_JOBS_OPENLINEAGE_ENABLED;
329328
import static datadog.trace.api.config.GeneralConfig.DATA_STREAMS_BUCKET_DURATION_SECONDS;
@@ -1143,7 +1142,6 @@ public static String getHostName() {
11431142
private final int cwsTlsRefresh;
11441143

11451144
private final boolean dataJobsEnabled;
1146-
private final String dataJobsCommandPattern;
11471145
private final boolean dataJobsOpenLineageEnabled;
11481146

11491147
private final boolean dataStreamsEnabled;
@@ -2535,7 +2533,6 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
25352533
dataJobsOpenLineageEnabled =
25362534
configProvider.getBoolean(
25372535
DATA_JOBS_OPENLINEAGE_ENABLED, DEFAULT_DATA_JOBS_OPENLINEAGE_ENABLED);
2538-
dataJobsCommandPattern = configProvider.getString(DATA_JOBS_COMMAND_PATTERN);
25392536

25402537
dataStreamsEnabled =
25412538
configProvider.getBoolean(DATA_STREAMS_ENABLED, DEFAULT_DATA_STREAMS_ENABLED);
@@ -4385,10 +4382,6 @@ public boolean isDataJobsOpenLineageEnabled() {
43854382
return dataJobsOpenLineageEnabled;
43864383
}
43874384

4388-
public String getDataJobsCommandPattern() {
4389-
return dataJobsCommandPattern;
4390-
}
4391-
43924385
public boolean isApmTracingEnabled() {
43934386
return apmTracingEnabled;
43944387
}
@@ -5687,8 +5680,6 @@ public String toString() {
56875680
+ appSecRaspEnabled
56885681
+ ", dataJobsEnabled="
56895682
+ dataJobsEnabled
5690-
+ ", dataJobsCommandPattern="
5691-
+ dataJobsCommandPattern
56925683
+ ", apmTracingEnabled="
56935684
+ apmTracingEnabled
56945685
+ ", jdkSocketEnabled="

0 commit comments

Comments
 (0)