Skip to content

Commit

Permalink
Add support for logging exception details via ErrorMessage.
Browse files Browse the repository at this point in the history
Part of #2855.

PiperOrigin-RevId: 154477854
  • Loading branch information
philwo authored and vladmos committed Apr 27, 2017
1 parent 93aea2e commit 783ad60
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public static final class Builder {
private Path logFile;
private String logText = "";
private int logSizeLimit = Integer.MAX_VALUE;
private Exception exception;

private Builder() {}

Expand Down Expand Up @@ -90,9 +91,22 @@ public Builder logSizeLimit(int logSizeLimit) {
return this;
}

/** Lets the error message contain the details of an exception. */
public Builder exception(Exception e) {
this.exception = e;
return this;
}

/** Builds and returns the formatted error message. */
public ErrorMessage build() {
StringBuilder sb = new StringBuilder(message);

if (exception != null) {
sb.append("\n\n---8<---8<--- Exception details ---8<---8<---\n");
sb.append(Throwables.getStackTraceAsString(exception).trim());
sb.append("\n---8<---8<--- End of exception details ---8<---8<---");
}

if (!logText.isEmpty()) {
sb.append("\n\n---8<---8<--- Start of log");
if (logText.length() > logSizeLimit) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ private void actuallyExec(
String message =
CommandFailureUtils.describeCommandFailure(
verboseFailures, spawn.getArguments(), env, execRoot.getPathString());
throw new UserExecException(ErrorMessage.builder().message(message).build().toString());
throw new UserExecException(
ErrorMessage.builder().message(message).exception(e).build().toString());
}
}

Expand Down Expand Up @@ -296,6 +297,7 @@ private WorkResponse execInWorker(
throw new UserExecException(
ErrorMessage.builder()
.message("IOException while borrowing a worker from the pool:")
.exception(e)
.build()
.toString());
}
Expand All @@ -307,6 +309,7 @@ private WorkResponse execInWorker(
ErrorMessage.builder()
.message("IOException while preparing the execution environment of a worker:")
.logFile(worker.getLogFile())
.exception(e)
.build()
.toString());
}
Expand All @@ -321,6 +324,7 @@ private WorkResponse execInWorker(
"Worker process quit or closed its stdin stream when we tried to send a"
+ " WorkRequest:")
.logFile(worker.getLogFile())
.exception(e)
.build()
.toString());
}
Expand All @@ -340,6 +344,7 @@ private WorkResponse execInWorker(
ErrorMessage.builder()
.message("Worker process returned an unparseable WorkResponse:")
.logText(recordingStream.getRecordedDataAsString())
.exception(e)
.build()
.toString());
}
Expand All @@ -365,6 +370,7 @@ private WorkResponse execInWorker(
throw new UserExecException(
ErrorMessage.builder()
.message("IOException while finishing worker execution:")
.exception(e)
.build()
.toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ private TestResultData execInWorker(
ErrorMessage errorMessage =
ErrorMessage.builder()
.message("Worker process returned an unparseable WorkResponse:")
.exception(e)
.logText(data)
.build();
executor.getEventHandler().handle(Event.warn(errorMessage.toString()));
Expand All @@ -173,15 +174,15 @@ private TestResultData execInWorker(
worker.finishExecution(key);

if (response == null) {
ErrorMessage errorMessage =
throw new UserExecException(
ErrorMessage.builder()
.message(
"Worker process did not return a WorkResponse. This is usually caused by a bug"
+ " in the worker, thus dumping its log file for debugging purposes:")
.logFile(worker.getLogFile())
.logSizeLimit(4096)
.build();
throw new UserExecException(errorMessage.toString());
.build()
.toString());
}

actionExecutionContext.getFileOutErr().getErrorStream().write(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,18 @@ public void testErrorMessageWithUnreadableLogFile() {
+ "java.io.FileNotFoundException: /nope.txt (No such file or directory)\n");
assertThat(errorMessage.toString()).endsWith("---8<---8<--- End of log ---8<---8<---");
}

@Test
public void testErrorMessageWithException() {
ErrorMessage errorMessage =
ErrorMessage.builder()
.message("An exception occurred.")
.exception(new IllegalStateException("Hello World"))
.build();
assertThat(errorMessage.toString())
.startsWith(
"An exception occurred.\n\n"
+ "---8<---8<--- Exception details ---8<---8<---\n"
+ "java.lang.IllegalStateException: Hello World");
}
}

0 comments on commit 783ad60

Please sign in to comment.