From 69bfd55aae0e30b7a959191aa1221e36c62f95ce Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 14 Nov 2025 10:24:49 +0100 Subject: [PATCH 1/2] Simplify the default crashtracker message --- .../crashtracking/parsers/HotspotCrashLogParser.java | 10 ++-------- .../resources/golden/sample-crash-for-telemetry-2.txt | 2 +- .../resources/golden/sample-crash-for-telemetry-3.txt | 2 +- .../resources/golden/sample-crash-for-telemetry.txt | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-) 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 cfbebc9df1f..72fa2dd8535 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 @@ -120,7 +120,6 @@ public CrashLog parse(String uuid, String crashLog) { String pid = null; List frames = new ArrayList<>(); String datetime = null; - StringBuilder message = new StringBuilder(); boolean incomplete = false; String[] lines = NEWLINE_SPLITTER.split(crashLog); @@ -130,7 +129,6 @@ public CrashLog parse(String uuid, String crashLog) { case NEW: if (line.startsWith( "# A fatal error has been detected by the Java Runtime Environment:")) { - message.append("\n\n"); state = State.MESSAGE; // jump directly to MESSAGE state } break; @@ -151,8 +149,6 @@ public CrashLog parse(String uuid, String crashLog) { int endIdx = line.indexOf(',', pidIdx); pid = line.substring(pidIdx + 4, endIdx); } - } else { - message.append(line.substring(2)).append('\n'); } } break; @@ -174,7 +170,6 @@ public CrashLog parse(String uuid, String crashLog) { case THREAD: // Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) if (line.startsWith("Native frames: ")) { - message.append('\n').append(line).append('\n'); state = State.STACKTRACE; } break; @@ -183,7 +178,6 @@ public CrashLog parse(String uuid, String crashLog) { state = State.DONE; } else { // Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) - message.append(line).append('\n'); frames.add(parseLine(line)); } break; @@ -200,10 +194,10 @@ public CrashLog parse(String uuid, String crashLog) { // incomplete crash log incomplete = true; } + String message = "Process terminated by signal " + (signal != null ? signal : "UNKNOWN"); ErrorData error = - new ErrorData( - signal, message.toString(), new StackTrace(frames.toArray(new StackFrame[0]))); + new ErrorData(signal, message, new StackTrace(frames.toArray(new StackFrame[0]))); // We can not really extract the full metadata and os info from the crash log // This code assumes the parser is run on the same machine as the crash happened Metadata metadata = new Metadata("dd-trace-java", VersionInfo.VERSION, "java", null); diff --git a/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-2.txt b/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-2.txt index b9a9037dcdc..d679a8960b4 100644 --- a/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-2.txt +++ b/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-2.txt @@ -1 +1 @@ -{"data_schema_version":"1.0","error":{"is_crash":true,"kind":"SIGSEGV","message":"\n\nJRE version: OpenJDK Runtime Environment Temurin-22.0.1+8 (22.0.1+8) (build 22.0.1+8)\nJava VM: OpenJDK 64-Bit Server VM Temurin-22.0.1+8 (22.0.1+8, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)\nProblematic frame:\nC [libpthread.so.0+0x9cd5] __pthread_clockjoin_ex+0x255\n\nNative frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)\nC [libpthread.so.0+0x9cd5] __pthread_clockjoin_ex+0x255\n","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"file":"libpthread.so.0","function":"__pthread_clockjoin_ex"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.55.0-SNAPSHOT~6b33361cb4"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":"576034"},"timestamp":"2024-09-20T13:19:06Z","uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0} +{"data_schema_version":"1.0","error":{"is_crash":true,"kind":"SIGSEGV","message":"Process terminated by signal SIGSEGV","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"file":"libpthread.so.0","function":"__pthread_clockjoin_ex"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.56.0-SNAPSHOT~37a6360670"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":"576034"},"timestamp":"2024-09-20T13:19:06Z","uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0} diff --git a/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-3.txt b/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-3.txt index 4538aef5347..0ea79a66e8f 100644 --- a/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-3.txt +++ b/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry-3.txt @@ -1 +1 @@ -{"data_schema_version":"1.0","error":{"is_crash":true,"kind":"INVALID","message":"\n\n fatal error: OutOfMemory encountered: Java heap space\nJRE version: OpenJDK Runtime Environment (Zulu 8.70.0.23-CA-macos-aarch64) (8.0_372-b07) (build 1.8.0_372-b07)\nJava VM: OpenJDK 64-Bit Server VM (25.372-b07 mixed mode bsd-aarch64 compressed oops)\n\nNative frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)\nV [libjvm.dylib+0x565d30] VMError::report_and_die()+0x468\nV [libjvm.dylib+0x1941a0] report_vm_error(char const*, int, char const*, char const*)+0x5c\nV [libjvm.dylib+0x1943d8] report_java_out_of_memory(char const*)+0xfc\nV [libjvm.dylib+0x70430] CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)+0x128\nV [libjvm.dylib+0x53eba8] TypeArrayKlass::allocate_common(int, bool, Thread*)+0xfc\nV [libjvm.dylib+0x285b6c] InterpreterRuntime::newarray(JavaThread*, BasicType, int)+0x48\nj datadog.smoketest.crashtracking.CrashtrackingTestApplication.main([Ljava/lang/String;)V+105\nv ~StubRoutines::call_stub\nV [libjvm.dylib+0x28f86c] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x840\nV [libjvm.dylib+0x2d3b44] jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)+0x294\nV [libjvm.dylib+0x2d7160] jni_CallStaticVoidMethod+0x188\nC [java+0x6404] JavaMain+0xa10\nC [libsystem_pthread.dylib+0x6f94] _pthread_start+0x88\nC [libsystem_pthread.dylib+0x1d34] thread_start+0x8\n","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"file":"libjvm.dylib","function":"VMError::report_and_die()"},{"file":"libjvm.dylib","function":"report_vm_error(char const*, int, char const*, char const*)"},{"file":"libjvm.dylib","function":"report_java_out_of_memory(char const*)"},{"file":"libjvm.dylib","function":"CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)"},{"file":"libjvm.dylib","function":"TypeArrayKlass::allocate_common(int, bool, Thread*)"},{"file":"libjvm.dylib","function":"InterpreterRuntime::newarray(JavaThread*, BasicType, int)"},{"function":"datadog.smoketest.crashtracking.CrashtrackingTestApplication.main([Ljava/lang/String;)V","line":105},{"function":" ~StubRoutines::call_stub"},{"file":"libjvm.dylib","function":"JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)"},{"file":"libjvm.dylib","function":"jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)"},{"file":"libjvm.dylib","function":"jni_CallStaticVoidMethod"},{"file":"java","function":"JavaMain"},{"file":"libsystem_pthread.dylib","function":"_pthread_start"},{"file":"libsystem_pthread.dylib","function":"thread_start"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.55.0-SNAPSHOT~6b33361cb4"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":"96267"},"uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0} +{"data_schema_version":"1.0","error":{"is_crash":true,"kind":"INVALID","message":"Process terminated by signal INVALID","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"file":"libjvm.dylib","function":"VMError::report_and_die()"},{"file":"libjvm.dylib","function":"report_vm_error(char const*, int, char const*, char const*)"},{"file":"libjvm.dylib","function":"report_java_out_of_memory(char const*)"},{"file":"libjvm.dylib","function":"CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)"},{"file":"libjvm.dylib","function":"TypeArrayKlass::allocate_common(int, bool, Thread*)"},{"file":"libjvm.dylib","function":"InterpreterRuntime::newarray(JavaThread*, BasicType, int)"},{"function":"datadog.smoketest.crashtracking.CrashtrackingTestApplication.main([Ljava/lang/String;)V","line":105},{"function":" ~StubRoutines::call_stub"},{"file":"libjvm.dylib","function":"JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)"},{"file":"libjvm.dylib","function":"jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)"},{"file":"libjvm.dylib","function":"jni_CallStaticVoidMethod"},{"file":"java","function":"JavaMain"},{"file":"libsystem_pthread.dylib","function":"_pthread_start"},{"file":"libsystem_pthread.dylib","function":"thread_start"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.56.0-SNAPSHOT~37a6360670"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":"96267"},"uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0} diff --git a/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry.txt b/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry.txt index 96cb36e4a70..e46021c6f53 100644 --- a/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry.txt +++ b/dd-java-agent/agent-crashtracking/src/test/resources/golden/sample-crash-for-telemetry.txt @@ -1 +1 @@ -{"data_schema_version":"1.0","error":{"is_crash":true,"kind":"SIGSEGV","message":"\n\nJRE version: OpenJDK Runtime Environment Zulu17.42+20-SA (17.0.7+7) (build 17.0.7+7-LTS)\nJava VM: OpenJDK 64-Bit Server VM Zulu17.42+20-SA (17.0.7+7-LTS, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)\nProblematic frame:\nV [libjvm.so+0x6b7187] vframeStreamForte::forte_next()+0x797\n\nNative frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)\nV [libjvm.so+0x6b7187] vframeStreamForte::forte_next()+0x797\nV [libjvm.so+0x6b79ad] forte_fill_call_trace_given_top(JavaThread*, ASGCT_CallTrace*, int, frame) [clone .isra.22]+0x7bd\nV [libjvm.so+0x6b8123] AsyncGetCallTrace+0x193\nC [libjavaProfiler586350205236920700.so+0x146c8] Profiler::getJavaTraceAsync(void*, ASGCT_CallFrame*, int, StackContext*, bool*) [clone .isra.531]+0xd8\nC [libjavaProfiler586350205236920700.so+0x1c18d] Profiler::recordSample(void*, unsigned long long, int, int, Event*)+0xa2d\nC [libjavaProfiler586350205236920700.so+0x1d128] WallClock::sharedSignalHandler(int, siginfo_t*, void*)+0x148\nC [libpthread.so.0+0x12cf0]\nV [libjvm.so+0x85f9e9] JfrStackTrace::record_safe(JavaThread*, int)+0x5a9\nV [libjvm.so+0x861650] JfrStackTraceRepository::record_for_leak_profiler(JavaThread*, int)+0x50\nV [libjvm.so+0xb1ecba] ObjectSampler::sample(HeapWordImpl**, unsigned long, JavaThread*)+0x10a\nV [libjvm.so+0x81abee] JfrAllocationTracer::JfrAllocationTracer(Klass const*, HeapWordImpl**, unsigned long, bool, JavaThread*)+0x5e\nV [libjvm.so+0x3afa20] AllocTracer::send_allocation_in_new_tlab(Klass*, HeapWordImpl**, unsigned long, unsigned long, JavaThread*)+0x30\nV [libjvm.so+0xa8f8ed] MemAllocator::allocate() const+0x13d\nV [libjvm.so+0x7e443c] InstanceKlass::allocate_objArray(int, int, JavaThread*)+0x13c\nV [libjvm.so+0xbe1b59] OptoRuntime::new_array_C(Klass*, int, JavaThread*)+0x129\n","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"file":"libjvm.so","function":"vframeStreamForte::forte_next()"},{"file":"libjvm.so","function":"forte_fill_call_trace_given_top(JavaThread*, ASGCT_CallTrace*, int, frame) [clone .isra.22]"},{"file":"libjvm.so","function":"AsyncGetCallTrace"},{"file":"libjavaProfiler586350205236920700.so","function":"Profiler::getJavaTraceAsync(void*, ASGCT_CallFrame*, int, StackContext*, bool*) [clone .isra.531]"},{"file":"libjavaProfiler586350205236920700.so","function":"Profiler::recordSample(void*, unsigned long long, int, int, Event*)"},{"file":"libjavaProfiler586350205236920700.so","function":"WallClock::sharedSignalHandler(int, siginfo_t*, void*)"},{"file":"libpthread.so.0","function":"libpthread.so.0+0x12cf0"},{"file":"libjvm.so","function":"JfrStackTrace::record_safe(JavaThread*, int)"},{"file":"libjvm.so","function":"JfrStackTraceRepository::record_for_leak_profiler(JavaThread*, int)"},{"file":"libjvm.so","function":"ObjectSampler::sample(HeapWordImpl**, unsigned long, JavaThread*)"},{"file":"libjvm.so","function":"JfrAllocationTracer::JfrAllocationTracer(Klass const*, HeapWordImpl**, unsigned long, bool, JavaThread*)"},{"file":"libjvm.so","function":"AllocTracer::send_allocation_in_new_tlab(Klass*, HeapWordImpl**, unsigned long, unsigned long, JavaThread*)"},{"file":"libjvm.so","function":"MemAllocator::allocate() const"},{"file":"libjvm.so","function":"InstanceKlass::allocate_objArray(int, int, JavaThread*)"},{"file":"libjvm.so","function":"OptoRuntime::new_array_C(Klass*, int, JavaThread*)"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.55.0-SNAPSHOT~6b33361cb4"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":"161958"},"timestamp":"2023-10-17T20:25:14+08:00","uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0} + {"data_schema_version":"1.0","error":{"is_crash":true,"kind":"SIGSEGV","message":"Process terminated by signal SIGSEGV","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"file":"libjvm.so","function":"vframeStreamForte::forte_next()"},{"file":"libjvm.so","function":"forte_fill_call_trace_given_top(JavaThread*, ASGCT_CallTrace*, int, frame) [clone .isra.22]"},{"file":"libjvm.so","function":"AsyncGetCallTrace"},{"file":"libjavaProfiler586350205236920700.so","function":"Profiler::getJavaTraceAsync(void*, ASGCT_CallFrame*, int, StackContext*, bool*) [clone .isra.531]"},{"file":"libjavaProfiler586350205236920700.so","function":"Profiler::recordSample(void*, unsigned long long, int, int, Event*)"},{"file":"libjavaProfiler586350205236920700.so","function":"WallClock::sharedSignalHandler(int, siginfo_t*, void*)"},{"file":"libpthread.so.0","function":"libpthread.so.0+0x12cf0"},{"file":"libjvm.so","function":"JfrStackTrace::record_safe(JavaThread*, int)"},{"file":"libjvm.so","function":"JfrStackTraceRepository::record_for_leak_profiler(JavaThread*, int)"},{"file":"libjvm.so","function":"ObjectSampler::sample(HeapWordImpl**, unsigned long, JavaThread*)"},{"file":"libjvm.so","function":"JfrAllocationTracer::JfrAllocationTracer(Klass const*, HeapWordImpl**, unsigned long, bool, JavaThread*)"},{"file":"libjvm.so","function":"AllocTracer::send_allocation_in_new_tlab(Klass*, HeapWordImpl**, unsigned long, unsigned long, JavaThread*)"},{"file":"libjvm.so","function":"MemAllocator::allocate() const"},{"file":"libjvm.so","function":"InstanceKlass::allocate_objArray(int, int, JavaThread*)"},{"file":"libjvm.so","function":"OptoRuntime::new_array_C(Klass*, int, JavaThread*)"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.56.0-SNAPSHOT~37a6360670"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":"161958"},"timestamp":"2023-10-17T20:25:14+08:00","uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0} From 45aec3913433c8215310696cc6a967901949154b Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 14 Nov 2025 10:59:16 +0100 Subject: [PATCH 2/2] Change smoke test --- .../src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java index a98c8979bae..ecd00fd7f13 100644 --- a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java +++ b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java @@ -338,7 +338,7 @@ private String assertCrashPing() throws InterruptedException, IOException { private void assertCrashData(String uuid) throws InterruptedException, IOException { CrashTelemetryData crashData = crashEvents.poll(DATA_TIMEOUT_MS, TimeUnit.MILLISECONDS); assertNotNull(crashData, "Crash data not uploaded"); - assertTrue(crashData.payload.get(0).message.contains("OutOfMemory")); + assertTrue(crashData.payload.get(0).message.contains("Process terminated by signal")); assertTrue(crashData.payload.get(0).tags.contains("severity:crash")); final Map map = moshi.adapter(Map.class).fromJson(crashData.payload.get(0).message); final Object receivedUuid = map.get("uuid");