Skip to content

Commit b921659

Browse files
committed
Fix error tracking payload
1 parent 71f7705 commit b921659

File tree

7 files changed

+36
-26
lines changed

7 files changed

+36
-26
lines changed

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public CrashUploader(@Nonnull final ConfigManager.StoredConfig storedConfig) {
155155
dispatcher, /* dispatcher */
156156
telemetryUrl, // will be overridden in each request
157157
true, /* retryOnConnectionFailure */
158-
4, /* maxRunningRequests */ // allows 1 blocked ping and two crash request
158+
4, /* maxRunningRequests */ // not having one request blocking the others
159159
configProvider.getString(CRASH_TRACKING_PROXY_HOST),
160160
configProvider.getInteger(CRASH_TRACKING_PROXY_PORT),
161161
configProvider.getString(CRASH_TRACKING_PROXY_USERNAME),
@@ -200,8 +200,7 @@ void sendPingToErrorTracking(String error) {
200200
null,
201201
"Crashtracker crash ping: "
202202
+ (error != null ? error : "crash processing started"),
203-
null,
204-
false),
203+
null),
205204
null,
206205
OSInfo.current(),
207206
null,
@@ -293,6 +292,7 @@ void uploadToLogs(@Nonnull String message, @Nonnull PrintStream out) throws IOEx
293292
}
294293

