Skip to content

Commit 27abfdb

Browse files
committed
Handle incomplete crash reports
1 parent 81ec538 commit 27abfdb

File tree

4 files changed

+72
-4
lines changed

4 files changed

+72
-4
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,16 +259,18 @@ boolean uploadToTelemetry(@Nonnull Path file, String uuid) {
259259
try {
260260
String content = new String(Files.readAllBytes(file), Charset.defaultCharset());
261261
CrashLog crashLog = CrashLogParser.fromHotspotCrashLog(uuid, content);
262-
if (crashLog == null) {
262+
if (crashLog == null || crashLog.incomplete) {
263263
log.error(SEND_TELEMETRY, "Failed to parse crash log with uuid {} ", uuid);
264+
}
265+
if (crashLog == null) {
264266
return false;
265267
}
266268
handleCall(makeTelemetryRequest(makeTelemetryRequestBody(crashLog.toJson(), false)), "crash");
269+
return !crashLog.incomplete;
267270
} catch (Throwable t) {
268271
log.error("Failed to upload crash file: {}", file, t);
269272
return false;
270273
}
271-
return true;
272274
}
273275

274276
private Call makeTelemetryRequest(@Nonnull RequestBody requestBody) throws IOException {

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ public CrashLog parse(String uuid, String crashLog) {
121121
List<StackFrame> frames = new ArrayList<>();
122122
String datetime = null;
123123
StringBuilder message = new StringBuilder();
124+
boolean incomplete = false;
124125

125126
String[] lines = NEWLINE_SPLITTER.split(crashLog);
126127
outer:
@@ -197,7 +198,7 @@ public CrashLog parse(String uuid, String crashLog) {
197198

198199
if (state != State.DONE) {
199200
// incomplete crash log
200-
return null;
201+
incomplete = true;
201202
}
202203

203204
ErrorData error =
@@ -213,7 +214,7 @@ public CrashLog parse(String uuid, String crashLog) {
213214
SystemProperties.get("os.name"),
214215
SemanticVersion.of(SystemProperties.get("os.version")));
215216
ProcInfo procInfo = pid != null ? new ProcInfo(pid) : null;
216-
return new CrashLog(uuid, false, datetime, error, metadata, osInfo, procInfo, "1.0");
217+
return new CrashLog(uuid, incomplete, datetime, error, metadata, osInfo, procInfo, "1.0");
217218
}
218219

219220
static String dateTimeToISO(String datetime) {

dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
11
package datadog.crashtracking.parsers;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
46

7+
import datadog.crashtracking.dto.CrashLog;
8+
import java.io.BufferedReader;
9+
import java.io.IOException;
10+
import java.io.InputStream;
11+
import java.io.InputStreamReader;
12+
import java.nio.charset.StandardCharsets;
13+
import java.util.Objects;
14+
import java.util.UUID;
15+
import java.util.stream.Collectors;
16+
import org.junit.jupiter.api.Test;
517
import org.junit.jupiter.params.ParameterizedTest;
618
import org.junit.jupiter.params.provider.CsvSource;
719

@@ -20,4 +32,32 @@ public class HotspotCrashLogParserTest {
2032
public void testDateTimeParser(String logDateTime, String expectedISODateTime) {
2133
assertEquals(expectedISODateTime, HotspotCrashLogParser.dateTimeToISO(logDateTime));
2234
}
35+
36+
@Test
37+
public void testIncompleteParsing() throws Exception {
38+
// Given
39+
final String uuid = UUID.randomUUID().toString();
40+
41+
// When
42+
final CrashLog crashLog =
43+
new HotspotCrashLogParser().parse(uuid, readFileAsString("incomplete-crash.txt"));
44+
45+
// Then
46+
assertNotNull(crashLog);
47+
assertEquals(uuid, crashLog.uuid);
48+
assertTrue(crashLog.incomplete);
49+
assertNotNull(crashLog.error);
50+
assertNotNull(crashLog.error.stack);
51+
assertNotNull(crashLog.error.stack.frames);
52+
assertEquals(0, crashLog.error.stack.frames.length);
53+
}
54+
55+
private String readFileAsString(String resource) throws IOException {
56+
try (InputStream stream = getClass().getClassLoader().getResourceAsStream(resource)) {
57+
return new BufferedReader(
58+
new InputStreamReader(Objects.requireNonNull(stream), StandardCharsets.UTF_8))
59+
.lines()
60+
.collect(Collectors.joining("\n"));
61+
}
62+
}
2363
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#
2+
# A fatal error has been detected by the Java Runtime Environment:
3+
#
4+
# SIGSEGV (0xb) at pc=0x00007f37a18bc187, pid=161958, tid=2169438
5+
#
6+
# JRE version: OpenJDK Runtime Environment Zulu17.42+20-SA (17.0.7+7) (build 17.0.7+7-LTS)
7+
# Java 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)
8+
# Problematic frame:
9+
# V [libjvm.so+0x6b7187] vframeStreamForte::forte_next()+0x797
10+
#
11+
# Core dump will be written. Default location: Core dumps may be processed with "/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e" (or dumping to /opt/REDACT_THIS/REDACT_THIS/log/run/dir/core.161958)
12+
#
13+
# JFR recording file will be written. Location: /opt/REDACT_THIS/REDACT_THIS/log/run/dir/hs_err_pid161958.jfr
14+
#
15+
# If you would like to submit a bug report, please visit:
16+
# http://www.azul.com/support/
17+
#
18+
19+
--------------- S U M M A R Y ------------
20+
21+
Command Line: -Xms4G -Xmx16G -XX:+UnlockDiagnosticVMOptions -XX:MaxMetaspaceSize=1G -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*:file=gc.log:time,level,tags -Djavax.xml.ws.spi.Provider=REDACT_THIS -Djavax.xml.soap.SAAJMetaFactory=REDACT_THIS -javaagent:/opt/REDACT_THIS/datadog-apm-agent/dd-java-agent.jar -Ddd.profiling.enabled=true -XX:FlightRecorderOptions=stackdepth=256 -Ddd.service=REDACT_THIS -Ddd.env=REDACT_THIS --add-reads=java.xml=java.logging --add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED --patch-module=java.base=/opt/REDACT_THIS/REDACT_THIS/lib/endorsed/org.apache.karaf.specs.locator-4.3.9.SEE2.jar --patch-module=java.xml=/opt/REDACT_THIS/REDACT_THIS/lib/endorsed/org.apache.karaf.specs.java.xml-4.3.9.SEE2.jar --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/javax.security.auth.login=ALL-UNNAMED --add-opens=java.base/sun.security.ssl=ALL-UNNAMED --add-opens=java.base/sun.security.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming.spi=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp.datatype=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED --add-opens=java.xml/org.xml.sax=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.locks=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.file=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.ftp=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED --add-exports=java.base/sun.net.www.content.text=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED --add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED --add-exports=jdk.crypto.cryptoki/sun.security.pkcs11=ALL-UNNAMED --add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED --add-exports=java.security.sasl/com.sun.security.sasl=ALL-UNNAMED --module-path=/opt/REDACT_THIS/REDACT_THIS/lib/jdk9-additional-modules --add-modules=REDACT_THIS, -Dkaraf.instances=REDACT_THIS -Dkaraf.home=/opt/REDACT_THIS/REDACT_THIS -Dkaraf.base=/opt/REDACT_THIS/REDACT_THIS -Dkaraf.data=/opt/REDACT_THIS/REDACT_THIS/temp -Dkaraf.etc=/opt/REDACT_THIS/REDACT_THIS/etc -Dkaraf.log=/opt/REDACT_THIS/REDACT_THIS/temp/log -Djavax.xml.bind.JAXBContextFactory=REDACT_THIS -Dkaraf.restart.jvm.supported=REDACT_THIS -Djava.io.tmpdir=/opt/REDACT_THIS/REDACT_THIS/temp/tmp -Djava.util.logging.config.file=/opt/REDACT_THIS/REDACT_THIS/etc/java.util.logging.properties -Dkaraf.startLocalConsole=REDACT_THIS -Dkaraf.startRemoteShell=REDACT_THIS REDACT_THIS
22+
23+
Host: Intel(R) Xeon(R) CPU @ 2.80GHz, 8 cores, 23G, Red Hat Enterprise Linux release 8.7 (Ootpa)
24+
Time: Tue Oct 17 20:25:14 2023 +08 elapsed time: 2029121.315666 seconds (23d 11h 38m 41s)
25+

0 commit comments

Comments
 (0)