From 1d9a2bad845d3b6e7514d7831e5c0833cdb72d09 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 15 Nov 2022 14:59:14 +0200 Subject: [PATCH] Improve error handling - root cause and stack trace delivered to cloud from edge in case of errors --- .../service/edge/rpc/EdgeGrpcSession.java | 2 +- .../server/common/data/EdgeUtils.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index 957c699e32..8ada917234 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -244,7 +244,7 @@ public final class EdgeGrpcSession implements Closeable { @Override public void onFailure(Throwable t) { - String errorMsg = t.getMessage() != null ? t.getMessage() : ""; + String errorMsg = EdgeUtils.createErrorMsgFromRootCauseAndStackTrace(t); UplinkResponseMsg uplinkResponseMsg = UplinkResponseMsg.newBuilder() .setUplinkMsgId(uplinkMsg.getUplinkMsgId()) .setSuccess(false).setErrorMsg(errorMsg).build(); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/EdgeUtils.java b/common/data/src/main/java/org/thingsboard/server/common/data/EdgeUtils.java index 44eff251c7..a60db2108d 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/EdgeUtils.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/EdgeUtils.java @@ -16,6 +16,7 @@ package org.thingsboard.server.common.data; import com.fasterxml.jackson.databind.JsonNode; +import com.google.common.base.Throwables; import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; @@ -29,6 +30,8 @@ import java.util.concurrent.ThreadLocalRandom; @Slf4j public final class EdgeUtils { + private static final int STACK_TRACE_LIMIT = 10; + private EdgeUtils() { } @@ -93,4 +96,20 @@ public final class EdgeUtils { edgeEvent.setBody(body); 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(); + } }