295294
// @VisibleForTesting
295+
@SuppressForbidden
296296
static String extractErrorKind(String fileContent) {
297297
Matcher matcher = ERROR_MESSAGE_PATTERN.matcher(fileContent);
298298
if (!matcher.find()) {
@@ -324,6 +324,7 @@ static String extractErrorKind(String fileContent) {
324324
Pattern.DOTALL | Pattern.MULTILINE);
325325

326326
// @VisibleForTesting
327+
@SuppressForbidden
327328
static String extractErrorMessage(String fileContent) {
328329
Matcher matcher = ERROR_MESSAGE_PATTERN.matcher(fileContent);
329330
if (!matcher.find()) {
@@ -491,8 +492,23 @@ private RequestBody makeErrorTrackingRequestBody(@Nonnull CrashLog payload, bool
491492
writer.name("timestamp").value(payload.timestamp);
492493
writer.name("ddsource").value("crashtracker");
493494
// error payload
494-
writer.name("error");
495-
payload.error.writeAsJson(writer); // flat write an already serialized json object
495+
if (payload.error != null) {
496+
writer.name("error");
497+
writer.beginObject();
498+
writer.name("source_type").value("crashtracking");
499+
if (!isPing) {
500+
writer.name("is_crash").value(true);
501+
}
502+
writer.name("type").value(payload.error.kind);
503+
writer.name("message").value(payload.error.message);
504+
if (payload.error.stack != null) {
505+
writer.name("stack");
506+
// payload.error.message
507+
payload.error.stack.writeAsJson(writer);
508+
// flat write an already serialized json object
509+
}
510+
writer.endObject();
511+
}
496512
// signal info
497513
if (payload.sigInfo != null) {
498514
writer.name("sig_info");

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/dto/ErrorData.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
package datadog.crashtracking.dto;
22

33
import com.squareup.moshi.Json;
4-
import com.squareup.moshi.JsonAdapter;
5-
import com.squareup.moshi.JsonWriter;
6-
import com.squareup.moshi.Moshi;
7-
import java.io.IOException;
84
import java.util.Objects;
95

106
public final class ErrorData {
11-
private static final JsonAdapter<ErrorData> ADAPTER =
12-
new Moshi.Builder().build().adapter(ErrorData.class);
13-
147
@Json(name = "is_crash")
15-
public final boolean isCrash;
8+
public final boolean isCrash = true;
169

1710
public final String kind;
1811
public final String message;
@@ -23,14 +16,9 @@ public final class ErrorData {
2316
public final StackTrace stack;
2417

2518
public ErrorData(String kind, String message, StackTrace stack) {
26-
this(kind, message, stack, true);
27-
}
28-
29-
public ErrorData(String kind, String message, StackTrace stack, boolean isCrash) {
3019
this.kind = kind;
3120
this.message = message;
3221
this.stack = stack;
33-
this.isCrash = isCrash;
3422
}
3523

3624
@Override
@@ -53,8 +41,4 @@ public boolean equals(Object o) {
5341
public int hashCode() {
5442
return Objects.hash(isCrash, kind, message, sourceType, stack);
5543
}
56-
57-
public void writeAsJson(final JsonWriter writer) throws IOException {
58-
ADAPTER.toJson(writer, this);
59-
}
6044
}

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/dto/StackTrace.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package datadog.crashtracking.dto;
22

3+
import com.squareup.moshi.JsonAdapter;
4+
import com.squareup.moshi.JsonWriter;
5+
import com.squareup.moshi.Moshi;
6+
import java.io.IOException;
37
import java.util.Arrays;
48
import java.util.Objects;
59

610
public final class StackTrace {
11+
private static final JsonAdapter<StackTrace> ADAPTER =
12+
new Moshi.Builder().build().adapter(StackTrace.class);
713
private static final String FORMAT = "CrashTrackerV1";
814

915
public final String format = FORMAT;
@@ -29,4 +35,8 @@ public boolean equals(Object o) {
2935
public int hashCode() {
3036
return Objects.hash(format, Arrays.hashCode(frames));
3137
}
38+
39+
public void writeAsJson(final JsonWriter writer) throws IOException {
40+
ADAPTER.toJson(writer, this);
41+
}
3242
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"timestamp":"2024-09-20T13:19:06Z","ddsource":"crashtracker","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"}]}},"sig_info":{"si_addr":"0x00007f011ab1ccd5 (sent by kill)","si_signo_human_readable":"SIGSEGV","si_signo":11},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":"15.7.1"},"ddtags":"host:COMP-LTD4YC2T2N,runtime-id:edbdef5c-7038-4286-97f8-e76bb65b281f,language:jvm,env:,version:,service:worker.org.gradle.process.internal.worker.GradleWorkerMain,is_crash:true,data_schema_version:1.0,language_name:jvm,language_version:1.8.0_345,tracer_version:1.56.0-snapshot_13a0b2e4c7,uuid:a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3"}
1+
{"timestamp":"2024-09-20T13:19:06Z","ddsource":"crashtracker","error":{"source_type":"crashtracking","is_crash":true,"type":"SIGSEGV","message":"Process terminated by signal SIGSEGV","stack":{"format":"CrashTrackerV1","frames":[{"file":"libpthread.so.0","function":"__pthread_clockjoin_ex"}]}},"sig_info":{"si_addr":"0x00007f011ab1ccd5 (sent by kill)","si_signo_human_readable":"SIGSEGV","si_signo":11}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"ddsource":"crashtracker","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"}]}},"sig_info":{"si_addr":"0x0000000000000000","si_signo_human_readable":"INVALID","si_signo":0},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":"15.7.1"},"ddtags":"host:COMP-LTD4YC2T2N,runtime-id:edbdef5c-7038-4286-97f8-e76bb65b281f,language:jvm,env:,version:,service:worker.org.gradle.process.internal.worker.GradleWorkerMain,is_crash:true,data_schema_version:1.0,language_name:jvm,language_version:1.8.0_345,tracer_version:1.56.0-snapshot_13a0b2e4c7,uuid:a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3"}
1+
{"ddsource":"crashtracker","error":{"source_type":"crashtracking","is_crash":true,"type":"INVALID","message":"Process terminated by signal INVALID","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"}]}},"sig_info":{"si_addr":"0x0000000000000000","si_signo_human_readable":"INVALID","si_signo":0}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"timestamp":"2023-10-17T20:25:14+08:00","ddsource":"crashtracker","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*)"}]}},"sig_info":{"si_addr":"0x00007f37a18bc187","si_signo_human_readable":"SIGSEGV","si_signo":11},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":"15.7.1"},"ddtags":"host:COMP-LTD4YC2T2N,runtime-id:edbdef5c-7038-4286-97f8-e76bb65b281f,language:jvm,env:,version:,service:worker.org.gradle.process.internal.worker.GradleWorkerMain,is_crash:true,data_schema_version:1.0,language_name:jvm,language_version:1.8.0_345,tracer_version:1.56.0-snapshot_13a0b2e4c7,uuid:a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3"}
1+
{"timestamp":"2023-10-17T20:25:14+08:00","ddsource":"crashtracker","error":{"source_type":"crashtracking","is_crash":true,"type":"SIGSEGV","message":"Process terminated by signal SIGSEGV","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*)"}]}},"sig_info":{"si_addr":"0x00007f37a18bc187","si_signo_human_readable":"SIGSEGV","si_signo":11}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"timestamp":"2025-11-19T13:55:23.532+01:00","ddsource":"crashtracker","error":{"is_crash":false,"message":"Crashtracker crash ping: crash processing started","source_type":"crashtracking"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":"15.7.1"},"ddtags":"host:COMP-LTD4YC2T2N,runtime-id:3a52cf96-691d-4705-a911-7f89f4d4d9c3,language:jvm,env:,version:,service:worker.org.gradle.process.internal.worker.GradleWorkerMain,is_crash_ping:true,data_schema_version:1.0,language_name:jvm,language_version:1.8.0_345,tracer_version:1.56.0-snapshot_13a0b2e4c7,uuid:a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3"}
1+
{"timestamp":"2025-11-19T13:55:23.532+01:00","ddsource":"crashtracker","error":{"message":"Crashtracker crash ping: crash processing started","source_type":"crashtracking"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":"15.7.1"},"ddtags":"host:COMP-LTD4YC2T2N,runtime-id:3a52cf96-691d-4705-a911-7f89f4d4d9c3,language:jvm,env:,version:,service:worker.org.gradle.process.internal.worker.GradleWorkerMain,is_crash_ping:true,data_schema_version:1.0,language_name:jvm,language_version:1.8.0_345,tracer_version:1.56.0-snapshot_13a0b2e4c7,uuid:a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3"}

0 commit comments

Comments
 (0)