Improved logging of failed and timeout messages
This commit is contained in:
parent
8808c268ae
commit
af1f6229bb
@ -161,7 +161,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
|
|||||||
private TbActorRef createRuleNodeActor(TbActorCtx ctx, RuleNode ruleNode) {
|
private TbActorRef createRuleNodeActor(TbActorCtx ctx, RuleNode ruleNode) {
|
||||||
return ctx.getOrCreateChildActor(new TbEntityActorId(ruleNode.getId()),
|
return ctx.getOrCreateChildActor(new TbEntityActorId(ruleNode.getId()),
|
||||||
() -> DefaultActorService.RULE_DISPATCHER_NAME,
|
() -> DefaultActorService.RULE_DISPATCHER_NAME,
|
||||||
() -> new RuleNodeActor.ActorCreator(systemContext, tenantId, entityId, ruleNode.getName(), ruleNode.getId()));
|
() -> new RuleNodeActor.ActorCreator(systemContext, tenantId, entityId, ruleChainName, ruleNode.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initRoutes(RuleChain ruleChain, List<RuleNode> ruleNodeList) {
|
private void initRoutes(RuleChain ruleChain, List<RuleNode> ruleNodeList) {
|
||||||
|
|||||||
@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
|
|||||||
import org.thingsboard.server.common.data.rule.RuleNode;
|
import org.thingsboard.server.common.data.rule.RuleNode;
|
||||||
import org.thingsboard.server.common.msg.queue.PartitionChangeMsg;
|
import org.thingsboard.server.common.msg.queue.PartitionChangeMsg;
|
||||||
import org.thingsboard.server.common.msg.queue.RuleNodeException;
|
import org.thingsboard.server.common.msg.queue.RuleNodeException;
|
||||||
|
import org.thingsboard.server.common.msg.queue.RuleNodeInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrew Shvayka
|
* @author Andrew Shvayka
|
||||||
@ -38,6 +39,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
|
|||||||
private RuleNode ruleNode;
|
private RuleNode ruleNode;
|
||||||
private TbNode tbNode;
|
private TbNode tbNode;
|
||||||
private DefaultTbContext defaultCtx;
|
private DefaultTbContext defaultCtx;
|
||||||
|
private RuleNodeInfo info;
|
||||||
|
|
||||||
RuleNodeActorMessageProcessor(TenantId tenantId, String ruleChainName, RuleNodeId ruleNodeId, ActorSystemContext systemContext
|
RuleNodeActorMessageProcessor(TenantId tenantId, String ruleChainName, RuleNodeId ruleNodeId, ActorSystemContext systemContext
|
||||||
, TbActorRef parent, TbActorRef self) {
|
, TbActorRef parent, TbActorRef self) {
|
||||||
@ -46,6 +48,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
|
|||||||
this.self = self;
|
this.self = self;
|
||||||
this.ruleNode = systemContext.getRuleChainService().findRuleNodeById(tenantId, entityId);
|
this.ruleNode = systemContext.getRuleChainService().findRuleNodeById(tenantId, entityId);
|
||||||
this.defaultCtx = new DefaultTbContext(systemContext, new RuleNodeCtx(tenantId, parent, self, ruleNode));
|
this.defaultCtx = new DefaultTbContext(systemContext, new RuleNodeCtx(tenantId, parent, self, ruleNode));
|
||||||
|
this.info = new RuleNodeInfo(ruleNodeId, ruleChainName, ruleNode != null ? ruleNode.getName() : "Unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -99,6 +102,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) throws Exception {
|
void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) throws Exception {
|
||||||
|
msg.getMsg().getCallback().visit(info);
|
||||||
checkActive(msg.getMsg());
|
checkActive(msg.getMsg());
|
||||||
if (ruleNode.isDebugMode()) {
|
if (ruleNode.isDebugMode()) {
|
||||||
systemContext.persistDebugInput(tenantId, entityId, msg.getMsg(), msg.getFromRelationType());
|
systemContext.persistDebugInput(tenantId, entityId, msg.getMsg(), msg.getFromRelationType());
|
||||||
|
|||||||
@ -22,11 +22,13 @@ import org.springframework.scheduling.annotation.Scheduled;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.rule.engine.api.RpcError;
|
import org.thingsboard.rule.engine.api.RpcError;
|
||||||
import org.thingsboard.server.actors.ActorSystemContext;
|
import org.thingsboard.server.actors.ActorSystemContext;
|
||||||
|
import org.thingsboard.server.common.data.id.RuleNodeId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.msg.TbActorMsg;
|
import org.thingsboard.server.common.msg.TbActorMsg;
|
||||||
import org.thingsboard.server.common.msg.TbMsg;
|
import org.thingsboard.server.common.msg.TbMsg;
|
||||||
import org.thingsboard.server.common.msg.queue.QueueToRuleEngineMsg;
|
import org.thingsboard.server.common.msg.queue.QueueToRuleEngineMsg;
|
||||||
import org.thingsboard.server.common.msg.queue.RuleEngineException;
|
import org.thingsboard.server.common.msg.queue.RuleEngineException;
|
||||||
|
import org.thingsboard.server.common.msg.queue.RuleNodeInfo;
|
||||||
import org.thingsboard.server.common.msg.queue.ServiceQueue;
|
import org.thingsboard.server.common.msg.queue.ServiceQueue;
|
||||||
import org.thingsboard.server.common.msg.queue.ServiceType;
|
import org.thingsboard.server.common.msg.queue.ServiceType;
|
||||||
import org.thingsboard.server.common.msg.queue.TbCallback;
|
import org.thingsboard.server.common.msg.queue.TbCallback;
|
||||||
@ -59,6 +61,7 @@ import javax.annotation.PreDestroy;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -185,6 +188,12 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService<
|
|||||||
}
|
}
|
||||||
|
|
||||||
TbRuleEngineProcessingResult result = new TbRuleEngineProcessingResult(configuration.getName(), timeout, ctx);
|
TbRuleEngineProcessingResult result = new TbRuleEngineProcessingResult(configuration.getName(), timeout, ctx);
|
||||||
|
if (timeout) {
|
||||||
|
printFirstOrAll(configuration, ctx, ctx.getPendingMap(), "Timeout");
|
||||||
|
}
|
||||||
|
if (!ctx.getFailedMap().isEmpty()) {
|
||||||
|
printFirstOrAll(configuration, ctx, ctx.getFailedMap(), "Failed");
|
||||||
|
}
|
||||||
TbRuleEngineProcessingDecision decision = ackStrategy.analyze(result);
|
TbRuleEngineProcessingDecision decision = ackStrategy.analyze(result);
|
||||||
if (statsEnabled) {
|
if (statsEnabled) {
|
||||||
stats.log(result, decision.isCommit());
|
stats.log(result, decision.isCommit());
|
||||||
@ -212,6 +221,22 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService<
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void printFirstOrAll(TbRuleEngineQueueConfiguration configuration, TbMsgPackProcessingContext ctx, Map<UUID, TbProtoQueueMsg<ToRuleEngineMsg>> map, String prefix) {
|
||||||
|
boolean printAll = log.isTraceEnabled();
|
||||||
|
log.info("{} to process [{}] messages", prefix, map.size());
|
||||||
|
for (Map.Entry<UUID, TbProtoQueueMsg<ToRuleEngineMsg>> pending : map.entrySet()) {
|
||||||
|
ToRuleEngineMsg tmp = pending.getValue().getValue();
|
||||||
|
TbMsg tmpMsg = TbMsg.fromBytes(configuration.getName(), tmp.getTbMsg().toByteArray(), TbMsgCallback.EMPTY);
|
||||||
|
RuleNodeInfo ruleNodeInfo = ctx.getLastVisitedRuleNode(pending.getKey());
|
||||||
|
if (printAll) {
|
||||||
|
log.trace("[{}] {} to process message: {}, Last Rule Node: {}", new TenantId(new UUID(tmp.getTenantIdMSB(), tmp.getTenantIdLSB())), prefix, tmpMsg, ruleNodeInfo);
|
||||||
|
} else {
|
||||||
|
log.info("[{}] {} to process message: {}, Last Rule Node: {}", new TenantId(new UUID(tmp.getTenantIdMSB(), tmp.getTenantIdLSB())), prefix, tmpMsg, ruleNodeInfo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ServiceType getServiceType() {
|
protected ServiceType getServiceType() {
|
||||||
return ServiceType.TB_RULE_ENGINE;
|
return ServiceType.TB_RULE_ENGINE;
|
||||||
|
|||||||
@ -16,8 +16,10 @@
|
|||||||
package org.thingsboard.server.service.queue;
|
package org.thingsboard.server.service.queue;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.thingsboard.server.common.data.id.RuleNodeId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.msg.queue.RuleEngineException;
|
import org.thingsboard.server.common.msg.queue.RuleEngineException;
|
||||||
|
import org.thingsboard.server.common.msg.queue.RuleNodeInfo;
|
||||||
import org.thingsboard.server.common.msg.queue.TbMsgCallback;
|
import org.thingsboard.server.common.msg.queue.TbMsgCallback;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -45,4 +47,10 @@ public class TbMsgPackCallback implements TbMsgCallback {
|
|||||||
log.trace("[{}] ON FAILURE", id, e);
|
log.trace("[{}] ON FAILURE", id, e);
|
||||||
ctx.onFailure(tenantId, id, e);
|
ctx.onFailure(tenantId, id, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(RuleNodeInfo ruleNodeInfo) {
|
||||||
|
log.trace("[{}] ON PROCESS: {}", id, ruleNodeInfo);
|
||||||
|
ctx.visit(id, ruleNodeInfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,8 +16,10 @@
|
|||||||
package org.thingsboard.server.service.queue;
|
package org.thingsboard.server.service.queue;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.thingsboard.server.common.data.id.RuleNodeId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.msg.queue.RuleEngineException;
|
import org.thingsboard.server.common.msg.queue.RuleEngineException;
|
||||||
|
import org.thingsboard.server.common.msg.queue.RuleNodeInfo;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||||
import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy;
|
import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy;
|
||||||
@ -32,7 +34,6 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
public class TbMsgPackProcessingContext {
|
public class TbMsgPackProcessingContext {
|
||||||
|
|
||||||
private final TbRuleEngineSubmitStrategy submitStrategy;
|
private final TbRuleEngineSubmitStrategy submitStrategy;
|
||||||
|
|
||||||
private final AtomicInteger pendingCount;
|
private final AtomicInteger pendingCount;
|
||||||
private final CountDownLatch processingTimeoutLatch = new CountDownLatch(1);
|
private final CountDownLatch processingTimeoutLatch = new CountDownLatch(1);
|
||||||
@Getter
|
@Getter
|
||||||
@ -44,6 +45,8 @@ public class TbMsgPackProcessingContext {
|
|||||||
@Getter
|
@Getter
|
||||||
private final ConcurrentMap<TenantId, RuleEngineException> exceptionsMap = new ConcurrentHashMap<>();
|
private final ConcurrentMap<TenantId, RuleEngineException> exceptionsMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private final ConcurrentMap<UUID, RuleNodeInfo> lastRuleNodeMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public TbMsgPackProcessingContext(TbRuleEngineSubmitStrategy submitStrategy) {
|
public TbMsgPackProcessingContext(TbRuleEngineSubmitStrategy submitStrategy) {
|
||||||
this.submitStrategy = submitStrategy;
|
this.submitStrategy = submitStrategy;
|
||||||
this.pendingMap = submitStrategy.getPendingMap();
|
this.pendingMap = submitStrategy.getPendingMap();
|
||||||
@ -81,4 +84,13 @@ public class TbMsgPackProcessingContext {
|
|||||||
processingTimeoutLatch.countDown();
|
processingTimeoutLatch.countDown();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void visit(UUID id, RuleNodeInfo ruleNodeInfo) {
|
||||||
|
lastRuleNodeMap.put(id, ruleNodeInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RuleNodeInfo getLastVisitedRuleNode(UUID id) {
|
||||||
|
return lastRuleNodeMap.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -106,7 +106,6 @@ public final class TbMsg implements Serializable {
|
|||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
} else {
|
} else {
|
||||||
log.warn("[{}] Created message with empty callback: {}", originator, type);
|
|
||||||
this.callback = TbMsgCallback.EMPTY;
|
this.callback = TbMsgCallback.EMPTY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2020 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.common.msg.queue;
|
||||||
|
|
||||||
|
import org.thingsboard.server.common.data.id.RuleNodeId;
|
||||||
|
|
||||||
|
public class RuleNodeInfo {
|
||||||
|
private final String label;
|
||||||
|
|
||||||
|
public RuleNodeInfo(RuleNodeId id, String ruleChainName, String ruleNodeName) {
|
||||||
|
this.label = "[RuleChain: " + ruleChainName + "|RuleNode: " + ruleNodeName + "(" + id + ")]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -34,4 +34,7 @@ public interface TbMsgCallback {
|
|||||||
|
|
||||||
void onFailure(RuleEngineException e);
|
void onFailure(RuleEngineException e);
|
||||||
|
|
||||||
|
default void visit(RuleNodeInfo ruleNodeInfo) {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user