Check alarm status node: log severity DEBUG for "Failed to parse alarm" for known runtime exceptions. The ERROR severity will fire only on unexpected exception types. This will prevent flooding the error logger

This commit is contained in:
Sergey Matvienko 2024-03-25 15:34:57 +01:00
parent 01335e87ee
commit 2efd411a36
3 changed files with 36 additions and 2 deletions

View File

@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsg;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Objects;
@Slf4j @Slf4j
@RuleNode( @RuleNode(
@ -57,7 +58,7 @@ public class TbCheckAlarmStatusNode implements TbNode {
public void onMsg(TbContext ctx, TbMsg msg) throws TbNodeException { public void onMsg(TbContext ctx, TbMsg msg) throws TbNodeException {
try { try {
Alarm alarm = JacksonUtil.fromString(msg.getData(), Alarm.class); Alarm alarm = JacksonUtil.fromString(msg.getData(), Alarm.class);
Objects.requireNonNull(alarm, "alarm is null");
ListenableFuture<Alarm> latest = ctx.getAlarmService().findAlarmByIdAsync(ctx.getTenantId(), alarm.getId()); ListenableFuture<Alarm> latest = ctx.getAlarmService().findAlarmByIdAsync(ctx.getTenantId(), alarm.getId());
Futures.addCallback(latest, new FutureCallback<>() { Futures.addCallback(latest, new FutureCallback<>() {
@ -78,7 +79,11 @@ public class TbCheckAlarmStatusNode implements TbNode {
} }
}, ctx.getDbCallbackExecutor()); }, ctx.getDbCallbackExecutor());
} catch (Exception e) { } catch (Exception e) {
log.error("Failed to parse alarm: [{}]", msg.getData()); if (e instanceof IllegalArgumentException || e instanceof NullPointerException) {
log.debug("Failed to parse alarm: [{}] error [{}]", msg.getData(), e.getMessage());
} else {
log.error("Failed to parse alarm: [{}]", msg.getData(), e);
}
throw new TbNodeException(e); throw new TbNodeException(e);
} }
} }

View File

@ -38,6 +38,7 @@ import org.thingsboard.server.common.msg.TbMsgMetaData;
import java.util.UUID; import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@ -158,6 +159,18 @@ class TbCheckAlarmStatusNodeTest {
assertThat(value).isInstanceOf(TbNodeException.class).hasMessage("No such alarm found."); assertThat(value).isInstanceOf(TbNodeException.class).hasMessage("No such alarm found.");
} }
@Test
void givenUnparseableAlarm_whenOnMsg_then_Failure() {
String msgData = "{\"Number\":1113718,\"id\":8.1}";
TbMsg msg = getTbMsg(msgData);
assertThatThrownBy(() -> node.onMsg(ctx, msg))
.as("onMsg")
.isInstanceOf(TbNodeException.class)
.hasCauseInstanceOf(IllegalArgumentException.class)
.hasMessage("java.lang.IllegalArgumentException: The given string value cannot be transformed to Json object: {\"Number\":1113718,\"id\":8.1}");
}
private TbMsg getTbMsg(String msgData) { private TbMsg getTbMsg(String msgData) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, msgData); return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, msgData);
} }

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.thingsboard.rule.engine.filter.TbCheckAlarmStatusNode" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>