diff --git a/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/CrashUploaderScriptInitializer.java b/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/CrashUploaderScriptInitializer.java index baf99051509..6579c151f74 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/CrashUploaderScriptInitializer.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/CrashUploaderScriptInitializer.java @@ -109,6 +109,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")); if (crashFile != null) { line = Strings.replace(line, "!JAVA_ERROR_FILE!", crashFile); } diff --git a/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/ScriptInitializer.java b/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/ScriptInitializer.java index 7d845efea83..e07be4b7e3f 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/ScriptInitializer.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/ScriptInitializer.java @@ -90,6 +90,9 @@ static void writeConfig(Path scriptPath, String... entries) { bw.write(entries[i + 1]); bw.newLine(); } + bw.write("java_home=" + System.getProperty("java.home")); + bw.newLine(); + Runtime.getRuntime() .addShutdownHook( new Thread( diff --git a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.bat b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.bat index 00658a95e6f..b0d8b5bdbb4 100644 --- a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.bat +++ b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.bat @@ -31,10 +31,11 @@ for /f "tokens=1,2 delims=: " %%a in (%configFile%.cfg) do ( :: Debug: Print the loaded values (Optional) echo Agent Jar: %agent% echo Tags: %tags% +echo JAVA_HOME: %java_home% echo PID: %PID% :: Execute the Java command with the loaded values -java -Ddd.dogstatsd.start-delay=0 -jar "%agent%" sendOomeEvent "%tags%" +"%java_home%\bin\java" -Ddd.dogstatsd.start-delay=0 -jar "%agent%" sendOomeEvent "%tags%" set RC=%ERRORLEVEL% del "%configFile%" :: Clean up the configuration file if %RC% EQU 0 ( diff --git a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.sh b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.sh index 85ee5ef08ca..c2ee9ecf6df 100644 --- a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.sh +++ b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/notify_oome.sh @@ -27,7 +27,7 @@ while IFS="=" read -r key value; do done < "$configFile" # Exiting early if configuration is missing -if [ -z "${config_agent}" ] || [ -z "${config_tags}" ]; then +if [ -z "${config_agent}" ] || [ -z "${config_tags}" ] || [ -z "${config_java_home}" ]; then echo "Error: Missing configuration" exit 1 fi @@ -35,10 +35,11 @@ fi # Debug: Print the loaded values (Optional) echo "Agent Jar: ${config_agent}" echo "Tags: ${config_tags}" +echo "JAVA_HOME: ${config_java_home}" echo "PID: $PID" # Execute the Java command with the loaded values -java -Ddd.dogstatsd.start-delay=0 -jar "${config_agent}" sendOomeEvent "${config_tags}" +"${config_java_home}/bin/java" -Ddd.dogstatsd.start-delay=0 -jar "${config_agent}" sendOomeEvent "${config_tags}" RC=$? rm -f "${configFile}" # Remove the configuration file diff --git a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.bat b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.bat index 588430e683b..340817c6461 100644 --- a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.bat +++ b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.bat @@ -4,7 +4,8 @@ setlocal enabledelayedexpansion :: Check if PID is provided if "%1"=="" ( echo "Error: No PID provided. Running in legacy mode." - java -jar "!AGENT_JAR!" uploadCrash "!JAVA_ERROR_FILE!" + call :ensureJava "!JAVA_ERROR_FILE!" + "!JAVA_HOME!\bin\java" -jar "!AGENT_JAR!" uploadCrash "!JAVA_ERROR_FILE!" if %ERRORLEVEL% EQU 0 ( echo "Uploaded error file \"!JAVA_ERROR_FILE!\"" ) else ( @@ -38,10 +39,11 @@ for /f "tokens=1,2 delims=: " %%a in (%configFile%.cfg) do ( :: Debug: Print the loaded values (Optional) echo Agent Jar: %agent% echo Error Log: %hs_err% +echo JAVA_HOME: %java_home% echo PID: %PID% :: Execute the Java command with the loaded values -java -jar "%agent%" uploadCrash "%hs_err%" +"%java_home%\bin\java" -jar "%agent%" uploadCrash "%hs_err%" set RC=%ERRORLEVEL% del "%configFile%" :: Clean up the configuration file if %RC% EQU 0 ( diff --git a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.sh b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.sh index 7b417dcc1be..e2d0f378797 100644 --- a/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.sh +++ b/dd-java-agent/agent-crashtracking/src/main/resources/com/datadog/crashtracking/upload_crash.sh @@ -5,7 +5,8 @@ set +e # Disable exit on error # Check if PID is provided if [ -z "$1" ]; then echo "Warn: No PID provided. Running in legacy mode." - java -jar "!AGENT_JAR!" uploadCrash "!JAVA_ERROR_FILE!" + + "!JAVA_HOME!/bin/java" -jar "!AGENT_JAR!" uploadCrash "!JAVA_ERROR_FILE!" if [ $? -eq 0 ]; then echo "Error file !JAVA_ERROR_FILE! was uploaded successfully" else @@ -35,7 +36,7 @@ while IFS="=" read -r key value; do done < "$configFile" # Exiting early if configuration is missing -if [ -z "${config_agent}" ] || [ -z "${config_hs_err}" ]; then +if [ -z "${config_agent}" ] || [ -z "${config_hs_err}" ] || [ -z "${config_java_home}" ]; then echo "Error: Missing configuration" exit 1 fi @@ -43,10 +44,11 @@ fi # Debug: Print the loaded values (Optional) echo "Agent Jar: ${config_agent}" echo "Error Log: ${config_hs_err}" +echo "JAVA_HOME: ${config_java_home}" echo "PID: $PID" # Execute the Java command with the loaded values -java -jar "${config_agent}" uploadCrash "${config_hs_err}" +"${config_java_home}/bin/java" -jar "${config_agent}" uploadCrash "${config_hs_err}" RC=$? rm -f "${configFile}" # Remove the configuration file diff --git a/dd-java-agent/agent-crashtracking/src/test/java/com/datadog/crashtracking/ScriptInitializerTest.java b/dd-java-agent/agent-crashtracking/src/test/java/com/datadog/crashtracking/ScriptInitializerTest.java index d33b5ff2539..0c7ffabe7c7 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/com/datadog/crashtracking/ScriptInitializerTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/com/datadog/crashtracking/ScriptInitializerTest.java @@ -11,6 +11,7 @@ import java.nio.file.attribute.PosixFilePermissions; import java.util.Comparator; import java.util.List; +import java.util.regex.Pattern; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -63,8 +64,13 @@ void testCrashUploaderInitializationSuccess(String target, String pidArg) assertTrue(Files.exists(file), "File " + file + " should have been created"); List lines = Files.readAllLines(file); assertFalse(lines.isEmpty(), "File " + file + " is expected to be non-empty"); + // sanity check to see if no placeholders are left + Pattern placeholder = Pattern.compile("![A-Z_]+!"); + assertFalse(lines.stream().anyMatch(l -> placeholder.matcher(l).find())); // sanity to check the crash log file was properly replaced in the script assertTrue(lines.stream().anyMatch(l -> l.contains(hsErrFile))); + // sanity to check the java home was properly captured + assertTrue(lines.stream().anyMatch(l -> l.contains("java_home"))); } @Test @@ -96,6 +102,8 @@ void testOomeNotifierInitializationSuccess(String target) throws IOException { assertFalse(lines.isEmpty(), "File " + file + " is expected to be non-empty"); // sanity to check the placeholder was properly replaced assertTrue(lines.stream().anyMatch(l -> !l.contains("!TAGS!"))); + // sanity to check the java home was properly captured + assertTrue(lines.stream().anyMatch(l -> l.contains("java_home"))); } @Test