diff --git a/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java b/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java index bfd0bae6fe2..8eea13de224 100644 --- a/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java +++ b/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java @@ -5,8 +5,8 @@ import static datadog.trace.util.ProcessSupervisor.Health.NEVER_CHECKED; import static datadog.trace.util.ProcessSupervisor.Health.READY_TO_START; +import datadog.environment.OperatingSystem; import datadog.trace.api.Config; -import datadog.trace.api.Platform; import datadog.trace.util.ProcessSupervisor; import java.io.Closeable; import java.io.File; @@ -17,7 +17,7 @@ public class ExternalAgentLauncher implements Closeable { private static final Logger log = LoggerFactory.getLogger(ExternalAgentLauncher.class); private static final ProcessBuilder.Redirect DISCARD = - ProcessBuilder.Redirect.to(new File((Platform.isWindows() ? "NUL" : "/dev/null"))); + ProcessBuilder.Redirect.to(new File((OperatingSystem.isWindows() ? "NUL" : "/dev/null"))); private ProcessSupervisor traceProcessSupervisor; private ProcessSupervisor dogStatsDProcessSupervisor; diff --git a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDConnection.java b/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDConnection.java index 7f2dbd1525e..e75a8d98a91 100644 --- a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDConnection.java +++ b/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDConnection.java @@ -8,8 +8,8 @@ import com.timgroup.statsd.NoOpDirectStatsDClient; import com.timgroup.statsd.NonBlockingStatsDClientBuilder; import com.timgroup.statsd.StatsDClientErrorHandler; +import datadog.environment.OperatingSystem; import datadog.trace.api.Config; -import datadog.trace.api.Platform; import datadog.trace.relocate.api.IOLogger; import datadog.trace.util.AgentTaskScheduler; import datadog.trace.util.AgentThreadFactory; @@ -136,7 +136,7 @@ private void doConnect() { if (bufferSize != null) { clientBuilder.socketBufferSize(bufferSize); } - int packetSize = Platform.isMac() ? 2048 : 8192; + int packetSize = OperatingSystem.isMacOs() ? 2048 : 8192; if (bufferSize != null && bufferSize < packetSize) { packetSize = bufferSize; } @@ -185,7 +185,7 @@ private void discoverConnectionSettings() { } if (null == host) { - if (!Platform.isWindows() && new File(DEFAULT_DOGSTATSD_SOCKET_PATH).exists()) { + if (!OperatingSystem.isWindows() && new File(DEFAULT_DOGSTATSD_SOCKET_PATH).exists()) { log.info("Detected {}. Using it to send StatsD data.", DEFAULT_DOGSTATSD_SOCKET_PATH); host = DEFAULT_DOGSTATSD_SOCKET_PATH; port = 0; // tells dogstatsd client to treat host as a socket path 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 3ebe7f59da4..a68f07b848d 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 @@ -71,6 +71,7 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[ + "com.datadog.profiling.controller.openjdk.events.SmapEntryFactory$SmapParseErrorEvent:build_time," + "com.datadog.profiling.controller.TempLocationManager$SingletonHolder:run_time," + "com.datadog.profiling.ddprof.JavaProfilerLoader:run_time," + + "datadog.environment.JavaVirtualMachine:rerun," + "datadog.trace.agent.tooling.WeakMaps$Adapter:build_time," + "datadog.trace.api.Config:rerun," + "datadog.trace.api.Platform:rerun," diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java index 2c628c2c112..6e1984a87f4 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java @@ -1,8 +1,8 @@ package datadog.trace.common.writer; +import datadog.environment.OperatingSystem; import datadog.trace.api.DDSpanId; import datadog.trace.api.DDTraceId; -import datadog.trace.api.Platform; import datadog.trace.core.DDSpan; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.FileOutputStream; @@ -81,7 +81,7 @@ public TraceStructureWriter(String outputFile, boolean debugLog) { private static String[] parseArgs(String outputFile) { String[] args = ARGS_DELIMITER.split(outputFile); // Check Windows absolute paths (:) as column is used as arg delimiter - if (Platform.isWindows() + if (OperatingSystem.isWindows() && args.length > 1 && args[0].length() == 1 && (args[1].startsWith("\\") || args[1].startsWith("/"))) { diff --git a/internal-api/build.gradle b/internal-api/build.gradle index fbf1916a4af..5c3718cc1aa 100644 --- a/internal-api/build.gradle +++ b/internal-api/build.gradle @@ -229,7 +229,10 @@ excludedClassesBranchCoverage = [ 'datadog.trace.api.ProductActivationConfig', 'datadog.trace.api.ClassloaderConfigurationOverrides.Lazy', 'datadog.trace.util.stacktrace.HotSpotStackWalker', - 'datadog.trace.util.stacktrace.StackWalkerFactory' + 'datadog.trace.util.stacktrace.StackWalkerFactory', + // Tested using forked process + 'datadog.trace.api.env.CapturedEnvironment', + 'datadog.trace.api.env.CapturedEnvironment.ProcessInfo' ] excludedClassesInstructionCoverage = [ 'datadog.trace.bootstrap.config.provider.EnvironmentConfigSource', @@ -244,6 +247,7 @@ dependencies { api project(':dd-trace-api') api libs.slf4j api project(':components:context') + api project(':components:environment') api project(':components:yaml') api project(':components:cli') api project(":utils:time-utils") diff --git a/internal-api/internal-api-9/src/main/java/datadog/trace/util/stacktrace/JDK9StackWalker.java b/internal-api/internal-api-9/src/main/java/datadog/trace/util/stacktrace/JDK9StackWalker.java index 2cee250219d..afb02b97b7c 100644 --- a/internal-api/internal-api-9/src/main/java/datadog/trace/util/stacktrace/JDK9StackWalker.java +++ b/internal-api/internal-api-9/src/main/java/datadog/trace/util/stacktrace/JDK9StackWalker.java @@ -1,6 +1,6 @@ package datadog.trace.util.stacktrace; -import datadog.trace.api.Platform; +import datadog.environment.JavaVirtualMachine; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.function.Function; import java.util.stream.Stream; @@ -46,7 +46,7 @@ private static java.lang.StackWalker newStackWalker() { private static StackMapper findMapper() { try { - return Platform.isJ9() + return JavaVirtualMachine.isJ9() ? JDK9StackWalker::mapFrameForJ9 : java.lang.StackWalker.StackFrame::toStackTraceElement; } catch (final Throwable e) { 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 6534d8f870c..8f1c06837ce 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -1,5 +1,7 @@ package datadog.trace.api; +import static datadog.environment.JavaVirtualMachine.isJavaVersion; +import static datadog.environment.JavaVirtualMachine.isJavaVersionAtLeast; import static datadog.trace.api.ConfigDefaults.DEFAULT_ADD_SPAN_POINTERS; import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_HOST; import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_TIMEOUT; @@ -609,6 +611,8 @@ import static datadog.trace.util.CollectionUtils.tryMakeImmutableSet; import static datadog.trace.util.Strings.propertyNameToEnvironmentVariableName; +import datadog.environment.JavaVirtualMachine; +import datadog.environment.OperatingSystem; import datadog.trace.api.civisibility.CiVisibilityWellKnownTags; import datadog.trace.api.config.GeneralConfig; import datadog.trace.api.config.ProfilingConfig; @@ -3299,41 +3303,41 @@ public boolean isDatadogProfilerEnabled() { public static boolean isDatadogProfilerEnablementOverridden() { // old non-LTS versions without important backports // also, we have no windows binaries - return Platform.isWindows() - || Platform.isJavaVersion(18) - || Platform.isJavaVersion(16) - || Platform.isJavaVersion(15) - || Platform.isJavaVersion(14) - || Platform.isJavaVersion(13) - || Platform.isJavaVersion(12) - || Platform.isJavaVersion(10) - || Platform.isJavaVersion(9); + return OperatingSystem.isWindows() + || isJavaVersion(18) + || isJavaVersion(16) + || isJavaVersion(15) + || isJavaVersion(14) + || isJavaVersion(13) + || isJavaVersion(12) + || isJavaVersion(10) + || isJavaVersion(9); } 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 (!Platform.isJ9() && Platform.isJavaVersion(8)) { + if (!JavaVirtualMachine.isJ9() && isJavaVersion(8)) { String arch = System.getProperty("os.arch"); if ("aarch64".equalsIgnoreCase(arch) || "arm64".equalsIgnoreCase(arch)) { return false; } } - if (Platform.isGraalVM()) { + if (JavaVirtualMachine.isGraalVM()) { // let's be conservative about GraalVM and require opt-in from the users return false; } boolean result = false; - if (Platform.isJ9()) { + if (JavaVirtualMachine.isJ9()) { // OpenJ9 will activate only JVMTI GetAllStackTraces based profiling which is safe result = true; } else { // JDK 18 is missing ASGCT fixes, so we can't use it - if (!Platform.isJavaVersion(18)) { + if (!isJavaVersion(18)) { result = - Platform.isJavaVersionAtLeast(17, 0, 5) - || (Platform.isJavaVersion(11) && Platform.isJavaVersionAtLeast(11, 0, 17)) - || (Platform.isJavaVersion(8) && Platform.isJavaVersionAtLeast(8, 0, 352)); + isJavaVersionAtLeast(17, 0, 5) + || (isJavaVersion(11) && isJavaVersionAtLeast(11, 0, 17)) + || (isJavaVersion(8) && isJavaVersionAtLeast(8, 0, 352)); } } return result; 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 4b470a2d067..47b2daacc9e 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,10 +1,9 @@ package datadog.trace.api.env; +import datadog.environment.JavaVirtualMachine; import datadog.trace.api.config.GeneralConfig; -import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.File; import java.util.HashMap; -import java.util.Locale; import java.util.Map; /** @@ -18,28 +17,10 @@ public static class ProcessInfo { public String mainClass; public File jarFile; - @SuppressForbidden public ProcessInfo() { - // Besides "sun.java.command" property is not an standard, all main JDKs has set this - // property. - // Tested on: - // - OracleJDK, OpenJDK, AdoptOpenJDK, IBM JDK, Azul Zulu JDK, Amazon Coretto JDK - final String command = System.getProperty("sun.java.command"); - if (command == null || command.isEmpty()) { - return; - } - - final String[] split = command.trim().split(" "); - if (split.length == 0 || split[0].isEmpty()) { - return; - } - - final String candidate = split[0]; - if (candidate.toLowerCase(Locale.ROOT).endsWith(".jar")) { - jarFile = new File(candidate); - } else { - mainClass = candidate; - } + String jarName = JavaVirtualMachine.getJarFile(); + jarFile = jarName == null ? null : new File(jarName); + mainClass = JavaVirtualMachine.getMainClass(); } /** diff --git a/internal-api/src/main/java/datadog/trace/api/iast/IastEnabledChecks.java b/internal-api/src/main/java/datadog/trace/api/iast/IastEnabledChecks.java index c955769841d..741950b0c40 100644 --- a/internal-api/src/main/java/datadog/trace/api/iast/IastEnabledChecks.java +++ b/internal-api/src/main/java/datadog/trace/api/iast/IastEnabledChecks.java @@ -1,7 +1,7 @@ package datadog.trace.api.iast; +import datadog.environment.JavaVirtualMachine; import datadog.trace.api.Config; -import datadog.trace.api.Platform; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,7 +13,7 @@ private IastEnabledChecks() {} public static boolean isMajorJavaVersionAtLeast(final String version) { try { - return Platform.isJavaVersionAtLeast(Integer.parseInt(version)); + return JavaVirtualMachine.isJavaVersionAtLeast(Integer.parseInt(version)); } catch (final Exception e) { LOGGER.error( "Error checking major java version {}, expect some call sites to be disabled", diff --git a/internal-api/src/main/java/datadog/trace/util/CollectionUtils.java b/internal-api/src/main/java/datadog/trace/util/CollectionUtils.java index 9a2267b93df..00878c3f77e 100644 --- a/internal-api/src/main/java/datadog/trace/util/CollectionUtils.java +++ b/internal-api/src/main/java/datadog/trace/util/CollectionUtils.java @@ -1,6 +1,6 @@ package datadog.trace.util; -import static datadog.trace.api.Platform.isJavaVersionAtLeast; +import static datadog.environment.JavaVirtualMachine.isJavaVersionAtLeast; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; 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 6ba90686f47..0fafaf8df1c 100644 --- a/internal-api/src/main/java/datadog/trace/util/PidHelper.java +++ b/internal-api/src/main/java/datadog/trace/util/PidHelper.java @@ -1,6 +1,7 @@ package datadog.trace.util; -import datadog.trace.api.Platform; +import datadog.environment.JavaVirtualMachine; +import datadog.environment.OperatingSystem; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.IOException; import java.lang.management.ManagementFactory; @@ -36,7 +37,7 @@ public static long getPidAsLong() { @SuppressWarnings("unchecked") private static String findPid() { String pid = ""; - if (Platform.isJavaVersionAtLeast(9)) { + if (JavaVirtualMachine.isJavaVersionAtLeast(9)) { try { pid = Strings.trim( @@ -65,20 +66,20 @@ private static String findPid() { } private static String getTempDir() { - if (!Platform.isJ9()) { + if (!JavaVirtualMachine.isJ9()) { // 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 (Platform.isLinux()) { + if (OperatingSystem.isLinux()) { return "/tmp"; - } else if (Platform.isWindows()) { + } else if (OperatingSystem.isWindows()) { return Stream.of(System.getenv("TMP"), System.getenv("TEMP"), System.getenv("USERPROFILE")) .filter(String::isEmpty) .findFirst() .orElse("C:\\Windows"); - } else if (Platform.isMac()) { + } else if (OperatingSystem.isMacOs()) { return System.getenv("TMPDIR"); } else { return System.getProperty("java.io.tmpdir"); @@ -95,7 +96,7 @@ private static String getTempDir() { String tmpDir = System.getProperty("java.io.tmpdir"); if (tmpDir != null && !tmpDir.isEmpty()) { return tmpDir; - } else if (Platform.isWindows()) { + } else if (OperatingSystem.isWindows()) { return "C:\\Documents"; } else { return "/tmp"; @@ -105,7 +106,7 @@ private static String getTempDir() { } private static Path getJavaProcessesDir() { - if (Platform.isJ9()) { + if (JavaVirtualMachine.isJ9()) { // J9 uses a different temporary directory AND subdirectory for storing jps / attach-related // info // https://github.com/eclipse-openj9/openj9/blob/196082df056a990756a5571bfac29585fbbfbb42/jcl/src/java.base/share/classes/openj9/internal/tools/attach/target/CommonDirectory.java#L94 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 9f4cdf6c0d6..8bc3069e8fe 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,6 @@ package datadog.trace.util; -import datadog.trace.api.Platform; +import datadog.environment.JavaVirtualMachine; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.function.Supplier; import javax.annotation.Nullable; @@ -29,7 +29,7 @@ public abstract class ProcessUtils { @Nullable @SuppressForbidden public static String getCurrentJvmPath() { - if (Platform.isJavaVersionAtLeast(9)) { + if (JavaVirtualMachine.isJavaVersionAtLeast(9)) { try { Supplier jdk9Supplier = (Supplier) diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java index b3b92ef3af9..4eac781efb9 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java @@ -1,6 +1,6 @@ package datadog.trace.util.stacktrace; -import datadog.trace.api.Platform; +import datadog.environment.JavaVirtualMachine; import java.util.function.Function; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -19,7 +19,7 @@ public class HotSpotStackWalker extends AbstractStackWalker { @Override public boolean isEnabled() { try { - if (Platform.isJavaVersion(8) && access != null) { + if (JavaVirtualMachine.isJavaVersion(8) && access != null) { access.getStackTraceElement(new Throwable(), 0); return true; } diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java index bfe87d11205..bd9357260d9 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java @@ -1,6 +1,6 @@ package datadog.trace.util.stacktrace; -import datadog.trace.api.Platform; +import datadog.environment.JavaVirtualMachine; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.Objects; import java.util.function.Supplier; @@ -31,7 +31,7 @@ private static Supplier defaultStackWalker() { private static Supplier hotspot() { return () -> { - if (!Platform.isJavaVersion(8)) { + if (!JavaVirtualMachine.isJavaVersion(8)) { return null; } return new HotSpotStackWalker(); @@ -40,7 +40,7 @@ private static Supplier hotspot() { private static Supplier jdk9() { return () -> { - if (!Platform.isJavaVersionAtLeast(9)) { + if (!JavaVirtualMachine.isJavaVersionAtLeast(9)) { return null; } try { diff --git a/internal-api/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy index 7ca38051d24..ca637908b30 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy @@ -3,113 +3,149 @@ package datadog.trace.api.env import datadog.trace.api.config.GeneralConfig import datadog.trace.test.util.DDSpecification +import static java.io.File.separator + class CapturedEnvironmentTest extends DDSpecification { def "non autodetected service.name with null command"() { - setup: - System.clearProperty("sun.java.command") - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties('null') then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == null + serviceName == null } def "non autodetected service.name with empty command"() { - setup: - System.setProperty("sun.java.command", "") - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties('') then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == null + serviceName == null } def "non autodetected service.name with all blanks command"() { - setup: - System.setProperty("sun.java.command", " ") - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties(' ') then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == null + serviceName == null } def "set service.name by sysprop 'sun.java.command' with class"() { - setup: - System.setProperty("sun.java.command", "org.example.App -Dfoo=bar arg2 arg3") - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties('org.example.App -Dfoo=bar arg2 arg3') then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == "org.example.App" + serviceName == 'org.example.App' } def "set service.name by sysprop 'sun.java.command' with jar"() { - setup: - System.setProperty("sun.java.command", "foo/bar/example.jar -Dfoo=bar arg2 arg3") - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties('foo/bar/example.jar -Dfoo=bar arg2 arg3') then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == "example" + serviceName == 'example' } def "set service.name with real 'sun.java.command' property"() { when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties(null) then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) != null + serviceName == ServiceNamePrinter.class.name } def "use Azure site name in Azure"() { - setup: - System.setProperty("sun.java.command", "foo/bar/example.jar -Dfoo=bar arg2 arg3") - injectEnvConfig("DD_AZURE_APP_SERVICES", "1", false) - injectEnvConfig("WEBSITE_SITE_NAME", "siteService", false) - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties('foo/bar/example.jar -Dfoo=bar arg2 arg3', [ + 'DD_AZURE_APP_SERVICES': '1', + 'WEBSITE_SITE_NAME': 'siteService' + ]) then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == "siteService" + serviceName == 'siteService' } def "dont use site name when not in azure"() { - setup: - System.setProperty("sun.java.command", "foo/bar/example.jar -Dfoo=bar arg2 arg3") - injectEnvConfig("WEBSITE_SITE_NAME", "siteService", false) - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties('foo/bar/example.jar -Dfoo=bar arg2 arg3', [ + 'WEBSITE_SITE_NAME': 'siteService' + ]) then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == "example" + serviceName == 'example' } def "dont use Azure site name when null"() { - setup: - System.setProperty("sun.java.command", "foo/bar/example.jar -Dfoo=bar arg2 arg3") - injectEnvConfig("DD_AZURE_APP_SERVICES", "true", false) - when: - def capturedEnv = new CapturedEnvironment() + def serviceName = forkAndRunProperties('foo/bar/example.jar -Dfoo=bar arg2 arg3', [ + 'DD_AZURE_APP_SERVICES': 'true', + ]) then: - def props = capturedEnv.properties - props.get(GeneralConfig.SERVICE_NAME) == "example" + serviceName == 'example' + } + + private static String forkAndRunProperties(String arg, Map envVars = [:]) + throws IOException, InterruptedException { + // Build the command to run a new Java process + List command = [] + command += System.getProperty("java.home") + separator + "bin" + separator + "java" + command += '-cp' + command += System.getProperty("java.class.path") + command += ServiceNamePrinter.class.getName() + if (arg != null) { + command += arg + } + // Start the process + ProcessBuilder processBuilder = new ProcessBuilder(command) + processBuilder.environment().putAll(envVars) + Process process = processBuilder.start() + // Read and parse output and error streams + String serviceName = '' + try (BufferedReader reader = + new BufferedReader(new InputStreamReader(process.getInputStream()))) { + String line + while ((line = reader.readLine()) != null) { + if (serviceName != '') { + serviceName += '\n' + } + serviceName += line + } + } + if (serviceName == 'null') { + serviceName = null + } + String error = '' + try (BufferedReader reader = + new BufferedReader(new InputStreamReader(process.getErrorStream()))) { + String line + while ((line = reader.readLine()) != null) { + error += line + '\n' + } + } + // Wait for the process to complete + int exitCode = process.waitFor() + // Dumping state on error + if (exitCode != 0) { + println("Error printing service name. Exit code $exitCode with service name: '$serviceName' and error:\n$error") + throw new IllegalStateException('Process should exit without error') + } + return serviceName + } + + static class ServiceNamePrinter { + static void main(String[] args) { + if (args.length > 0) { + def sunJavaCommand = args[0] + if (sunJavaCommand == 'null') { + System.clearProperty('sun.java.command') + } else { + System.setProperty('sun.java.command', sunJavaCommand) + } + } + def capturedEnv = new CapturedEnvironment() + def props = capturedEnv.properties + println props.get(GeneralConfig.SERVICE_NAME) + } } } diff --git a/internal-api/src/test/groovy/datadog/trace/api/iast/IastEnabledChecksTests.groovy b/internal-api/src/test/groovy/datadog/trace/api/iast/IastEnabledChecksTests.groovy index aab4b750459..8831386136c 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/iast/IastEnabledChecksTests.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/iast/IastEnabledChecksTests.groovy @@ -1,6 +1,6 @@ package datadog.trace.api.iast -import datadog.trace.api.Platform +import datadog.environment.JavaVirtualMachine import datadog.trace.api.config.IastConfig import datadog.trace.test.util.DDSpecification @@ -15,9 +15,9 @@ class IastEnabledChecksTests extends DDSpecification { where: majorJavaVersion | expected - '8' | Platform.isJavaVersionAtLeast(majorJavaVersion as int) - '9' | Platform.isJavaVersionAtLeast(majorJavaVersion as int) - '17' | Platform.isJavaVersionAtLeast(majorJavaVersion as int) + '8' | JavaVirtualMachine.isJavaVersionAtLeast(majorJavaVersion as int) + '9' | JavaVirtualMachine.isJavaVersionAtLeast(majorJavaVersion as int) + '17' | JavaVirtualMachine.isJavaVersionAtLeast(majorJavaVersion as int) 'abcd' | false } diff --git a/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/URIUtilsTest.groovy b/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/URIUtilsTest.groovy index 73b5e5cfad3..bdba202a22c 100644 --- a/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/URIUtilsTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/URIUtilsTest.groovy @@ -2,7 +2,7 @@ package datadog.trace.bootstrap.instrumentation.api import datadog.trace.test.util.DDSpecification -import static datadog.trace.api.Platform.isJavaVersion +import static datadog.environment.JavaVirtualMachine.isJavaVersion class URIUtilsTest extends DDSpecification { static boolean java7 = isJavaVersion(7) diff --git a/internal-api/src/test/groovy/datadog/trace/util/CollectionUtilsTest.groovy b/internal-api/src/test/groovy/datadog/trace/util/CollectionUtilsTest.groovy index d78041feeb0..f279f8438bd 100644 --- a/internal-api/src/test/groovy/datadog/trace/util/CollectionUtilsTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/util/CollectionUtilsTest.groovy @@ -3,7 +3,7 @@ package datadog.trace.util import datadog.trace.test.util.DDSpecification -import static datadog.trace.api.Platform.isJavaVersionAtLeast +import static datadog.environment.JavaVirtualMachine.isJavaVersionAtLeast import static datadog.trace.util.CollectionUtils.tryMakeImmutableList import static datadog.trace.util.CollectionUtils.tryMakeImmutableMap import static datadog.trace.util.CollectionUtils.tryMakeImmutableSet diff --git a/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java b/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java index 57316432204..3ca823aa2d3 100644 --- a/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java +++ b/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java @@ -1,6 +1,6 @@ package datadog.trace.util.stacktrace; -import datadog.trace.api.Platform; +import datadog.environment.JavaVirtualMachine; import datadog.trace.test.util.AnyStackRunner; import java.util.List; import java.util.concurrent.atomic.AtomicReference; @@ -21,7 +21,7 @@ private StackWalkerTestUtil() {} public static boolean isRunningJDK8WithHotSpot() { try { JavaLangAccess access = SharedSecrets.getJavaLangAccess(); - return Platform.isJavaVersion(8) && access != null; + return JavaVirtualMachine.isJavaVersion(8) && access != null; } catch (Throwable throwable) { return false; } diff --git a/telemetry/src/main/java/datadog/telemetry/HostInfo.java b/telemetry/src/main/java/datadog/telemetry/HostInfo.java index 5f4986d6e18..4a51488addd 100644 --- a/telemetry/src/main/java/datadog/telemetry/HostInfo.java +++ b/telemetry/src/main/java/datadog/telemetry/HostInfo.java @@ -1,7 +1,7 @@ package datadog.telemetry; +import datadog.environment.OperatingSystem; import datadog.trace.api.Config; -import datadog.trace.api.Platform; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.FileSystems; @@ -36,7 +36,7 @@ public static String getHostname() { public static String getOsName() { if (osName == null) { - if (Platform.isMac()) { + if (OperatingSystem.isMacOs()) { // os.name == Mac OS X, while uanme -s == Darwin. We'll hardcode it to Darwin. osName = "Darwin"; } else { diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java b/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java index a8538f6b04a..9d9db047d24 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java @@ -2,6 +2,7 @@ import com.squareup.moshi.JsonWriter; import datadog.communication.ddagent.TracerVersion; +import datadog.environment.JavaVirtualMachine; import datadog.telemetry.api.DistributionSeries; import datadog.telemetry.api.Integration; import datadog.telemetry.api.LogMessage; @@ -11,7 +12,6 @@ import datadog.trace.api.Config; import datadog.trace.api.ConfigSetting; import datadog.trace.api.DDTags; -import datadog.trace.api.Platform; import datadog.trace.api.ProcessTags; import datadog.trace.api.telemetry.Endpoint; import datadog.trace.api.telemetry.ProductChange.ProductType; @@ -44,10 +44,10 @@ public SerializationException(String requestPartName, Throwable cause) { private static class CommonData { final Config config = Config.get(); final String env = config.getEnv(); - final String langVersion = Platform.getLangVersion(); - final String runtimeName = Platform.getRuntimeVendor(); - final String runtimePatches = Platform.getRuntimePatches(); - final String runtimeVersion = Platform.getRuntimeVersion(); + final String langVersion = JavaVirtualMachine.getLangVersion(); + final String runtimeName = JavaVirtualMachine.getRuntimeVendor(); + final String runtimePatches = JavaVirtualMachine.getRuntimePatches(); + final String runtimeVersion = JavaVirtualMachine.getRuntimeVersion(); final String serviceName = config.getServiceName(); final String serviceVersion = config.getVersion(); final String runtimeId = config.getRuntimeId(); diff --git a/telemetry/src/test/groovy/datadog/telemetry/HostInfoTest.groovy b/telemetry/src/test/groovy/datadog/telemetry/HostInfoTest.groovy index e6ea908694b..73e59cfbbd9 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/HostInfoTest.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/HostInfoTest.groovy @@ -1,6 +1,6 @@ package datadog.telemetry -import datadog.trace.api.Platform +import datadog.environment.OperatingSystem import org.junit.Assume import spock.lang.Specification @@ -38,7 +38,7 @@ class HostInfoTest extends Specification { HostInfo.getHostname() == 'uname -n'.execute().text.trim() HostInfo.getOsName() == 'uname -s'.execute().text.trim() HostInfo.getKernelName() == 'uname -s'.execute().text.trim() - if (Platform.isMac()) { + if (OperatingSystem.isMacOs()) { // uname -r will return X.Y.Z version, while JVM will report just X.Y 'uname -r'.execute().text.trim().startsWith(HostInfo.getKernelRelease()) 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 db95bbf649b..d52a2dcb899 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 @@ -2,8 +2,8 @@ import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_AGENT_SOCKET_PATH; +import datadog.environment.OperatingSystem; import datadog.trace.api.Config; -import datadog.trace.api.Platform; import datadog.trace.api.config.TracerConfig; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.File; @@ -16,7 +16,7 @@ public final class SocketUtils { @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME") public static String discoverApmSocket(final Config config) { String unixDomainSocket = config.getAgentUnixDomainSocket(); - if (!Platform.isWindows()) { + if (!OperatingSystem.isWindows()) { if (unixDomainSocket == null && Config.get().isAgentConfiguredUsingDefault() && new File(DEFAULT_TRACE_AGENT_SOCKET_PATH).exists()) { diff --git a/utils/socket-utils/src/main/java/datadog/common/socket/UnixDomainSocketFactory.java b/utils/socket-utils/src/main/java/datadog/common/socket/UnixDomainSocketFactory.java index 8e141b939f2..c41ae56abf4 100644 --- a/utils/socket-utils/src/main/java/datadog/common/socket/UnixDomainSocketFactory.java +++ b/utils/socket-utils/src/main/java/datadog/common/socket/UnixDomainSocketFactory.java @@ -2,8 +2,8 @@ import static java.util.concurrent.TimeUnit.MINUTES; +import datadog.environment.JavaVirtualMachine; import datadog.trace.api.Config; -import datadog.trace.api.Platform; import datadog.trace.relocate.api.RatelimitedLogger; import java.io.File; import java.io.IOException; @@ -25,7 +25,7 @@ public final class UnixDomainSocketFactory extends SocketFactory { private static final Logger log = LoggerFactory.getLogger(UnixDomainSocketFactory.class); - private static final boolean JDK_SUPPORTS_UDS = Platform.isJavaVersionAtLeast(16); + private static final boolean JDK_SUPPORTS_UDS = JavaVirtualMachine.isJavaVersionAtLeast(16); private final RatelimitedLogger rlLog = new RatelimitedLogger(log, 5, MINUTES);