Improve error handling - root cause and stack trace delivered to cloud from edge in case of errors

This commit is contained in:
Volodymyr Babak 2022-11-15 14:59:14 +02:00
parent 1b191acace
commit 1d9a2bad84
2 changed files with 20 additions and 1 deletions

View File

@ -244,7 +244,7 @@ public final class EdgeGrpcSession implements Closeable {
@Override @Override
public void onFailure(Throwable t) { public void onFailure(Throwable t) {
String errorMsg = t.getMessage() != null ? t.getMessage() : ""; String errorMsg = EdgeUtils.createErrorMsgFromRootCauseAndStackTrace(t);
UplinkResponseMsg uplinkResponseMsg = UplinkResponseMsg.newBuilder() UplinkResponseMsg uplinkResponseMsg = UplinkResponseMsg.newBuilder()
.setUplinkMsgId(uplinkMsg.getUplinkMsgId()) .setUplinkMsgId(uplinkMsg.getUplinkMsgId())
.setSuccess(false).setErrorMsg(errorMsg).build(); .setSuccess(false).setErrorMsg(errorMsg).build();

View File

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data; package org.thingsboard.server.common.data;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.base.Throwables;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventActionType;
@ -29,6 +30,8 @@ import java.util.concurrent.ThreadLocalRandom;
@Slf4j @Slf4j
public final class EdgeUtils { public final class EdgeUtils {
private static final int STACK_TRACE_LIMIT = 10;
private EdgeUtils() { private EdgeUtils() {
} }
@ -93,4 +96,20 @@ public final class EdgeUtils {
edgeEvent.setBody(body); edgeEvent.setBody(body);
return edgeEvent; return edgeEvent;
} }
public static String createErrorMsgFromRootCauseAndStackTrace(Throwable t) {
Throwable rootCause = Throwables.getRootCause(t);
StringBuilder errorMsg = new StringBuilder(rootCause.getMessage() != null ? rootCause.getMessage() : "");
if (rootCause.getStackTrace().length > 0) {
int idx = 0;
for (StackTraceElement stackTraceElement : rootCause.getStackTrace()) {
errorMsg.append("\n").append(stackTraceElement.toString());
idx++;
if (idx > STACK_TRACE_LIMIT) {
break;
}
}
}
return errorMsg.toString();
}
} }