diff --git a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java index 63a8e613ba4..1e723728819 100644 --- a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java +++ b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java @@ -7,6 +7,7 @@ import datadog.common.container.ContainerInfo; import datadog.common.socket.NamedPipeSocketFactory; import datadog.common.socket.UnixDomainSocketFactory; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import datadog.trace.util.AgentProxySelector; import java.io.File; @@ -49,9 +50,12 @@ public final class OkHttpUtils { private static final String DD_API_KEY = "DD-API-KEY"; - private static final String JAVA_VERSION = System.getProperty("java.version", "unknown"); - private static final String JAVA_VM_NAME = System.getProperty("java.vm.name", "unknown"); - private static final String JAVA_VM_VENDOR = System.getProperty("java.vm.vendor", "unknown"); + private static final String JAVA_VERSION = + SystemProperties.getOrDefault("java.version", "unknown"); + private static final String JAVA_VM_NAME = + SystemProperties.getOrDefault("java.vm.name", "unknown"); + private static final String JAVA_VM_VENDOR = + SystemProperties.getOrDefault("java.vm.vendor", "unknown"); public static OkHttpClient buildHttpClient(final HttpUrl url, final long timeoutMillis) { return buildHttpClient(url, null, null, timeoutMillis); diff --git a/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java b/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java index 2be22a7ad10..b99900e0d85 100644 --- a/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java +++ b/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java @@ -1,6 +1,5 @@ package datadog.environment; -import javax.annotation.Nonnull; import javax.annotation.Nullable; /** @@ -32,7 +31,7 @@ private EnvironmentVariables() {} * @return The environment variable value, {@code defaultValue} if missing, can't be retrieved or * the environment variable name is {@code null}. */ - public static String getOrDefault(@Nonnull String name, String defaultValue) { + public static String getOrDefault(String name, String defaultValue) { if (name == null) { return defaultValue; } diff --git a/components/environment/src/main/java/datadog/environment/OperatingSystem.java b/components/environment/src/main/java/datadog/environment/OperatingSystem.java index 06c72bad553..0041600ce16 100644 --- a/components/environment/src/main/java/datadog/environment/OperatingSystem.java +++ b/components/environment/src/main/java/datadog/environment/OperatingSystem.java @@ -10,11 +10,15 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.stream.Stream; /** Detects operating systems and libc library. */ public final class OperatingSystem { private static final String OS_NAME_PROPERTY = "os.name"; private static final String OS_ARCH_PROPERTY = "os.arch"; + private static final Path TEMP_DIR = Paths.get(computeTempPath()); private OperatingSystem() {} @@ -146,4 +150,57 @@ private static boolean containsArray(byte[] container, int offset, byte[] contai } return true; } + + public static Path getTempDir() { + return TEMP_DIR; + } + + private static String computeTempPath() { + if (JavaVirtualMachine.isJ9()) { + return computeJ9TempDir(); + } + // See + // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettemppatha#remarks + // and + // the JDK OS-specific implementations of os::get_temp_directory(), i.e. + // https://github.com/openjdk/jdk/blob/f50bd0d9ec65a6b9596805d0131aaefc1bb913f3/src/hotspot/os/bsd/os_bsd.cpp#L886-L904 + if (OperatingSystem.isLinux()) { + return "/tmp"; + } else if (OperatingSystem.isWindows()) { + return computeWindowsTempDir(); + } else if (OperatingSystem.isMacOs()) { + return EnvironmentVariables.getOrDefault("TMPDIR", "."); + } else { + return SystemProperties.getOrDefault("java.io.tmpdir", "."); + } + } + + private static String computeWindowsTempDir() { + return Stream.of("TMP", "TEMP", "USERPROFILE") + .map(EnvironmentVariables::get) + .filter(Objects::nonNull) + .filter(((Predicate) String::isEmpty).negate()) + .findFirst() + .orElse("C:\\Windows"); + } + + private static String computeJ9TempDir() { + try { + https: // github.com/eclipse-openj9/openj9/blob/196082df056a990756a5571bfac29585fbbfbb42/jcl/src/java.base/share/classes/openj9/internal/tools/attach/target/IPC.java#L351 + return (String) + Class.forName("openj9.internal.tools.attach.target.IPC") + .getDeclaredMethod("getTmpDir") + .invoke(null); + } catch (Throwable t) { + // Fall back to constants based on J9 source code, may not have perfect coverage + String tmpDir = SystemProperties.get("java.io.tmpdir"); + if (tmpDir != null && !tmpDir.isEmpty()) { + return tmpDir; + } else if (OperatingSystem.isWindows()) { + return "C:\\Documents"; + } else { + return "/tmp"; + } + } + } } diff --git a/components/environment/src/main/java/datadog/environment/SystemProperties.java b/components/environment/src/main/java/datadog/environment/SystemProperties.java index 2a64d30d154..a4fd4753df6 100644 --- a/components/environment/src/main/java/datadog/environment/SystemProperties.java +++ b/components/environment/src/main/java/datadog/environment/SystemProperties.java @@ -1,6 +1,6 @@ package datadog.environment; -import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Safely queries system properties against security manager. @@ -18,7 +18,7 @@ private SystemProperties() {} * @return The system property value, {@code null} if missing, can't be retrieved, or the system * property name is {@code null}. */ - public static String get(String property) { + public static @Nullable String get(String property) { return getOrDefault(property, null); } @@ -31,7 +31,7 @@ public static String get(String property) { * @return The system property value, {@code defaultValue} if missing, can't be retrieved, or the * system property name is {@code null}. */ - public static String getOrDefault(@Nonnull String property, String defaultValue) { + public static String getOrDefault(String property, String defaultValue) { if (property == null) { return defaultValue; } @@ -50,6 +50,9 @@ public static String getOrDefault(@Nonnull String property, String defaultValue) * @return {@code true} if the system property was successfully set, {@code} false otherwise. */ public static boolean set(String property, String value) { + if (property == null || value == null) { + return false; + } try { System.setProperty(property, value); return true; @@ -57,4 +60,22 @@ public static boolean set(String property, String value) { return false; } } + + /** + * Clears a system property. + * + * @param property The system property name to clear. + * @return The previous value of the system property, {@code null} if there was no prior property + * and property can't be cleared. + */ + public static @Nullable String clear(String property) { + if (property == null) { + return null; + } + try { + return System.clearProperty(property); + } catch (SecurityException ignored) { + return null; + } + } } diff --git a/components/environment/src/main/java/datadog/environment/package-info.java b/components/environment/src/main/java/datadog/environment/package-info.java new file mode 100644 index 00000000000..ad2be37a1cd --- /dev/null +++ b/components/environment/src/main/java/datadog/environment/package-info.java @@ -0,0 +1,4 @@ +@ParametersAreNonnullByDefault +package datadog.environment; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java b/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java index 713da94fafe..f376cce7728 100644 --- a/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java +++ b/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java @@ -38,11 +38,29 @@ void testGetOrDefault() { @Test void testSet() { - String testProperty = "test.property"; - String testValue = "test-value"; - assumeTrue(SystemProperties.get(testProperty) == null); - + String testProperty = "test.set.property"; + String testValue = "test.set.value"; + assertNull(SystemProperties.get(testProperty)); assertTrue(SystemProperties.set(testProperty, testValue)); assertEquals(testValue, SystemProperties.get(testProperty)); + // Null values + assertDoesNotThrow(() -> SystemProperties.set(testProperty, null)); + assertFalse(SystemProperties.set(testProperty, null)); + assertDoesNotThrow(() -> SystemProperties.set(null, testValue)); + assertFalse(SystemProperties.set(null, testValue)); + } + + @Test + void testClear() { + String testProperty = "test.clear.property"; + String testValue = "test.clear.value"; + assertNull(SystemProperties.get(testProperty)); + assertNull(SystemProperties.clear(testProperty)); + assumeTrue(SystemProperties.set(testProperty, testValue)); + assertEquals(testValue, SystemProperties.clear(testProperty)); + assertNull(SystemProperties.clear(testProperty)); + // Null values + assertDoesNotThrow(() -> SystemProperties.clear(null)); + assertNull(SystemProperties.clear(null)); } } diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java index 3e583f4b3e3..d8e05b5e1cc 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java @@ -1,5 +1,6 @@ package datadog.trace.bootstrap.benchmark; +import datadog.environment.SystemProperties; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Objects; @@ -18,8 +19,8 @@ public class StaticEventLogger { static { BufferedWriter writer = null; - if ("true".equalsIgnoreCase(System.getProperty("dd.benchmark.enabled"))) { - String dir = System.getProperty("dd.benchmark.output.dir"); + if ("true".equalsIgnoreCase(SystemProperties.get("dd.benchmark.enabled"))) { + String dir = SystemProperties.get("dd.benchmark.output.dir"); dir = (dir != null ? dir + File.separator : ""); String fileName = dir + "startup_" + System.currentTimeMillis() + ".csv"; diff --git a/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java b/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java index e56fda40497..bf312f91d68 100644 --- a/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java +++ b/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java @@ -5,6 +5,7 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.GlobalIgnoresMatcher.globalIgnoresMatcher; import static net.bytebuddy.matcher.ElementMatchers.isDefaultFinalizer; +import datadog.environment.SystemProperties; import datadog.trace.agent.tooling.bytebuddy.SharedTypePools; import datadog.trace.agent.tooling.bytebuddy.iast.TaintableRedefinitionStrategyListener; import datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers; @@ -318,18 +319,17 @@ public static Set getEnabledSystems() { } private static void addByteBuddyRawSetting() { - final String savedPropertyValue = System.getProperty(TypeDefinition.RAW_TYPES_PROPERTY); - try { - System.setProperty(TypeDefinition.RAW_TYPES_PROPERTY, "true"); + final String savedPropertyValue = SystemProperties.get(TypeDefinition.RAW_TYPES_PROPERTY); + if (SystemProperties.set(TypeDefinition.RAW_TYPES_PROPERTY, "true")) { final boolean rawTypes = TypeDescription.AbstractBase.RAW_TYPES; if (!rawTypes && DEBUG) { log.debug("Too late to enable {}", TypeDefinition.RAW_TYPES_PROPERTY); } - } finally { + } else { if (savedPropertyValue == null) { - System.clearProperty(TypeDefinition.RAW_TYPES_PROPERTY); + SystemProperties.clear(TypeDefinition.RAW_TYPES_PROPERTY); } else { - System.setProperty(TypeDefinition.RAW_TYPES_PROPERTY, savedPropertyValue); + SystemProperties.set(TypeDefinition.RAW_TYPES_PROPERTY, savedPropertyValue); } } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java index f46986f31a5..2cd94ba8799 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java @@ -144,6 +144,7 @@ private static GitClient.Factory buildGitClientFactory( @Nonnull private static CiEnvironment buildCiEnvironment(Config config, SharedCommunicationObjects sco) { + CiEnvironment localEnvironment = CiEnvironmentImpl.local(); String remoteEnvVarsProviderUrl = config.getCiVisibilityRemoteEnvVarsProviderUrl(); if (remoteEnvVarsProviderUrl != null) { String remoteEnvVarsProviderKey = config.getCiVisibilityRemoteEnvVarsProviderKey(); @@ -151,10 +152,9 @@ private static CiEnvironment buildCiEnvironment(Config config, SharedCommunicati new CiEnvironmentImpl( getRemoteEnvironment( remoteEnvVarsProviderUrl, remoteEnvVarsProviderKey, sco.okHttpClient)); - CiEnvironment localEnvironment = new CiEnvironmentImpl(System.getenv()); return new CompositeCiEnvironment(remoteEnvironment, localEnvironment); } else { - return new CiEnvironmentImpl(System.getenv()); + return localEnvironment; } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java index 7ba2837e4f9..ba35ceeb6b3 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java @@ -1,11 +1,13 @@ package datadog.trace.civisibility; +import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_HOST; +import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_PORT; import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.extractContextAndGetSpanContext; +import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; -import datadog.trace.api.config.CiVisibilityConfig; +import datadog.environment.SystemProperties; import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; -import datadog.trace.util.Strings; import java.net.InetSocketAddress; import java.util.Properties; import javax.annotation.Nullable; @@ -69,8 +71,8 @@ private boolean isWrapper() { } private boolean isMavenParent() { - return System.getProperty("maven.home") != null - && System.getProperty("classworlds.conf") != null + return SystemProperties.get("maven.home") != null + && SystemProperties.get("classworlds.conf") != null // when using Maven Wrapper || ClassLoader.getSystemClassLoader() .getResource("org/apache/maven/wrapper/WrapperExecutor.class") @@ -82,7 +84,7 @@ private boolean isGradleDaemon() { .getResource("org/gradle/launcher/daemon/bootstrap/GradleDaemon.class") != null // double-check this is not a Gradle Worker - && System.getProperties().getProperty("org.gradle.internal.worker.tmpdir") == null; + && SystemProperties.get("org.gradle.internal.worker.tmpdir") == null; } private boolean isGradleLauncher() { @@ -93,16 +95,12 @@ private boolean isGradleLauncher() { @Nullable public InetSocketAddress getSignalServerAddress() { - // System.getProperty is used rather than Config, + // System properties are used rather than Config, // because system variables can be set after config was initialized String host = - System.getProperty( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_HOST)); + SystemProperties.get(propertyNameToSystemPropertyName(CIVISIBILITY_SIGNAL_SERVER_HOST)); String port = - System.getProperty( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_PORT)); + SystemProperties.get(propertyNameToSystemPropertyName(CIVISIBILITY_SIGNAL_SERVER_PORT)); if (host != null && port != null) { return new InetSocketAddress(host, Integer.parseInt(port)); } else { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/env/CiEnvironmentImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/env/CiEnvironmentImpl.java index 0030df98768..cc26a631490 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/env/CiEnvironmentImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/env/CiEnvironmentImpl.java @@ -1,5 +1,6 @@ package datadog.trace.civisibility.ci.env; +import java.util.Collections; import java.util.Map; public class CiEnvironmentImpl implements CiEnvironment { @@ -10,6 +11,16 @@ public CiEnvironmentImpl(Map env) { this.env = env; } + public static CiEnvironment local() { + Map env; + try { + env = System.getenv(); + } catch (SecurityException e) { + env = Collections.emptyMap(); + } + return new CiEnvironmentImpl(env); + } + @Override public String get(String name) { return env.get(name); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java index 4fc0c27f59a..138420d3416 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java @@ -138,15 +138,18 @@ private Map getPropertiesPropagatedToChildProcess( ExecutionSettings executionSettings, BuildSessionSettings sessionSettings) { Map propagatedSystemProperties = new HashMap<>(); - Properties systemProperties = System.getProperties(); - for (Map.Entry e : systemProperties.entrySet()) { - String propertyName = (String) e.getKey(); - Object propertyValue = e.getValue(); - if ((propertyName.startsWith(Config.PREFIX) - || propertyName.startsWith("datadog.slf4j.simpleLogger.defaultLogLevel")) - && propertyValue != null) { - propagatedSystemProperties.put(propertyName, propertyValue.toString()); + try { + Properties systemProperties = System.getProperties(); + for (Map.Entry e : systemProperties.entrySet()) { + String propertyName = (String) e.getKey(); + Object propertyValue = e.getValue(); + if ((propertyName.startsWith(Config.PREFIX) + || propertyName.startsWith("datadog.slf4j.simpleLogger.defaultLogLevel")) + && propertyValue != null) { + propagatedSystemProperties.put(propertyName, propertyValue.toString()); + } } + } catch (SecurityException ignored) { } propagatedSystemProperties.put( diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java index dbb6dfda2e6..eb668ac8b4b 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java @@ -1,5 +1,6 @@ package datadog.trace.civisibility.utils; +import datadog.environment.SystemProperties; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.IOException; import java.nio.file.FileVisitResult; @@ -77,7 +78,7 @@ public static String expandTilde(final String path) { return path; } - return path.replaceFirst("^~", System.getProperty("user.home")); + return path.replaceFirst("^~", SystemProperties.getOrDefault("user.home", "")); } public static String toRealPath(String path) { diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java index b8cf20dd8f9..fc0f1d64e46 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java @@ -12,6 +12,7 @@ import datadog.common.version.VersionInfo; import datadog.communication.http.OkHttpUtils; import datadog.crashtracking.dto.CrashLog; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import datadog.trace.api.DDTags; import datadog.trace.bootstrap.config.provider.ConfigProvider; @@ -302,7 +303,9 @@ private RequestBody makeTelemetryRequestBody(@Nonnull String content) throws IOE writer.beginObject(); writer.name("env").value(config.getEnv()); writer.name("language_name").value("jvm"); - writer.name("language_version").value(System.getProperty("java.version", "unknown")); + writer + .name("language_version") + .value(SystemProperties.getOrDefault("java.version", "unknown")); writer.name("service_name").value(config.getServiceName()); writer.name("service_version").value(config.getVersion()); writer.name("tracer_version").value(VersionInfo.VERSION); diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java index d65d4f02f7d..681c211c42f 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java @@ -11,6 +11,7 @@ import static java.nio.file.attribute.PosixFilePermissions.fromString; import static java.util.Locale.ROOT; +import datadog.environment.SystemProperties; import datadog.trace.util.PidHelper; import datadog.trace.util.Strings; import java.io.BufferedReader; @@ -36,7 +37,7 @@ static void initialize(String onErrorVal, String onErrorFile) { return; } if (onErrorFile == null || onErrorFile.isEmpty()) { - onErrorFile = System.getProperty("user.dir") + "/hs_err_pid" + PidHelper.getPid() + ".log"; + onErrorFile = SystemProperties.get("user.dir") + "/hs_err_pid" + PidHelper.getPid() + ".log"; LOG.debug("No -XX:ErrorFile value, defaulting to {}", onErrorFile); } else { onErrorFile = Strings.replace(onErrorFile, "%p", PidHelper.getPid()); @@ -120,7 +121,7 @@ private static void writeCrashUploaderScript( private static String template(String line, String execClass, String crashFile) { line = Strings.replace(line, "!AGENT_JAR!", execClass); - line = Strings.replace(line, "!JAVA_HOME!", System.getProperty("java.home")); + line = Strings.replace(line, "!JAVA_HOME!", SystemProperties.get("java.home")); if (crashFile != null) { line = Strings.replace(line, "!JAVA_ERROR_FILE!", crashFile); } diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java index bacf59234cb..d7dade2dc81 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java @@ -8,6 +8,7 @@ import com.datadoghq.profiler.JVMAccess; import com.sun.management.HotSpotDiagnosticMXBean; import datadog.environment.OperatingSystem; +import datadog.environment.SystemProperties; import datadog.libs.ddprof.DdprofLibraryLoader; import datadog.trace.util.PidHelper; import datadog.trace.util.TempLocationManager; @@ -162,7 +163,7 @@ static void writeConfig(Path scriptPath, String... entries) { bw.write(entries[i + 1]); bw.newLine(); } - bw.write("java_home=" + System.getProperty("java.home")); + bw.write("java_home=" + SystemProperties.get("java.home")); bw.newLine(); Runtime.getRuntime() diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java index bd9dc47bfaf..8e9c48724a5 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java @@ -11,6 +11,7 @@ import datadog.crashtracking.dto.SemanticVersion; import datadog.crashtracking.dto.StackFrame; import datadog.crashtracking.dto.StackTrace; +import datadog.environment.SystemProperties; import java.time.OffsetDateTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -214,10 +215,10 @@ public CrashLog parse(String crashLog) { Metadata metadata = new Metadata("dd-trace-java", VersionInfo.VERSION, "java", null); OSInfo osInfo = new OSInfo( - System.getProperty("os.arch"), - System.getProperty("sun.arch.data.model"), - System.getProperty("os.name"), - SemanticVersion.of(System.getProperty("os.version"))); + SystemProperties.get("os.arch"), + SystemProperties.get("sun.arch.data.model"), + SystemProperties.get("os.name"), + SemanticVersion.of(SystemProperties.get("os.version"))); ProcInfo procInfo = pid != null ? new ProcInfo(pid) : null; return new CrashLog(false, datetime, error, metadata, osInfo, procInfo); } diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java index 8aef67b2301..ddd0ddfcf49 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import datadog.common.version.VersionInfo; import datadog.crashtracking.dto.CrashLog; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import datadog.trace.bootstrap.config.provider.ConfigProvider; import java.io.BufferedReader; @@ -184,7 +185,7 @@ public void testTelemetryHappyPath(String log) throws Exception { assertEquals(ENV, event.get("application").get("env").asText()); assertEquals("jvm", event.get("application").get("language_name").asText()); assertEquals( - System.getProperty("java.version", "unknown"), + SystemProperties.getOrDefault("java.version", "unknown"), event.get("application").get("language_version").asText()); assertEquals(SERVICE, event.get("application").get("service_name").asText()); assertEquals(VERSION, event.get("application").get("service_version").asText()); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java index 3bc4d49804c..4ae05865d22 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java @@ -25,6 +25,7 @@ import com.datadog.debugger.util.ClassFileLines; import com.datadog.debugger.util.DebuggerMetrics; import com.datadog.debugger.util.ExceptionHelper; +import datadog.environment.SystemProperties; import datadog.trace.agent.tooling.AgentStrategies; import datadog.trace.api.Config; import datadog.trace.bootstrap.debugger.MethodLocation; @@ -89,7 +90,7 @@ public class DebuggerTransformer implements ClassFileTransformer { SpanProbe.class); private static final String JAVA_IO_TMPDIR = "java.io.tmpdir"; - public static Path DUMP_PATH = Paths.get(System.getProperty(JAVA_IO_TMPDIR), "debugger"); + public static Path DUMP_PATH = Paths.get(SystemProperties.get(JAVA_IO_TMPDIR), "debugger"); private final Config config; private final TransformerDefinitionMatcher definitionMatcher; diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java index 319f455c85e..77ff44c442f 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java @@ -4,6 +4,7 @@ import static datadog.trace.util.AgentThreadFactory.newAgentThread; import static org.datadog.jmxfetch.AppConfig.ACTION_COLLECT; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import datadog.trace.api.GlobalTracer; import datadog.trace.api.StatsDClient; @@ -47,9 +48,9 @@ private static void run(final StatsDClientManager statsDClientManager, final Con } if (!log.isDebugEnabled() - && System.getProperty("org.slf4j.simpleLogger.log.org.datadog.jmxfetch") == null) { + && SystemProperties.get("org.slf4j.simpleLogger.log.org.datadog.jmxfetch") == null) { // Reduce noisiness of jmxfetch logging. - System.setProperty("org.slf4j.simpleLogger.log.org.datadog.jmxfetch", "warn"); + SystemProperties.set("org.slf4j.simpleLogger.log.org.datadog.jmxfetch", "warn"); } final String jmxFetchConfigDir = config.getJmxFetchConfigDir(); @@ -217,10 +218,11 @@ private static List getInternalMetricFiles() { } private static String getLogLocation() { - return System.getProperty("org.slf4j.simpleLogger.logFile", "System.err"); + return SystemProperties.getOrDefault("org.slf4j.simpleLogger.logFile", "System.err"); } private static String getLogLevel() { - return System.getProperty("org.slf4j.simpleLogger.defaultLogLevel", "info").toUpperCase(); + return SystemProperties.getOrDefault("org.slf4j.simpleLogger.defaultLogLevel", "info") + .toUpperCase(); } } diff --git a/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/LogReporter.java b/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/LogReporter.java index 0ea9f531e76..0e6c9892dff 100644 --- a/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/LogReporter.java +++ b/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/LogReporter.java @@ -2,6 +2,7 @@ import static java.nio.file.Files.readAllBytes; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import datadog.trace.api.flare.TracerFlare; import java.io.File; @@ -45,7 +46,7 @@ public void prepareForFlare() { String captureFilename = "tracer" + "-" + Config.get().getRuntimeId() + "-" + endMillis + ".log"; try { - Path tempPath = Paths.get(System.getProperty("java.io.tmpdir"), captureFilename); + Path tempPath = Paths.get(SystemProperties.get("java.io.tmpdir"), captureFilename); Path parentPath = tempPath.getParent(); if (parentPath != null && !Files.isDirectory(parentPath)) { Files.createDirectories(parentPath); diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/Arch.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/Arch.java index 521addd1133..a1f1bb4dd1e 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/Arch.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/Arch.java @@ -1,5 +1,6 @@ package com.datadog.profiling.ddprof; +import datadog.environment.SystemProperties; import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; @@ -29,6 +30,6 @@ public static Arch of(String identifier) { } public static Arch current() { - return Arch.of(System.getProperty("os.arch")); + return Arch.of(SystemProperties.get("os.arch")); } } diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/OperatingSystem.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/OperatingSystem.java index f58445c6a95..d0443533933 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/OperatingSystem.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/OperatingSystem.java @@ -1,5 +1,6 @@ package com.datadog.profiling.ddprof; +import datadog.environment.SystemProperties; import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; @@ -27,6 +28,6 @@ public static OperatingSystem of(String identifier) { } public static OperatingSystem current() { - return OperatingSystem.of(System.getProperty("os.name")); + return OperatingSystem.of(SystemProperties.get("os.name")); } } diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java index 0781bd5f183..44f027bd264 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java @@ -3,6 +3,7 @@ import static datadog.trace.util.AgentThreadFactory.AgentThread.PROFILER_HTTP_DISPATCHER; import datadog.environment.JavaVirtualMachine; +import datadog.environment.SystemProperties; import datadog.trace.api.profiling.RecordingData; import datadog.trace.relocate.api.IOLogger; import datadog.trace.util.AgentThreadFactory; @@ -44,7 +45,7 @@ public class JfrCliHelper { public static void invokeOn(final RecordingData data, final IOLogger ioLogger) { File tmp = null; try { - Path jfr = Paths.get(System.getProperty("java.home"), "bin", "jfr"); + Path jfr = Paths.get(SystemProperties.get("java.home"), "bin", "jfr"); if (JavaVirtualMachine.isJ9() || !Files.exists(jfr)) { ioLogger.error("Failed to gather information on recording, can't find `jfr`"); return; diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java index a09c220c783..fea7fee6e0a 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java @@ -10,6 +10,7 @@ import static org.mockito.Mockito.withSettings; import datadog.environment.JavaVirtualMachine; +import datadog.environment.SystemProperties; import datadog.trace.api.profiling.RecordingData; import datadog.trace.api.profiling.RecordingInputStream; import datadog.trace.relocate.api.IOLogger; @@ -75,7 +76,7 @@ public void testInvokeOn() throws Exception { } private boolean hasJfr() { - return Files.exists(Paths.get(System.getProperty("java.home"), "bin", "jfr")); + return Files.exists(Paths.get(SystemProperties.get("java.home"), "bin", "jfr")); } private RecordingData mockRecordingData() throws IOException { diff --git a/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java b/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java index 4217636d078..6daf5986b11 100644 --- a/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java +++ b/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java @@ -14,6 +14,7 @@ import com.datadog.profiling.ddprof.Arch; import com.datadog.profiling.ddprof.OperatingSystem; import datadog.environment.JavaVirtualMachine; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import datadog.trace.api.Platform; import datadog.trace.api.config.ProfilingConfig; @@ -230,9 +231,9 @@ private static String getFixProposalMessage(boolean datadogProfilerEnabled, bool if (!datadogProfilerEnabled && !jfrEnabled) { return "Profiling is disabled by configuration. Please, make sure that your configuration is correct."; } - final String javaVendor = System.getProperty("java.vendor"); - final String javaVersion = System.getProperty("java.version"); - final String javaRuntimeName = System.getProperty("java.runtime.name"); + final String javaVendor = SystemProperties.getOrDefault("java.vendor", "unknown"); + final String javaVersion = SystemProperties.getOrDefault("java.version", "unknown"); + final String javaRuntimeName = SystemProperties.getOrDefault("java.runtime.name", "unknown"); final String message = "Not enabling profiling for vendor=" + javaVendor diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/profiler/EnvironmentChecker.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/profiler/EnvironmentChecker.java index f2dbb165a80..8436ea435b1 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/profiler/EnvironmentChecker.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/profiler/EnvironmentChecker.java @@ -2,6 +2,7 @@ import datadog.environment.JavaVirtualMachine; import datadog.environment.OperatingSystem; +import datadog.environment.SystemProperties; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.File; import java.io.IOException; @@ -28,9 +29,9 @@ public static boolean checkEnvironment(String temp) { "Using Java version: " + JavaVirtualMachine.getRuntimeVersion() + " (" - + System.getProperty("java.home") + + SystemProperties.getOrDefault("java.home", "unknown") + ")"); - System.out.println("Running as user: " + System.getProperty("user.name")); + System.out.println("Running as user: " + SystemProperties.getOrDefault("user.name", "unknown")); boolean result = false; result |= checkJFR(); result |= checkDdprof(); @@ -46,7 +47,7 @@ public static boolean checkEnvironment(String temp) { "Profiler will not work properly due to issues with temp directory location."); return false; } else { - if (!temp.equals(System.getProperty("java.io.tmpdir"))) { + if (!temp.equals(SystemProperties.get("java.io.tmpdir"))) { System.out.println( "! Make sure to add '-Ddd.profiling.tempdir=" + temp + "' to your JVM command line !"); } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WafInitialization.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WafInitialization.java index 2e63300a764..a1e275513ff 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WafInitialization.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WafInitialization.java @@ -2,6 +2,7 @@ import com.datadog.appsec.util.StandardizedLogging; import com.datadog.ddwaf.Waf; +import datadog.environment.SystemProperties; import java.io.File; import java.io.IOException; import java.util.Scanner; @@ -13,7 +14,7 @@ public class WafInitialization { private static boolean initWAF() { try { - boolean simpleLoad = System.getProperty("POWERWAF_SIMPLE_LOAD") != null; + boolean simpleLoad = SystemProperties.get("POWERWAF_SIMPLE_LOAD") != null; Waf.initialize(simpleLoad); } catch (Exception e) { Logger logger = LoggerFactory.getLogger(WafInitialization.class); @@ -26,7 +27,7 @@ private static boolean initWAF() { } private static String getLibc() { - String os = System.getProperty("os.name"); + String os = SystemProperties.get("os.name"); if ("Linux".equals(os)) { File file = new File("/proc/self/maps"); try (Scanner sc = new Scanner(file, "ISO-8859-1")) { diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java index 002fcd86331..acb1c559e5d 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java @@ -1,12 +1,16 @@ package com.datadog.appsec.util; +import datadog.environment.SystemProperties; import java.io.BufferedReader; import java.io.InputStreamReader; public class AppSecVersion { - public static final String JAVA_VERSION = System.getProperty("java.version", "unknown"); - public static final String JAVA_VM_NAME = System.getProperty("java.vm.name", "unknown"); - public static final String JAVA_VM_VENDOR = System.getProperty("java.vm.vendor", "unknown"); + public static final String JAVA_VERSION = + SystemProperties.getOrDefault("java.version", "unknown"); + public static final String JAVA_VM_NAME = + SystemProperties.getOrDefault("java.vm.name", "unknown"); + public static final String JAVA_VM_VENDOR = + SystemProperties.getOrDefault("java.vm.vendor", "unknown"); public static final String VERSION; static { diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/StandardizedLogging.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/StandardizedLogging.java index c51eb94da30..beac1dd9371 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/StandardizedLogging.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/StandardizedLogging.java @@ -5,6 +5,7 @@ import com.datadog.appsec.event.data.Address; import com.datadog.appsec.report.AppSecEvent; import com.datadog.ddwaf.Waf; +import datadog.environment.SystemProperties; import org.slf4j.Logger; import org.slf4j.Marker; import org.slf4j.MarkerFactory; @@ -42,11 +43,11 @@ public static void libddwafCannotBeLoaded(Logger logger, String libc) { + "AppSec could not start. No security activities will be collected. " + "Please contact support at https://docs.datadoghq.com/help/ for help. " + "Host information: operating_system: {}, libc: {}, arch: {}, runtime: {} {}", - System.getProperty("os.name"), + SystemProperties.get("os.name"), libc, - System.getProperty("os.arch"), - System.getProperty("java.vm.vendor"), - System.getProperty("java.version")); + SystemProperties.get("os.arch"), + SystemProperties.get("java.vm.vendor"), + SystemProperties.get("java.version")); } // C4: diff --git a/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java b/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java index 14becf51e79..b9e3ee7bf15 100644 --- a/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java +++ b/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java @@ -10,6 +10,7 @@ import com.sun.jna.Pointer; import datadog.cws.erpc.Erpc; import datadog.cws.erpc.Request; +import datadog.environment.SystemProperties; import datadog.trace.api.DD128bTraceId; import datadog.trace.api.DDTraceId; @@ -40,7 +41,7 @@ public interface CLibrary extends Library { } static int getGettidSyscallId() { - String arch = System.getProperty("os.arch"); + String arch = SystemProperties.get("os.arch"); if (arch.equals("amd64")) { return 186; // 186 is the syscall ID for "gettid" on amd64 } else if (arch.equals("arm64")) { diff --git a/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java b/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java index b281639d7ff..c8f8fd851ed 100644 --- a/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java @@ -16,6 +16,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.google.auto.service.AutoService; +import datadog.environment.EnvironmentVariables; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.CallDepthThreadLocalMap; @@ -60,8 +61,7 @@ public String[] helperClassNames() { @Override protected boolean defaultEnabled() { - final String handler = System.getenv(HANDLER_ENV_NAME); - return null != handler; + return EnvironmentVariables.get(HANDLER_ENV_NAME) != null; } @Override diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringRepositoryTest.groovy b/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringRepositoryTest.groovy index a8831ca3581..b4f7dbc1653 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringRepositoryTest.groovy +++ b/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringRepositoryTest.groovy @@ -5,6 +5,7 @@ import com.couchbase.client.java.CouchbaseCluster import com.couchbase.client.java.env.CouchbaseEnvironment import com.couchbase.client.java.view.DefaultView import com.couchbase.client.java.view.DesignDocument +import datadog.environment.JavaVirtualMachine import org.springframework.context.ConfigurableApplicationContext import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.data.repository.CrudRepository @@ -18,7 +19,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan @IgnoreIf({ // TODO Java 17: This version of spring-data doesn't support Java 17 - new BigDecimal(System.getProperty("java.specification.version")).isAtLeast(17.0) + JavaVirtualMachine.isJavaVersionAtLeast(17) }) abstract class CouchbaseSpringRepositoryTest extends AbstractCouchbaseTest { static final Closure FIND diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java index a68f07b848d..fa3a0bc92c8 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java @@ -5,6 +5,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import com.google.auto.service.AutoService; +import datadog.environment.SystemProperties; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.InstrumenterConfig; @@ -167,7 +168,7 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[ // Specific GraalVM versions have different flags for enabling JFR // We don't want to drag in internal-api via Platform class, so we just read the system // property directly - String version = System.getProperty("java.specification.version"); + String version = SystemProperties.getOrDefault("java.specification.version", ""); if (version.startsWith("17")) { args[oldLength++] = "-H:EnableMonitoringFeatures=jfr"; } else { diff --git a/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java b/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java index aaf161be27c..c64df624fe7 100644 --- a/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java +++ b/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java @@ -1,9 +1,10 @@ package datadog.trace.instrumentation.gradle; +import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION; import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; -import datadog.trace.api.config.CiVisibilityConfig; import java.io.File; import java.nio.file.Path; import java.util.HashMap; @@ -14,10 +15,8 @@ public class GradleDaemonInjectionUtils { public static Map addJavaagentToGradleDaemonProperties( Map jvmOptions) { - Properties systemProperties = System.getProperties(); - if (systemProperties.containsKey( - propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION))) { + if (SystemProperties.get(propertyNameToSystemPropertyName(CIVISIBILITY_INJECTED_TRACER_VERSION)) + != null) { // This Gradle launcher is started by a process that is itself instrumented, // most likely this is a Gradle build using Gradle Test Kit to fork another Gradle instance // (e.g. to test a Gradle plugin). @@ -29,16 +28,20 @@ public static Map addJavaagentToGradleDaemonProperties( Path agentJarPath = agentJar.toPath(); StringBuilder agentArg = new StringBuilder("-javaagent:").append(agentJarPath).append('='); - for (Map.Entry e : systemProperties.entrySet()) { - String propertyName = (String) e.getKey(); - Object propertyValue = e.getValue(); - if (propertyName.startsWith(Config.PREFIX)) { - agentArg - .append(propertyName) - .append("='") - .append(String.valueOf(propertyValue).replace("'", "'\\''")) - .append("',"); + try { + Properties systemProperties = System.getProperties(); + for (Map.Entry e : systemProperties.entrySet()) { + String propertyName = (String) e.getKey(); + Object propertyValue = e.getValue(); + if (propertyName.startsWith(Config.PREFIX)) { + agentArg + .append(propertyName) + .append("='") + .append(String.valueOf(propertyValue).replace("'", "'\\''")) + .append("',"); + } } + } catch (SecurityException ignored) { } // creating a new map in case jvmOptions is immutable diff --git a/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/management/CustomMBeanBuilderInstrumentation.java b/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/management/CustomMBeanBuilderInstrumentation.java index df5dbbfaa8b..395c963bf4e 100644 --- a/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/management/CustomMBeanBuilderInstrumentation.java +++ b/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/management/CustomMBeanBuilderInstrumentation.java @@ -5,6 +5,7 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; +import datadog.environment.SystemProperties; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.jmx.MBeanServerRegistry; @@ -20,7 +21,7 @@ public class CustomMBeanBuilderInstrumentation extends InstrumenterModule.Tracin public CustomMBeanBuilderInstrumentation() { super("java-lang-management"); - customBuilder = System.getProperty("javax.management.builder.initial"); + customBuilder = SystemProperties.get("javax.management.builder.initial"); } @Override diff --git a/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy b/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy index 1ce82df6e34..0af25e9b290 100644 --- a/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy @@ -1,3 +1,4 @@ +import datadog.environment.JavaVirtualMachine import datadog.trace.agent.test.base.HttpClientTest import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions import datadog.trace.instrumentation.jaxrs.JaxRsClientDecorator @@ -118,7 +119,7 @@ class ResteasyClientAsyncV1ForkedTest extends ResteasyClientAsyncTest implements @IgnoreIf({ // TODO Java 17: This version of apache-cxf doesn't work on Java 17 // exception in org.apache.cxf.common.util.ReflectionUtil - new BigDecimal(System.getProperty("java.specification.version")).isAtLeast(17.0) + JavaVirtualMachine.isJavaVersionAtLeast(17) }) class CxfClientAsyncTest extends JaxRsClientAsyncTest { diff --git a/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientTest.groovy b/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientTest.groovy index f7f83cb4ace..78660157452 100644 --- a/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-client-2.0/src/test/groovy/JaxRsClientTest.groovy @@ -1,3 +1,4 @@ +import datadog.environment.JavaVirtualMachine import datadog.trace.agent.test.base.HttpClientTest import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions import datadog.trace.instrumentation.jaxrs.JaxRsClientDecorator @@ -104,7 +105,7 @@ class ResteasyClientV1ForkedTest extends ResteasyClientTest implements TestingGe @IgnoreIf({ // TODO Java 17: This version of apache-cxf doesn't work on Java 17 // exception in org.apache.cxf.common.util.ReflectionUtil - new BigDecimal(System.getProperty("java.specification.version")).isAtLeast(17.0) + JavaVirtualMachine.isJavaVersionAtLeast(17) }) class CxfClientTest extends JaxRsClientTest { diff --git a/dd-java-agent/instrumentation/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java b/dd-java-agent/instrumentation/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java index c5315dc0921..3b49dce6841 100644 --- a/dd-java-agent/instrumentation/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java +++ b/dd-java-agent/instrumentation/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.maven3; +import datadog.environment.EnvironmentVariables; import datadog.trace.api.civisibility.domain.JavaAgent; import datadog.trace.util.MethodHandles; import datadog.trace.util.Strings; @@ -65,7 +66,7 @@ public abstract class MavenUtils { * of the request object */ public static String getCommandLine(MavenSession session) { - String mavenCmdLineArgsEnvVar = System.getenv(MAVEN_CMD_LINE_ARGS_ENVIRONMENT_VAR); + String mavenCmdLineArgsEnvVar = EnvironmentVariables.get(MAVEN_CMD_LINE_ARGS_ENVIRONMENT_VAR); if (mavenCmdLineArgsEnvVar != null) { return MVN_CMD_LINE_INVOCATION + mavenCmdLineArgsEnvVar; } diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibcobw-6/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java b/dd-java-agent/instrumentation/tibco-businessworks/tibcobw-6/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java index e607c288d12..94c4226acbc 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibcobw-6/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibcobw-6/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.TIBCO_NODE; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.TIBCO_VERSION; +import datadog.environment.SystemProperties; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes; import datadog.trace.bootstrap.instrumentation.api.Tags; @@ -16,7 +17,7 @@ public class TibcoDecorator extends BaseDecorator { private static final Logger LOGGER = LoggerFactory.getLogger(TibcoDecorator.class); private static final CharSequence TIBCO_BW = UTF8BytesString.create("tibco_bw"); private static final CharSequence APPNODE_NAME = - UTF8BytesString.create(System.getProperty("bw.appnode")); + UTF8BytesString.create(SystemProperties.get("bw.appnode")); private static final CharSequence BW_VERSION = bwVersion(); public static final CharSequence TIBCO_PROCESS_OPERATION = UTF8BytesString.create("tibco.process"); diff --git a/dd-java-agent/instrumentation/websphere-jmx/src/main/java/datadog/trace/instrumentation/websphere_jmx/WebsphereSecurityInstrumentation.java b/dd-java-agent/instrumentation/websphere-jmx/src/main/java/datadog/trace/instrumentation/websphere_jmx/WebsphereSecurityInstrumentation.java index d7c6088122e..aef4c7a72f2 100644 --- a/dd-java-agent/instrumentation/websphere-jmx/src/main/java/datadog/trace/instrumentation/websphere_jmx/WebsphereSecurityInstrumentation.java +++ b/dd-java-agent/instrumentation/websphere-jmx/src/main/java/datadog/trace/instrumentation/websphere_jmx/WebsphereSecurityInstrumentation.java @@ -5,6 +5,7 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; +import datadog.environment.SystemProperties; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.config.provider.ConfigProvider; @@ -24,7 +25,7 @@ public class WebsphereSecurityInstrumentation extends InstrumenterModule.Tracing public WebsphereSecurityInstrumentation() { super("websphere-jmx"); - customBuilder = System.getProperty("javax.management.builder.initial"); + customBuilder = SystemProperties.get("javax.management.builder.initial"); } @Override diff --git a/dd-java-agent/src/test/groovy/datadog/trace/agent/InitializationTelemetryTest.groovy b/dd-java-agent/src/test/groovy/datadog/trace/agent/InitializationTelemetryTest.groovy index f94b8df869f..e9b2b3001a1 100644 --- a/dd-java-agent/src/test/groovy/datadog/trace/agent/InitializationTelemetryTest.groovy +++ b/dd-java-agent/src/test/groovy/datadog/trace/agent/InitializationTelemetryTest.groovy @@ -55,15 +55,15 @@ class InitializationTelemetryTest extends Specification { def "incomplete agent start-up"() { // In this case, the SecurityManager blocks a custom permission that is checked by bytebuddy causing - // agent initialization to fail. However, we should catch the exception allowing the application + // agent initialization to fail. However, we should catch the exception allowing the application // to run normally. when: def result = InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockByteBuddy) - then: + then: 'should complete successfully and catch error' result.exitCode == 0 !result.telemetryJson.contains('library_entrypoint.complete') - result.telemetryJson.contains('error_type:java.lang.IllegalStateException') + result.telemetryJson.contains('error_type:') } def "block forwarder env var"() { diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index 5e08f1f9c64..57e66c4de5f 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -630,8 +630,10 @@ import static datadog.trace.util.CollectionUtils.tryMakeImmutableSet; import static datadog.trace.util.Strings.propertyNameToEnvironmentVariableName; +import datadog.environment.EnvironmentVariables; import datadog.environment.JavaVirtualMachine; import datadog.environment.OperatingSystem; +import datadog.environment.SystemProperties; import datadog.trace.api.civisibility.CiVisibilityWellKnownTags; import datadog.trace.api.config.GeneralConfig; import datadog.trace.api.config.ProfilingConfig; @@ -1236,7 +1238,7 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins configFileStatus = configProvider.getConfigFileStatus(); runtimeIdEnabled = configProvider.getBoolean(RUNTIME_ID_ENABLED, true, RUNTIME_METRICS_RUNTIME_ID_ENABLED); - runtimeVersion = System.getProperty("java.version", "unknown"); + runtimeVersion = SystemProperties.getOrDefault("java.version", "unknown"); // Note: We do not want APiKey to be loaded from property for security reasons // Note: we do not use defined default here @@ -3397,7 +3399,7 @@ public static boolean isDatadogProfilerSafeInCurrentEnvironment() { // don't want to put this logic (which will evolve) in the public ProfilingConfig, and can't // access Platform there if (!JavaVirtualMachine.isJ9() && isJavaVersion(8)) { - String arch = System.getProperty("os.arch"); + String arch = SystemProperties.get("os.arch"); if ("aarch64".equalsIgnoreCase(arch) || "arm64".equalsIgnoreCase(arch)) { return false; } @@ -4441,12 +4443,12 @@ public CiVisibilityWellKnownTags getCiVisibilityWellKnownTags() { getRuntimeId(), getEnv(), LANGUAGE_TAG_VALUE, - System.getProperty("java.runtime.name"), - System.getProperty("java.version"), - System.getProperty("java.vendor"), - System.getProperty("os.arch"), - System.getProperty("os.name"), - System.getProperty("os.version"), + SystemProperties.get("java.runtime.name"), + SystemProperties.get("java.version"), + SystemProperties.get("java.vendor"), + SystemProperties.get("os.arch"), + SystemProperties.get("os.name"), + SystemProperties.get("os.version"), isServiceNameSetByUser() ? "true" : "false"); } @@ -5185,7 +5187,7 @@ private static boolean isWindowsOS() { } private static String getEnv(String name) { - String value = System.getenv(name); + String value = EnvironmentVariables.get(name); if (value != null) { ConfigCollector.get().put(name, value, ConfigOrigin.ENV); } @@ -5208,7 +5210,7 @@ private static String getProp(String name) { } private static String getProp(String name, String def) { - String value = System.getProperty(name, def); + String value = SystemProperties.getOrDefault(name, def); if (value != null) { ConfigCollector.get().put(name, value, ConfigOrigin.JVM_PROP); } diff --git a/internal-api/src/main/java/datadog/trace/api/Platform.java b/internal-api/src/main/java/datadog/trace/api/Platform.java index 36dd9921ac5..f8293f654ba 100644 --- a/internal-api/src/main/java/datadog/trace/api/Platform.java +++ b/internal-api/src/main/java/datadog/trace/api/Platform.java @@ -5,6 +5,8 @@ import static datadog.environment.JavaVirtualMachine.isJavaVersionAtLeast; import static datadog.environment.JavaVirtualMachine.isOracleJDK8; +import datadog.environment.SystemProperties; + /** * This class is used early on during premain; it must not touch features like JMX or JUL in case * they trigger early loading/binding. @@ -51,7 +53,7 @@ private static boolean checkForJfr() { private static boolean checkForNativeImageBuilder() { try { - return "org.graalvm.nativeimage.builder".equals(System.getProperty("jdk.module.main")); + return "org.graalvm.nativeimage.builder".equals(SystemProperties.get("jdk.module.main")); } catch (Throwable e) { return false; } diff --git a/internal-api/src/main/java/datadog/trace/api/ProcessTags.java b/internal-api/src/main/java/datadog/trace/api/ProcessTags.java index b13adc60fb1..30d854387a1 100644 --- a/internal-api/src/main/java/datadog/trace/api/ProcessTags.java +++ b/internal-api/src/main/java/datadog/trace/api/ProcessTags.java @@ -1,5 +1,7 @@ package datadog.trace.api; +import datadog.environment.EnvironmentVariables; +import datadog.environment.SystemProperties; import datadog.trace.api.env.CapturedEnvironment; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import datadog.trace.util.TraceUtils; @@ -27,7 +29,7 @@ public class ProcessTags { public static final String ENTRYPOINT_WORKDIR = "entrypoint.workdir"; // visible for testing - static Function envGetter = System::getenv; + static Function envGetter = EnvironmentVariables::get; private static class Lazy { // the tags are used to compute a hash for dsm hence that map must be sorted. @@ -58,20 +60,12 @@ private static void fillJeeTags(SortedMap tags) { private static void insertTagFromSysPropIfPresent( Map tags, String propKey, String tagKey) { - String value = maybeGetSystemProperty(propKey); + String value = SystemProperties.get(propKey); if (value != null) { tags.put(tagKey, value); } } - private static String maybeGetSystemProperty(String propKey) { - try { - return System.getProperty(propKey); - } catch (Throwable ignored) { - } - return null; - } - private static boolean insertTagFromEnvIfPresent( Map tags, String envKey, String tagKey) { try { @@ -102,11 +96,7 @@ private static boolean insertLastPathSegmentIfPresent( } private static boolean hasSystemProperty(String propKey) { - try { - return System.getProperties().containsKey(propKey); - } catch (Throwable ignored) { - } - return false; + return SystemProperties.get(propKey) != null; } private static void fillBaseTags(Map tags) { @@ -123,12 +113,12 @@ private static void fillBaseTags(Map tags) { insertLastPathSegmentIfPresent(tags, processInfo.jarFile.getParent(), ENTRYPOINT_BASEDIR); } - insertLastPathSegmentIfPresent(tags, maybeGetSystemProperty("user.dir"), ENTRYPOINT_WORKDIR); + insertLastPathSegmentIfPresent(tags, SystemProperties.get("user.dir"), ENTRYPOINT_WORKDIR); } private static boolean fillJbossTags(Map tags) { if (insertLastPathSegmentIfPresent( - tags, maybeGetSystemProperty("jboss.home.dir"), "jboss.home")) { + tags, SystemProperties.get("jboss.home.dir"), "jboss.home")) { insertTagFromSysPropIfPresent(tags, "jboss.server.name", SERVER_NAME); tags.put("jboss.mode", hasSystemProperty("[Standalone]") ? "standalone" : "domain"); tags.put(SERVER_TYPE, "jboss"); diff --git a/internal-api/src/main/java/datadog/trace/api/env/CapturedEnvironment.java b/internal-api/src/main/java/datadog/trace/api/env/CapturedEnvironment.java index 47b2daacc9e..956db28c2de 100644 --- a/internal-api/src/main/java/datadog/trace/api/env/CapturedEnvironment.java +++ b/internal-api/src/main/java/datadog/trace/api/env/CapturedEnvironment.java @@ -1,5 +1,6 @@ package datadog.trace.api.env; +import datadog.environment.EnvironmentVariables; import datadog.environment.JavaVirtualMachine; import datadog.trace.api.config.GeneralConfig; import java.io.File; @@ -77,8 +78,8 @@ static void useFixedProcessInfo(final ProcessInfo processInfo) { * autodetection will return either the JAR filename or the java main class. */ private String autodetectServiceName() { - String inAas = System.getenv("DD_AZURE_APP_SERVICES"); - String siteName = System.getenv("WEBSITE_SITE_NAME"); + String inAas = EnvironmentVariables.get("DD_AZURE_APP_SERVICES"); + String siteName = EnvironmentVariables.get("WEBSITE_SITE_NAME"); if (("true".equalsIgnoreCase(inAas) || "1".equals(inAas)) && siteName != null) { return siteName; diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java index 967f5a7dda4..3254c30db7d 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java @@ -1,5 +1,7 @@ package datadog.trace.bootstrap.config.provider; +import datadog.environment.EnvironmentVariables; +import datadog.environment.SystemProperties; import datadog.trace.util.Strings; import java.util.Map; @@ -21,14 +23,14 @@ public static void injectAgentArgsConfig(Map args) { } for (Map.Entry e : args.entrySet()) { String propertyName = e.getKey(); - String existingPropertyValue = System.getProperty(propertyName); + String existingPropertyValue = SystemProperties.get(propertyName); if (existingPropertyValue != null) { // system properties should have higher priority than agent arguments continue; } String envVarName = Strings.toEnvVar(propertyName); - String envVarValue = System.getenv(envVarName); + String envVarValue = EnvironmentVariables.get(envVarName); if (envVarValue != null) { // env variables should have higher priority than agent arguments continue; diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java index 0a2715dd11a..1edeb072c80 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java @@ -2,6 +2,7 @@ import static datadog.trace.api.config.GeneralConfig.CONFIGURATION_FILE; +import datadog.environment.SystemProperties; import datadog.trace.api.ConfigCollector; import datadog.trace.api.ConfigOrigin; import de.thetaphi.forbiddenapis.SuppressForbidden; @@ -471,8 +472,11 @@ private static Properties loadConfigurationFile(ConfigProvider configProvider) { } // Normalizing tilde (~) paths for unix systems - configurationFilePath = - configurationFilePath.replaceFirst("^~", System.getProperty("user.home")); + String home; + if (configurationFilePath.charAt(0) == '~' + && (home = SystemProperties.get("user.home")) != null) { + configurationFilePath = home + configurationFilePath.substring(1); + } // Configuration properties file is optional final File configurationFile = new File(configurationFilePath); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java index ffbdf6f77f2..c8531f6a094 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java @@ -1,22 +1,19 @@ package datadog.trace.bootstrap.config.provider; +import static datadog.trace.api.ConfigOrigin.ENV; import static datadog.trace.util.Strings.propertyNameToEnvironmentVariableName; +import datadog.environment.EnvironmentVariables; import datadog.trace.api.ConfigOrigin; final class EnvironmentConfigSource extends ConfigProvider.Source { - @Override protected String get(String key) { - try { - return System.getenv(propertyNameToEnvironmentVariableName(key)); - } catch (SecurityException e) { - return null; - } + return EnvironmentVariables.get(propertyNameToEnvironmentVariableName(key)); } @Override public ConfigOrigin origin() { - return ConfigOrigin.ENV; + return ENV; } } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java index 11ab4841a29..863a59fdcf8 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java @@ -14,7 +14,10 @@ import static datadog.trace.api.config.TracerConfig.RESPONSE_HEADER_TAGS; import static datadog.trace.api.config.TracerConfig.TRACE_PROPAGATION_STYLE; import static datadog.trace.api.config.TracerConfig.TRACE_SAMPLE_RATE; +import static datadog.trace.util.Strings.toEnvVar; +import datadog.environment.EnvironmentVariables; +import datadog.environment.SystemProperties; import datadog.trace.api.ConfigOrigin; import datadog.trace.api.TracePropagationStyle; import datadog.trace.api.telemetry.OtelEnvMetricCollector; @@ -141,12 +144,8 @@ private String getOtelProperty(String otelSysProp, String ddSysProp) { } String ddValue = getDatadogProperty(ddSysProp); if (null != ddValue) { - String otelEnvVar = Strings.toEnvVar(otelSysProp); - log.warn( - "Both {} and {} are set, ignoring {}", - Strings.toEnvVar(ddSysProp), - otelEnvVar, - otelEnvVar); + String otelEnvVar = toEnvVar(otelSysProp); + log.warn("Both {} and {} are set, ignoring {}", toEnvVar(ddSysProp), otelEnvVar, otelEnvVar); otelEnvMetricCollector.setHidingOtelEnvVarMetric( Strings.toEnvVarLowerCase(otelSysProp), Strings.toEnvVarLowerCase(ddSysProp)); return null; @@ -186,9 +185,9 @@ private String getDatadogProperty(String sysProp) { *

Checks system properties and environment variables. */ private static String getProperty(String sysProp) { - String value = System.getProperty(sysProp); + String value = SystemProperties.get(sysProp); if (null == value) { - value = System.getenv(Strings.toEnvVar(sysProp)); + value = EnvironmentVariables.get(toEnvVar(sysProp)); } return value; } @@ -204,8 +203,10 @@ private void capture(String key, String value) { private static Properties loadOtelConfigFile() { String path = getProperty("otel.javaagent.configuration-file"); if (null != path && !path.isEmpty()) { - if (path.charAt(0) == '~') { - path = System.getProperty("user.home") + path.substring(1); + // Inflate '~' prefix as home folder + String home; + if (path.charAt(0) == '~' && (home = SystemProperties.get("user.home")) != null) { + path = home + path.substring(1); } File file = new File(path); if (file.exists()) { diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java index 3b43ad47457..010b73659f7 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java @@ -1,5 +1,7 @@ package datadog.trace.bootstrap.config.provider; +import datadog.environment.EnvironmentVariables; +import datadog.environment.SystemProperties; import datadog.trace.bootstrap.config.provider.stableconfig.Rule; import datadog.trace.bootstrap.config.provider.stableconfig.Selector; import datadog.trace.bootstrap.config.provider.stableconfig.StableConfig; @@ -138,7 +140,7 @@ private static boolean checkEnvMatches( return false; } - // We do all of the case insensitivity modifications in this function, because each selector will + // We do all the case insensitivity modifications in this function, because each selector will // be viewed just once static boolean selectorMatch(String origin, List matches, String operator, String key) { switch (origin.toLowerCase()) { @@ -156,7 +158,7 @@ static boolean selectorMatch(String origin, List matches, String operato if (key == null) { return false; } - String envValue = System.getenv(key.toUpperCase()); + String envValue = EnvironmentVariables.get(key.toUpperCase()); if (envValue == null) { return false; } @@ -187,7 +189,7 @@ static boolean selectorMatch(String origin, List matches, String operato return false; } // Cut the -D prefix - return System.getProperty(key.substring(2)) != null; + return SystemProperties.get(key.substring(2)) != null; case "tags": // TODO: Support this down the line (Must define the source of "tags" first) return false; @@ -249,7 +251,7 @@ private static String processTemplateVar(String templateVar) throws IOException if (envVar.isEmpty()) { throw new IOException("Empty environment variable name in template"); } - String value = System.getenv(envVar.toUpperCase()); + String value = EnvironmentVariables.get(envVar.toUpperCase()); if (value == null || value.isEmpty()) { return UNDEFINED_VALUE; } @@ -266,7 +268,7 @@ private static String processTemplateVar(String templateVar) throws IOException processArg); return UNDEFINED_VALUE; } - String value = System.getProperty(processArg.substring(2)); + String value = SystemProperties.get(processArg.substring(2)); if (value == null || value.isEmpty()) { return UNDEFINED_VALUE; } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java index a0d561b5a37..0ad6e15fa6d 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java @@ -1,22 +1,19 @@ package datadog.trace.bootstrap.config.provider; +import static datadog.trace.api.ConfigOrigin.JVM_PROP; import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; +import datadog.environment.SystemProperties; import datadog.trace.api.ConfigOrigin; public final class SystemPropertiesConfigSource extends ConfigProvider.Source { - @Override protected String get(String key) { - try { - return System.getProperty(propertyNameToSystemPropertyName(key)); - } catch (SecurityException e) { - return null; - } + return SystemProperties.get(propertyNameToSystemPropertyName(key)); } @Override public ConfigOrigin origin() { - return ConfigOrigin.JVM_PROP; + return JVM_PROP; } } diff --git a/internal-api/src/main/java/datadog/trace/util/PidHelper.java b/internal-api/src/main/java/datadog/trace/util/PidHelper.java index 0fafaf8df1c..43fd7fa96ec 100644 --- a/internal-api/src/main/java/datadog/trace/util/PidHelper.java +++ b/internal-api/src/main/java/datadog/trace/util/PidHelper.java @@ -1,7 +1,9 @@ package datadog.trace.util; +import datadog.environment.EnvironmentVariables; import datadog.environment.JavaVirtualMachine; import datadog.environment.OperatingSystem; +import datadog.environment.SystemProperties; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.IOException; import java.lang.management.ManagementFactory; @@ -9,7 +11,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; +import java.util.Objects; import java.util.Set; +import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -75,14 +79,16 @@ private static String getTempDir() { if (OperatingSystem.isLinux()) { return "/tmp"; } else if (OperatingSystem.isWindows()) { - return Stream.of(System.getenv("TMP"), System.getenv("TEMP"), System.getenv("USERPROFILE")) - .filter(String::isEmpty) + return Stream.of("TMP", "TEMP", "USERPROFILE") + .map(EnvironmentVariables::get) + .filter(Objects::nonNull) + .filter(((Predicate) String::isEmpty).negate()) .findFirst() .orElse("C:\\Windows"); } else if (OperatingSystem.isMacOs()) { - return System.getenv("TMPDIR"); + return EnvironmentVariables.get("TMPDIR"); } else { - return System.getProperty("java.io.tmpdir"); + return SystemProperties.get("java.io.tmpdir"); } } else { try { @@ -93,7 +99,7 @@ private static String getTempDir() { .invoke(null); } catch (Throwable t) { // Fall back to constants based on J9 source code, may not have perfect coverage - String tmpDir = System.getProperty("java.io.tmpdir"); + String tmpDir = SystemProperties.get("java.io.tmpdir"); if (tmpDir != null && !tmpDir.isEmpty()) { return tmpDir; } else if (OperatingSystem.isWindows()) { @@ -114,7 +120,7 @@ private static Path getJavaProcessesDir() { } else { // Emulating the hotspot way to enumerate the JVM processes using the perfdata file // https://github.com/openjdk/jdk/blob/d7cb933b89839b692f5562aeeb92076cd25a99f6/src/hotspot/share/runtime/perfMemory.cpp#L244 - return Paths.get(getTempDir(), "hsperfdata_" + System.getProperty("user.name")); + return Paths.get(getTempDir(), "hsperfdata_" + SystemProperties.get("user.name")); } } diff --git a/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java b/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java index 8bc3069e8fe..1a1e41c1f91 100644 --- a/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java +++ b/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java @@ -1,6 +1,7 @@ package datadog.trace.util; import datadog.environment.JavaVirtualMachine; +import datadog.environment.SystemProperties; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.function.Supplier; import javax.annotation.Nullable; @@ -43,7 +44,7 @@ public static String getCurrentJvmPath() { } // JDK/JRE home, does not include "bin/java" portion - return System.getProperty("java.home"); + return SystemProperties.get("java.home"); } private ProcessUtils() {} diff --git a/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java b/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java index bf71f4971f6..0942a277dae 100644 --- a/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java +++ b/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java @@ -2,6 +2,8 @@ import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; +import datadog.environment.EnvironmentVariables; +import datadog.environment.SystemProperties; import datadog.trace.api.config.ProfilingConfig; import datadog.trace.bootstrap.config.provider.ConfigProvider; import java.io.IOException; @@ -304,9 +306,9 @@ private TempLocationManager() { // @VisibleForTesting static String getBaseTempDirName() { - String userName = System.getProperty("user.name"); + String userName = SystemProperties.get("user.name"); // unlikely, but fall-back to system env based user name - userName = userName == null ? System.getenv("USER") : userName; + userName = userName == null ? EnvironmentVariables.get("USER") : userName; // make sure we do not have any illegal characters in the user name userName = userName != null ? userName.replace('.', '_').replace('/', '_').replace(' ', '_') : null; diff --git a/telemetry/src/main/java/datadog/telemetry/HostInfo.java b/telemetry/src/main/java/datadog/telemetry/HostInfo.java index 4a51488addd..1d950ece8e2 100644 --- a/telemetry/src/main/java/datadog/telemetry/HostInfo.java +++ b/telemetry/src/main/java/datadog/telemetry/HostInfo.java @@ -1,6 +1,7 @@ package datadog.telemetry; import datadog.environment.OperatingSystem; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -40,7 +41,7 @@ public static String getOsName() { // os.name == Mac OS X, while uanme -s == Darwin. We'll hardcode it to Darwin. osName = "Darwin"; } else { - osName = System.getProperty("os.name"); + osName = SystemProperties.get("os.name"); } } return osName; @@ -60,7 +61,7 @@ public static String getKernelName() { public static String getKernelRelease() { if (kernelRelease == null) { // In Linux, os.version == uname -r - kernelRelease = System.getProperty("os.version"); + kernelRelease = SystemProperties.get("os.version"); } return kernelRelease; } @@ -78,7 +79,7 @@ public static String getKernelVersion() { } kernelVersion = version; } else { - kernelVersion = System.getProperty("os.version"); + kernelVersion = SystemProperties.get("os.version"); } } return kernelVersion; @@ -87,7 +88,7 @@ public static String getKernelVersion() { public static String getArchitecture() { if (architecture == null) { // In Linux, os.arch == uname -me - architecture = System.getProperty("os.arch"); + architecture = SystemProperties.get("os.arch"); } return architecture; } @@ -135,7 +136,7 @@ public static String getOsVersion() { return name + " " + version; } } - return System.getProperty("os.version"); + return SystemProperties.get("os.version"); } } } diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java b/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java index 0b4360b9f76..f903feb1aef 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java @@ -2,6 +2,7 @@ import datadog.common.container.ContainerInfo; import datadog.communication.ddagent.TracerVersion; +import datadog.environment.EnvironmentVariables; import datadog.telemetry.api.DistributionSeries; import datadog.telemetry.api.Integration; import datadog.telemetry.api.LogMessage; @@ -111,9 +112,9 @@ public void writeProducts() { } public void writeInstallSignature() { - String installId = System.getenv("DD_INSTRUMENTATION_INSTALL_ID"); - String installType = System.getenv("DD_INSTRUMENTATION_INSTALL_TYPE"); - String installTime = System.getenv("DD_INSTRUMENTATION_INSTALL_TIME"); + String installId = EnvironmentVariables.get("DD_INSTRUMENTATION_INSTALL_ID"); + String installType = EnvironmentVariables.get("DD_INSTRUMENTATION_INSTALL_TYPE"); + String installTime = EnvironmentVariables.get("DD_INSTRUMENTATION_INSTALL_TIME"); try { requestBody.writeInstallSignature(installId, installType, installTime); diff --git a/utils/container-utils/build.gradle.kts b/utils/container-utils/build.gradle.kts index 61877cbcfc9..2b7578a2785 100644 --- a/utils/container-utils/build.gradle.kts +++ b/utils/container-utils/build.gradle.kts @@ -5,6 +5,7 @@ plugins { apply(from = "$rootDir/gradle/java.gradle") dependencies { + implementation(project(":components:environment")) implementation(libs.slf4j) testImplementation(project(":utils:test-utils")) diff --git a/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java b/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java index 41c82b57e31..a068e6d49c2 100644 --- a/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java +++ b/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java @@ -1,5 +1,6 @@ package datadog.common.container; +import datadog.environment.EnvironmentVariables; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.File; @@ -12,7 +13,7 @@ public class ServerlessInfo { private final boolean hasExtension; private ServerlessInfo(final String extensionPath) { - this.functionName = System.getenv(AWS_FUNCTION_VARIABLE); + this.functionName = EnvironmentVariables.get(AWS_FUNCTION_VARIABLE); if (null == extensionPath) { this.hasExtension = false; } else { diff --git a/utils/socket-utils/src/main/java/datadog/common/socket/SocketUtils.java b/utils/socket-utils/src/main/java/datadog/common/socket/SocketUtils.java index d52a2dcb899..53602428b64 100644 --- a/utils/socket-utils/src/main/java/datadog/common/socket/SocketUtils.java +++ b/utils/socket-utils/src/main/java/datadog/common/socket/SocketUtils.java @@ -3,6 +3,7 @@ import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_AGENT_SOCKET_PATH; import datadog.environment.OperatingSystem; +import datadog.environment.SystemProperties; import datadog.trace.api.Config; import datadog.trace.api.config.TracerConfig; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -26,9 +27,9 @@ && new File(DEFAULT_TRACE_AGENT_SOCKET_PATH).exists()) { } else /* windows */ { if (unixDomainSocket != null) { log.warn( - "{} setting not supported on {}. Reverting to the default.", + "{} setting not supported on {}. Reverting to the default.", TracerConfig.AGENT_UNIX_DOMAIN_SOCKET, - System.getProperty("os.name")); + SystemProperties.get("os.name")); unixDomainSocket = null; } }