diff --git a/components/cli/build.gradle.kts b/components/cli/build.gradle.kts deleted file mode 100644 index b8314ee7f33..00000000000 --- a/components/cli/build.gradle.kts +++ /dev/null @@ -1 +0,0 @@ -apply(from = "$rootDir/gradle/java.gradle") diff --git a/components/cli/gradle.lockfile b/components/cli/gradle.lockfile deleted file mode 100644 index 51f3d8eac2f..00000000000 --- a/components/cli/gradle.lockfile +++ /dev/null @@ -1,118 +0,0 @@ -# This is a Gradle generated file for dependency locking. -# Manual edits can break the build and are not advised. -# This file is expected to be part of source control. -ch.qos.logback:logback-classic:1.2.3=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -ch.qos.logback:logback-core:1.2.3=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -com.beust:jcommander:1.78=jmhRuntimeClasspath,testRuntimeClasspath -com.github.javaparser:javaparser-core:3.25.1=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -com.github.spotbugs:spotbugs-annotations:4.2.0=compileClasspath,jmhCompileClasspath,jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -com.github.spotbugs:spotbugs-annotations:4.7.3=spotbugs -com.github.spotbugs:spotbugs:4.7.3=spotbugs -com.google.code.findbugs:jsr305:3.0.2=compileClasspath,jmhCompileClasspath,jmhRuntimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath -com.google.code.gson:gson:2.9.1=spotbugs -com.thoughtworks.qdox:qdox:1.12.1=jmhRuntimeClasspath,testRuntimeClasspath -commons-codec:commons-codec:1.15=spotbugs -de.thetaphi:forbiddenapis:3.8=compileClasspath,jmhCompileClasspath -info.picocli:picocli:4.6.3=jmhRuntimeClasspath,testRuntimeClasspath -jaxen:jaxen:1.2.0=spotbugs -jline:jline:2.14.6=jmhRuntimeClasspath,testRuntimeClasspath -junit:junit:4.13.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -net.jcip:jcip-annotations:1.0=compileClasspath,jmhCompileClasspath,jmhRuntimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath -net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhRuntimeClasspath -net.sf.saxon:Saxon-HE:11.4=spotbugs -org.apache.ant:ant-antlr:1.10.12=jmhRuntimeClasspath,testRuntimeClasspath -org.apache.ant:ant-antlr:1.9.15=codenarc -org.apache.ant:ant-junit:1.10.12=jmhRuntimeClasspath,testRuntimeClasspath -org.apache.ant:ant-junit:1.9.15=codenarc -org.apache.ant:ant-launcher:1.10.12=jmhRuntimeClasspath,testRuntimeClasspath -org.apache.ant:ant:1.10.12=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.apache.bcel:bcel:6.5.0=spotbugs -org.apache.commons:commons-lang3:3.12.0=pitest,spotbugs -org.apache.commons:commons-math3:3.2=jmh,jmhCompileClasspath,jmhRuntimeClasspath -org.apache.commons:commons-text:1.10.0=pitest,spotbugs -org.apache.httpcomponents.client5:httpclient5:5.1.3=spotbugs -org.apache.httpcomponents.core5:httpcore5-h2:5.1.3=spotbugs -org.apache.httpcomponents.core5:httpcore5:5.1.3=spotbugs -org.apache.logging.log4j:log4j-api:2.19.0=spotbugs -org.apache.logging.log4j:log4j-core:2.19.0=spotbugs -org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath -org.codehaus.groovy:groovy-all:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-ant:2.5.14=codenarc -org.codehaus.groovy:groovy-ant:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-astbuilder:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-cli-picocli:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-console:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-datetime:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-docgenerator:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-groovydoc:2.5.14=codenarc -org.codehaus.groovy:groovy-groovydoc:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-groovysh:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-jmx:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-json:2.5.14=codenarc -org.codehaus.groovy:groovy-json:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-jsr223:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-macro:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-nio:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-servlet:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-sql:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-swing:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-templates:2.5.14=codenarc -org.codehaus.groovy:groovy-templates:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-test-junit5:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-test:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-testng:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy-xml:2.5.14=codenarc -org.codehaus.groovy:groovy-xml:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codehaus.groovy:groovy:2.5.14=codenarc -org.codehaus.groovy:groovy:3.0.17=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.codenarc:CodeNarc:2.2.0=codenarc -org.dom4j:dom4j:2.1.3=spotbugs -org.gmetrics:GMetrics:1.1=codenarc -org.hamcrest:hamcrest-core:1.3=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.hamcrest:hamcrest:2.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jacoco:org.jacoco.agent:0.8.5=jacocoAgent,jacocoAnt -org.jacoco:org.jacoco.ant:0.8.5=jacocoAnt -org.jacoco:org.jacoco.core:0.8.5=jacocoAnt -org.jacoco:org.jacoco.report:0.8.5=jacocoAnt -org.junit.jupiter:junit-jupiter-api:5.9.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-engine:5.9.2=jmhRuntimeClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-params:5.9.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter:5.9.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-commons:1.9.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-engine:1.9.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-launcher:1.9.2=jmhRuntimeClasspath,testRuntimeClasspath -org.junit:junit-bom:5.9.1=spotbugs -org.junit:junit-bom:5.9.2=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.objenesis:objenesis:3.3=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.openjdk.jmh:jmh-core:1.36=jmh,jmhCompileClasspath,jmhRuntimeClasspath -org.openjdk.jmh:jmh-generator-asm:1.36=jmh,jmhCompileClasspath,jmhRuntimeClasspath -org.openjdk.jmh:jmh-generator-bytecode:1.36=jmh,jmhCompileClasspath,jmhRuntimeClasspath -org.openjdk.jmh:jmh-generator-reflection:1.36=jmh,jmhCompileClasspath,jmhRuntimeClasspath -org.opentest4j:opentest4j:1.2.0=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.ow2.asm:asm-analysis:7.2=jacocoAnt -org.ow2.asm:asm-analysis:9.4=spotbugs -org.ow2.asm:asm-commons:7.2=jacocoAnt -org.ow2.asm:asm-commons:9.4=spotbugs -org.ow2.asm:asm-tree:7.2=jacocoAnt -org.ow2.asm:asm-tree:9.4=spotbugs -org.ow2.asm:asm-util:9.4=spotbugs -org.ow2.asm:asm:7.2=jacocoAnt -org.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhRuntimeClasspath -org.ow2.asm:asm:9.4=spotbugs -org.pitest:pitest-command-line:1.9.11=pitest -org.pitest:pitest-entry:1.9.11=pitest -org.pitest:pitest:1.9.11=pitest -org.slf4j:jcl-over-slf4j:1.7.30=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.slf4j:jul-to-slf4j:1.7.30=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.slf4j:log4j-over-slf4j:1.7.30=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.slf4j:slf4j-api:1.7.30=testCompileClasspath -org.slf4j:slf4j-api:1.7.32=jmhRuntimeClasspath,testRuntimeClasspath -org.slf4j:slf4j-api:2.0.0=spotbugs,spotbugsSlf4j -org.slf4j:slf4j-simple:2.0.0=spotbugsSlf4j -org.spockframework:spock-core:2.3-groovy-3.0=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.spockframework:spock-junit4:2.3-groovy-3.0=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.testng:testng:7.5=jmhRuntimeClasspath,testRuntimeClasspath -org.webjars:jquery:3.5.1=jmhRuntimeClasspath,testRuntimeClasspath -org.xmlresolver:xmlresolver:4.4.3=spotbugs -xml-apis:xml-apis:1.4.01=spotbugs -empty=annotationProcessor,jmhAnnotationProcessor,runtimeClasspath,spotbugsPlugins,testAnnotationProcessor diff --git a/components/cli/src/main/java/datadog/cli/CLIHelper.java b/components/cli/src/main/java/datadog/cli/CLIHelper.java deleted file mode 100644 index 0f37953a92f..00000000000 --- a/components/cli/src/main/java/datadog/cli/CLIHelper.java +++ /dev/null @@ -1,88 +0,0 @@ -package datadog.cli; - -import de.thetaphi.forbiddenapis.SuppressForbidden; -import java.io.BufferedReader; -import java.lang.management.ManagementFactory; -import java.lang.reflect.Field; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Locale; - -public final class CLIHelper { - private static final List VM_ARGS = findVmArgs(); - - public static List getVmArgs() { - return VM_ARGS; - } - - @SuppressForbidden - private static List findVmArgs() { - // Try ProcFS on Linux - try { - if (isLinux()) { - Path cmdlinePath = Paths.get("/proc/self/cmdline"); - if (Files.exists(cmdlinePath)) { - try (BufferedReader in = Files.newBufferedReader(cmdlinePath)) { - return Arrays.asList(in.readLine().split("\0")); - } - } - } - } catch (Throwable ignored) { - // Ignored exception - } - - // Try Oracle-based - // IBM Semeru Runtime 1.8.0_345-b01 will throw UnsatisfiedLinkError here. - try { - final Class managementFactoryHelperClass = - Class.forName("sun.management.ManagementFactoryHelper"); - - final Class vmManagementClass = Class.forName("sun.management.VMManagement"); - - Object vmManagement; - - try { - vmManagement = - managementFactoryHelperClass.getDeclaredMethod("getVMManagement").invoke(null); - } catch (final NoSuchMethodException e) { - // Older vm before getVMManagement() existed - final Field field = managementFactoryHelperClass.getDeclaredField("jvm"); - field.setAccessible(true); - vmManagement = field.get(null); - field.setAccessible(false); - } - - //noinspection unchecked - return (List) vmManagementClass.getMethod("getVmArguments").invoke(vmManagement); - } catch (final ReflectiveOperationException | UnsatisfiedLinkError ignored) { - // Ignored exception - } - - // Try IBM-based. - try { - final Class VMClass = Class.forName("com.ibm.oti.vm.VM"); - final String[] argArray = (String[]) VMClass.getMethod("getVMArgs").invoke(null); - return Arrays.asList(argArray); - } catch (final ReflectiveOperationException ignored) { - // Ignored exception - } - - // Fallback to default - try { - return ManagementFactory.getRuntimeMXBean().getInputArguments(); - } catch (final Throwable t) { - // Throws InvocationTargetException on modularized applications - // with non-opened java.management module - System.err.println("WARNING: Unable to get VM args using managed beans"); - } - return Collections.emptyList(); - } - - private static boolean isLinux() { - return System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("linux"); - } -} diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Constants.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Constants.java index 01c2c66ef9a..8f4ba377161 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Constants.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Constants.java @@ -19,7 +19,6 @@ public final class Constants { "datadog.environment", "datadog.json", "datadog.yaml", - "datadog.cli", "datadog.appsec.api", "datadog.trace.api", "datadog.trace.bootstrap", diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/SpockRunner.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/SpockRunner.java index 22d038b8e15..80160b59e9f 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/SpockRunner.java +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/SpockRunner.java @@ -42,7 +42,6 @@ public class SpockRunner extends JUnitPlatform { "datadog.environment", "datadog.json", "datadog.yaml", - "datadog.cli", "datadog.appsec.api", "datadog.trace.api", "datadog.trace.bootstrap", diff --git a/internal-api/build.gradle b/internal-api/build.gradle index 5c3718cc1aa..f0282bad489 100644 --- a/internal-api/build.gradle +++ b/internal-api/build.gradle @@ -249,7 +249,6 @@ dependencies { api project(':components:context') api project(':components:environment') api project(':components:yaml') - api project(':components:cli') api project(":utils:time-utils") // has to be loaded by system classloader: 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 8d01b60b861..36dd9921ac5 100644 --- a/internal-api/src/main/java/datadog/trace/api/Platform.java +++ b/internal-api/src/main/java/datadog/trace/api/Platform.java @@ -1,16 +1,9 @@ package datadog.trace.api; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import static datadog.environment.JavaVirtualMachine.isJ9; +import static datadog.environment.JavaVirtualMachine.isJavaVersion; +import static datadog.environment.JavaVirtualMachine.isJavaVersionAtLeast; +import static datadog.environment.JavaVirtualMachine.isOracleJDK8; /** * This class is used early on during premain; it must not touch features like JMX or JUL in case @@ -23,9 +16,6 @@ private static class Captured { public static final boolean isNativeImage = checkForNativeImageBuilder(); } - private static final Version JAVA_VERSION = parseJavaVersion(System.getProperty("java.version")); - private static final JvmRuntime RUNTIME = new JvmRuntime(); - private static final boolean HAS_JFR = checkForJfr(); private static final boolean IS_NATIVE_IMAGE_BUILDER = checkForNativeImageBuilder(); private static final boolean IS_NATIVE_IMAGE = Captured.isNativeImage; @@ -66,343 +56,4 @@ private static boolean checkForNativeImageBuilder() { return false; } } - - /* The method splits java version string by digits. Delimiters are: dot, underscore and plus */ - private static List splitDigits(String str) { - List results = new ArrayList<>(); - - int len = str.length(); - - int value = 0; - for (int i = 0; i < len; i++) { - char ch = str.charAt(i); - if (ch >= '0' && ch <= '9') { - value = value * 10 + (ch - '0'); - } else if (ch == '.' || ch == '_' || ch == '+') { - results.add(value); - value = 0; - } else { - throw new NumberFormatException(); - } - } - results.add(value); - return results; - } - - private static Version parseJavaVersion(String javaVersion) { - // Remove pre-release part, usually -ea - final int indexOfDash = javaVersion.indexOf('-'); - if (indexOfDash >= 0) { - javaVersion = javaVersion.substring(0, indexOfDash); - } - - int major = 0; - int minor = 0; - int update = 0; - - try { - List nums = splitDigits(javaVersion); - major = nums.get(0); - - // for java 1.6/1.7/1.8 - if (major == 1) { - major = nums.get(1); - minor = nums.get(2); - update = nums.get(3); - } else { - minor = nums.get(1); - update = nums.get(2); - } - } catch (NumberFormatException | IndexOutOfBoundsException e) { - // unable to parse version string - do nothing - } - return new Version(major, minor, update); - } - - static final class Version { - public final int major, minor, update; - - public Version(int major, int minor, int update) { - this.major = major; - this.minor = minor; - this.update = update; - } - - public boolean is(int major) { - return this.major == major; - } - - public boolean is(int major, int minor) { - return this.major == major && this.minor == minor; - } - - public boolean is(int major, int minor, int update) { - return this.major == major && this.minor == minor && this.update == update; - } - - public boolean isAtLeast(int major, int minor, int update) { - return isAtLeast(this.major, this.minor, this.update, major, minor, update); - } - - public boolean isBetween( - int fromMajor, int fromMinor, int fromUpdate, int toMajor, int toMinor, int toUpdate) { - return isAtLeast(toMajor, toMinor, toUpdate, fromMajor, fromMinor, fromUpdate) - && isAtLeast(fromMajor, fromMinor, fromUpdate) - && !isAtLeast(toMajor, toMinor, toUpdate); - } - - private static boolean isAtLeast( - int major, int minor, int update, int atLeastMajor, int atLeastMinor, int atLeastUpdate) { - return (major > atLeastMajor) - || (major == atLeastMajor && minor > atLeastMinor) - || (major == atLeastMajor && minor == atLeastMinor && update >= atLeastUpdate); - } - } - - static final class JvmRuntime { - /* - * Example: - * jvm -> "AdoptOpenJDK 1.8.0_265-b01" - * - * name -> "OpenJDK" - * vendor -> "AdoptOpenJDK" - * version -> "1.8.0_265" - * patches -> "b01" - */ - public final String name; - - public final String vendor; - public final String version; - public final String vendorVersion; - public final String patches; - - public JvmRuntime() { - this( - System.getProperty("java.version"), - System.getProperty("java.runtime.version"), - System.getProperty("java.runtime.name"), - System.getProperty("java.vm.vendor"), - System.getProperty("java.vendor.version")); - } - - // Only visible for testing - JvmRuntime(String javaVer, String rtVer, String name, String vendor, String vendorVersion) { - this.name = name == null ? "" : name; - this.vendor = vendor == null ? "" : vendor; - javaVer = javaVer == null ? "" : javaVer; - this.version = javaVer; - this.vendorVersion = vendorVersion == null ? "" : vendorVersion; - rtVer = javaVer.isEmpty() || rtVer == null ? javaVer : rtVer; - int patchStart = javaVer.length() + 1; - this.patches = (patchStart >= rtVer.length()) ? "" : rtVer.substring(javaVer.length() + 1); - } - } - - public static boolean isJavaVersion(int major) { - return JAVA_VERSION.is(major); - } - - public static boolean isJavaVersion(int major, int minor) { - return JAVA_VERSION.is(major, minor); - } - - public static boolean isJavaVersion(int major, int minor, int update) { - return JAVA_VERSION.is(major, minor, update); - } - - public static boolean isJavaVersionAtLeast(int major) { - return isJavaVersionAtLeast(major, 0, 0); - } - - public static boolean isJavaVersionAtLeast(int major, int minor) { - return isJavaVersionAtLeast(major, minor, 0); - } - - public static boolean isJavaVersionAtLeast(int major, int minor, int update) { - return JAVA_VERSION.isAtLeast(major, minor, update); - } - - /** - * Check if the Java version is between {@code fromMajor} (inclusive) and {@code toMajor} - * (exclusive). - * - * @param fromMajor major from version (inclusive) - * @param toMajor major to version (exclusive) - * @return if the current java version is between the from version (inclusive) and the to version - * exclusive - */ - public static boolean isJavaVersionBetween(int fromMajor, int toMajor) { - return isJavaVersionBetween(fromMajor, 0, toMajor, 0); - } - - /** - * Check if the Java version is between {@code fromMajor.fromMinor} (inclusive) and {@code - * toMajor.toMinor} (exclusive). - * - * @param fromMajor major from version (inclusive) - * @param fromMinor minor from version (inclusive) - * @param toMajor major to version (exclusive) - * @param toMinor minor to version (exclusive) - * @return if the current java version is between the from version (inclusive) and the to version - * exclusive - */ - public static boolean isJavaVersionBetween( - int fromMajor, int fromMinor, int toMajor, int toMinor) { - return isJavaVersionBetween(fromMajor, fromMinor, 0, toMajor, toMinor, 0); - } - - /** - * Check if the Java version is between {@code fromMajor.fromMinor.fromUpdate} (inclusive) and - * {@code toMajor.toMinor.toUpdate} (exclusive). - * - * @param fromMajor major from version (inclusive) - * @param fromMinor minor from version (inclusive) - * @param fromUpdate update from version (inclusive) - * @param toMajor major to version (exclusive) - * @param toMinor minor to version (exclusive) - * @param toUpdate update to version (exclusive) - * @return if the current java version is between the from version (inclusive) and the to version - * exclusive - */ - public static boolean isJavaVersionBetween( - int fromMajor, int fromMinor, int fromUpdate, int toMajor, int toMinor, int toUpdate) { - return JAVA_VERSION.isBetween(fromMajor, fromMinor, fromUpdate, toMajor, toMinor, toUpdate); - } - - public static boolean isLinux() { - return System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("linux"); - } - - public static boolean isWindows() { - // https://mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/ - final String os = System.getProperty("os.name").toLowerCase(Locale.ROOT); - return os.contains("win"); - } - - public static boolean isMac() { - final String os = System.getProperty("os.name").toLowerCase(Locale.ROOT); - return os.contains("mac"); - } - - public static boolean isAarch64() { - return System.getProperty("os.arch").toLowerCase().contains("aarch64"); - } - - public static boolean isMusl() { - if (!isLinux()) { - return false; - } - // check the Java exe then fall back to proc/self maps - try { - return isMuslJavaExecutable(); - } catch (IOException e) { - try { - return isMuslProcSelfMaps(); - } catch (IOException ignore) { - return false; - } - } - } - - static boolean isMuslProcSelfMaps() throws IOException { - try (BufferedReader reader = new BufferedReader(new FileReader("/proc/self/maps"))) { - String line; - while ((line = reader.readLine()) != null) { - if (line.contains("-musl-")) { - return true; - } - if (line.contains("/libc.")) { - return false; - } - } - } - return false; - } - - /** - * There is information about the linking in the ELF file. Since properly parsing ELF is not - * trivial this code will attempt a brute-force approach and will scan the first 4096 bytes of the - * 'java' program image for anything prefixed with `/ld-` - in practice this will contain - * `/ld-musl` for musl systems and probably something else for non-musl systems (eg. - * `/ld-linux-...`). However, if such string is missing should indicate that the system is not a - * musl one. - */ - static boolean isMuslJavaExecutable() throws IOException { - - byte[] magic = new byte[] {(byte) 0x7f, (byte) 'E', (byte) 'L', (byte) 'F'}; - byte[] prefix = new byte[] {(byte) '/', (byte) 'l', (byte) 'd', (byte) '-'}; // '/ld-*' - byte[] musl = new byte[] {(byte) 'm', (byte) 'u', (byte) 's', (byte) 'l'}; // 'musl' - - Path binary = Paths.get(System.getProperty("java.home"), "bin", "java"); - byte[] buffer = new byte[4096]; - - try (InputStream is = Files.newInputStream(binary)) { - int read = is.read(buffer, 0, 4); - if (read != 4 || !containsArray(buffer, 0, magic)) { - throw new IOException(Arrays.toString(buffer)); - } - read = is.read(buffer); - if (read <= 0) { - throw new IOException(); - } - int prefixPos = 0; - for (int i = 0; i < read; i++) { - if (buffer[i] == prefix[prefixPos]) { - if (++prefixPos == prefix.length) { - return containsArray(buffer, i + 1, musl); - } - } else { - prefixPos = 0; - } - } - } - return false; - } - - private static boolean containsArray(byte[] container, int offset, byte[] contained) { - for (int i = 0; i < contained.length; i++) { - int leftPos = offset + i; - if (leftPos >= container.length) { - return false; - } - if (container[leftPos] != contained[i]) { - return false; - } - } - return true; - } - - public static boolean isOracleJDK8() { - return isJavaVersion(8) - && RUNTIME.vendor.contains("Oracle") - && !RUNTIME.name.contains("OpenJDK"); - } - - public static boolean isJ9() { - return System.getProperty("java.vm.name").contains("J9"); - } - - public static boolean isIbm8() { - return isJavaVersion(8) && RUNTIME.vendor.contains("IBM"); - } - - public static boolean isGraalVM() { - return RUNTIME.vendorVersion.toLowerCase().contains("graalvm"); - } - - public static String getLangVersion() { - return String.valueOf(JAVA_VERSION.major); - } - - public static String getRuntimeVendor() { - return RUNTIME.vendor; - } - - public static String getRuntimeVersion() { - return RUNTIME.version; - } - - public static String getRuntimePatches() { - return RUNTIME.patches; - } } diff --git a/internal-api/src/test/groovy/datadog/trace/api/PlatformTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/PlatformTest.groovy deleted file mode 100644 index 12777977d4c..00000000000 --- a/internal-api/src/test/groovy/datadog/trace/api/PlatformTest.groovy +++ /dev/null @@ -1,116 +0,0 @@ -package datadog.trace.api - -import datadog.trace.test.util.DDSpecification -import org.junit.Assume - -class PlatformTest extends DDSpecification { - - def "is at least java 7"() { - expect: Platform.isJavaVersionAtLeast(7) - } - - def "is at least java 8 when run on JDK1.8 or later"() { - Assume.assumeTrue(!System.getProperty("java.version").startsWith("1.") - || System.getProperty("java.version").startsWith("1.8.")) - expect: Platform.isJavaVersionAtLeast(8) && Platform.isJavaVersionAtLeast(7) - } - - def "is at least java 11 when run on JDK11 or later"() { - Assume.assumeTrue(!System.getProperty("java.version").startsWith("1.") - && !(System.getProperty("java.version").startsWith("9.") - || System.getProperty("java.version").startsWith("10."))) - expect: Platform.isJavaVersionAtLeast(11) && Platform.isJavaVersionAtLeast(8) - } - - def "test parse #version yields #major, #minor, and #update"() { - when: - def javaVersion = Platform.parseJavaVersion(version) - then: - major == javaVersion.major - minor == javaVersion.minor - update == javaVersion.update - javaVersion.is(major) - javaVersion.is(major, minor) - javaVersion.is(major, minor, update) - javaVersion.isAtLeast(major, minor, update) - javaVersion.isBetween(major, minor, update, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE) - !javaVersion.isBetween(major, minor, update, major, minor, update) - !javaVersion.isBetween(major, minor, update, major - 1, 0, 0) - !javaVersion.isBetween(major, minor, update, major, minor -1, 0) - !javaVersion.isBetween(major, minor, update, major, minor, update - 1) - javaVersion.isBetween(major, minor, update, major + 1, 0, 0) - javaVersion.isBetween(major, minor, update, major, minor + 1, 0) - javaVersion.isBetween(major, minor, update, major, minor, update + 1) - - where: - version | major | minor | update - "" | 0 | 0 | 0 - "a.0.0" | 0 | 0 | 0 - "0.a.0" | 0 | 0 | 0 - "0.0.a" | 0 | 0 | 0 - "1.a.0_0" | 0 | 0 | 0 - "1.8.a_0" | 0 | 0 | 0 - "1.8.0_a" | 0 | 0 | 0 - "1.7" | 7 | 0 | 0 - "1.7.0" | 7 | 0 | 0 - "1.7.0_221" | 7 | 0 | 221 - "1.8" | 8 | 0 | 0 - "1.8.0" | 8 | 0 | 0 - "1.8.0_212" | 8 | 0 | 212 - "1.8.0_292" | 8 | 0 | 292 - "9-ea" | 9 | 0 | 0 - "9.0.4" | 9 | 0 | 4 - "9.1.2" | 9 | 1 | 2 - "10.0.2" | 10 | 0 | 2 - "11" | 11 | 0 | 0 - "11.0.6" | 11 | 0 | 6 - "11.0.11" | 11 | 0 | 11 - "12.0.2" | 12 | 0 | 2 - "13.0.2" | 13 | 0 | 2 - "14" | 14 | 0 | 0 - "14.0.2" | 14 | 0 | 2 - "15" | 15 | 0 | 0 - "15.0.2" | 15 | 0 | 2 - "16.0.1" | 16 | 0 | 1 - "11.0.9.1+1"| 11 | 0 | 9 - "11.0.6+10" | 11 | 0 | 6 - "17.0.4-x" | 17 | 0 | 4 - } - - def "test parse #version is at least #major, #minor, and #update"() { - when: - def javaVersion = Platform.parseJavaVersion(version) - then: - javaVersion.isAtLeast(major, minor, update) - - where: - version | major | minor | update - "17.0.5+8" | 17 | 0 | 5 - "17.0.5" | 17 | 0 | 5 - "17.0.6+8" | 17 | 0 | 5 - "11.0.17+8" | 11 | 0 | 17 - "11.0.18+8" | 11 | 0 | 17 - "11.0.17" | 11 | 0 | 17 - "1.8.0_352" | 8 | 0 | 352 - "1.8.0_362" | 8 | 0 | 352 - } - - def "JVMRuntime is at least a bit resilient against weird version properties"() { - when: - def runtime = new Platform.JvmRuntime(propVersion, rtVersion, propName, propVendor, null) - - then: - runtime.version == version - runtime.patches == patch - runtime.name == name - runtime.vendor == vendor - - where: - propVersion | rtVersion | propName | propVendor | version | patch | name | vendor - '1.8.0_265' | '1.8.0_265-b01' | 'OpenJDK' | 'AdoptOpenJDK' | '1.8.0_265' | 'b01' | 'OpenJDK' | 'AdoptOpenJDK' - '1.8.0_265' | '1.8-b01' | 'OpenJDK' | 'AdoptOpenJDK' | '1.8.0_265' | '' | 'OpenJDK' | 'AdoptOpenJDK' - '19' | '19' | 'OpenJDK 64-Bit' | 'Homebrew' | '19' | '' | 'OpenJDK 64-Bit' | 'Homebrew' - '17' | null | null | null | '17' | '' | '' | '' - null | '17' | null | null | '' | '' | '' | '' - } -} diff --git a/settings.gradle b/settings.gradle index 57185d3b47e..60c8f77730a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -86,7 +86,6 @@ include ':dd-java-agent:agent-otel:otel-shim' include ':dd-java-agent:agent-otel:otel-tooling' include ':communication' -include ':components:cli' include ':components:context' include ':components:environment' include ':components:json'