Rule engine transport stats
This commit is contained in:
parent
d40c054ca3
commit
84e391963e
@ -16,7 +16,6 @@
|
|||||||
package org.thingsboard.server.service.transport;
|
package org.thingsboard.server.service.transport;
|
||||||
|
|
||||||
import akka.actor.ActorRef;
|
import akka.actor.ActorRef;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import io.github.bucket4j.Bandwidth;
|
import io.github.bucket4j.Bandwidth;
|
||||||
import io.github.bucket4j.BlockingBucket;
|
import io.github.bucket4j.BlockingBucket;
|
||||||
import io.github.bucket4j.Bucket4j;
|
import io.github.bucket4j.Bucket4j;
|
||||||
@ -30,11 +29,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||||
import org.springframework.context.event.ContextRefreshedEvent;
|
|
||||||
import org.springframework.context.event.EventListener;
|
import org.springframework.context.event.EventListener;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.actors.ActorSystemContext;
|
import org.thingsboard.server.actors.ActorSystemContext;
|
||||||
import org.thingsboard.server.actors.service.ActorService;
|
|
||||||
import org.thingsboard.server.common.msg.cluster.ServerAddress;
|
import org.thingsboard.server.common.msg.cluster.ServerAddress;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos.DeviceActorToTransportMsg;
|
import org.thingsboard.server.gen.transport.TransportProtos.DeviceActorToTransportMsg;
|
||||||
import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
|
import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
|
||||||
@ -44,7 +42,6 @@ import org.thingsboard.server.kafka.TBKafkaConsumerTemplate;
|
|||||||
import org.thingsboard.server.kafka.TBKafkaProducerTemplate;
|
import org.thingsboard.server.kafka.TBKafkaProducerTemplate;
|
||||||
import org.thingsboard.server.kafka.TbKafkaSettings;
|
import org.thingsboard.server.kafka.TbKafkaSettings;
|
||||||
import org.thingsboard.server.kafka.TbNodeIdProvider;
|
import org.thingsboard.server.kafka.TbNodeIdProvider;
|
||||||
import org.thingsboard.server.service.cluster.discovery.DiscoveryService;
|
|
||||||
import org.thingsboard.server.service.cluster.routing.ClusterRoutingService;
|
import org.thingsboard.server.service.cluster.routing.ClusterRoutingService;
|
||||||
import org.thingsboard.server.service.cluster.rpc.ClusterRpcService;
|
import org.thingsboard.server.service.cluster.rpc.ClusterRpcService;
|
||||||
import org.thingsboard.server.service.encoding.DataDecodingEncodingService;
|
import org.thingsboard.server.service.encoding.DataDecodingEncodingService;
|
||||||
@ -83,6 +80,8 @@ public class RemoteRuleEngineTransportService implements RuleEngineTransportServ
|
|||||||
private long pollRecordsPerSecond;
|
private long pollRecordsPerSecond;
|
||||||
@Value("${transport.remote.rule_engine.max_poll_records_per_minute}")
|
@Value("${transport.remote.rule_engine.max_poll_records_per_minute}")
|
||||||
private long pollRecordsPerMinute;
|
private long pollRecordsPerMinute;
|
||||||
|
@Value("${transport.remote.rule_engine.stats.enabled:false}")
|
||||||
|
private boolean statsEnabled;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TbKafkaSettings kafkaSettings;
|
private TbKafkaSettings kafkaSettings;
|
||||||
@ -108,6 +107,8 @@ public class RemoteRuleEngineTransportService implements RuleEngineTransportServ
|
|||||||
|
|
||||||
private volatile boolean stopped = false;
|
private volatile boolean stopped = false;
|
||||||
|
|
||||||
|
private final RuleEngineStats stats = new RuleEngineStats();
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() {
|
public void init() {
|
||||||
TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<ToTransportMsg> notificationsProducerBuilder = TBKafkaProducerTemplate.builder();
|
TBKafkaProducerTemplate.TBKafkaProducerTemplateBuilder<ToTransportMsg> notificationsProducerBuilder = TBKafkaProducerTemplate.builder();
|
||||||
@ -176,6 +177,13 @@ public class RemoteRuleEngineTransportService implements RuleEngineTransportServ
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Scheduled(fixedDelayString = "${transport.remote.rule_engine.stats.print_interval_ms}")
|
||||||
|
public void printStats() {
|
||||||
|
if (statsEnabled) {
|
||||||
|
stats.printStats();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(String nodeId, DeviceActorToTransportMsg msg) {
|
public void process(String nodeId, DeviceActorToTransportMsg msg) {
|
||||||
process(nodeId, msg, null, null);
|
process(nodeId, msg, null, null);
|
||||||
@ -191,6 +199,9 @@ public class RemoteRuleEngineTransportService implements RuleEngineTransportServ
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void forwardToDeviceActor(TransportToDeviceActorMsg toDeviceActorMsg) {
|
private void forwardToDeviceActor(TransportToDeviceActorMsg toDeviceActorMsg) {
|
||||||
|
if (statsEnabled) {
|
||||||
|
stats.log(toDeviceActorMsg);
|
||||||
|
}
|
||||||
TransportToDeviceActorMsgWrapper wrapper = new TransportToDeviceActorMsgWrapper(toDeviceActorMsg);
|
TransportToDeviceActorMsgWrapper wrapper = new TransportToDeviceActorMsgWrapper(toDeviceActorMsg);
|
||||||
Optional<ServerAddress> address = routingService.resolveById(wrapper.getDeviceId());
|
Optional<ServerAddress> address = routingService.resolveById(wrapper.getDeviceId());
|
||||||
if (address.isPresent()) {
|
if (address.isPresent()) {
|
||||||
|
|||||||
@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2019 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.service.transport;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class RuleEngineStats {
|
||||||
|
|
||||||
|
private final AtomicInteger totalCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger sessionEventCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger postTelemetryCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger postAttributesCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger getAttributesCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger subscribeToAttributesCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger subscribeToRPCCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger toDeviceRPCCallResponseCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger toServerRPCCallRequestCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger subscriptionInfoCounter = new AtomicInteger(0);
|
||||||
|
private final AtomicInteger claimDeviceCounter = new AtomicInteger(0);
|
||||||
|
|
||||||
|
public void log(TransportProtos.TransportToDeviceActorMsg msg) {
|
||||||
|
totalCounter.incrementAndGet();
|
||||||
|
if (msg.hasSessionEvent()) {
|
||||||
|
sessionEventCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasPostTelemetry()) {
|
||||||
|
postTelemetryCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasPostAttributes()) {
|
||||||
|
postAttributesCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasGetAttributes()) {
|
||||||
|
getAttributesCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasSubscribeToAttributes()) {
|
||||||
|
subscribeToAttributesCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasSubscribeToRPC()) {
|
||||||
|
subscribeToRPCCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasToDeviceRPCCallResponse()) {
|
||||||
|
toDeviceRPCCallResponseCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasToServerRPCCallRequest()) {
|
||||||
|
toServerRPCCallRequestCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasSubscriptionInfo()) {
|
||||||
|
subscriptionInfoCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
if (msg.hasClaimDevice()) {
|
||||||
|
claimDeviceCounter.incrementAndGet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printStats() {
|
||||||
|
log.info("Transport total [{}] sessionEvents [{}] telemetry [{}] attributes [{}] getAttr [{}] subToAttr [{}] subToRpc [{}] toDevRpc [{}] " +
|
||||||
|
"toServerRpc [{}] subInfo [{}] claimDevice [{}] ",
|
||||||
|
totalCounter.getAndSet(0), sessionEventCounter.getAndSet(0), postTelemetryCounter.getAndSet(0),
|
||||||
|
postAttributesCounter.getAndSet(0), getAttributesCounter.getAndSet(0), subscribeToAttributesCounter.getAndSet(0),
|
||||||
|
subscribeToRPCCounter.getAndSet(0), toDeviceRPCCallResponseCounter.getAndSet(0),
|
||||||
|
toServerRPCCallRequestCounter.getAndSet(0), subscriptionInfoCounter.getAndSet(0), claimDeviceCounter.getAndSet(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -479,6 +479,9 @@ transport:
|
|||||||
poll_records_pack_size: "${TB_RULE_ENGINE_MAX_POLL_RECORDS:1000}"
|
poll_records_pack_size: "${TB_RULE_ENGINE_MAX_POLL_RECORDS:1000}"
|
||||||
max_poll_records_per_second: "${TB_RULE_ENGINE_MAX_POLL_RECORDS_PER_SECOND:10000}"
|
max_poll_records_per_second: "${TB_RULE_ENGINE_MAX_POLL_RECORDS_PER_SECOND:10000}"
|
||||||
max_poll_records_per_minute: "${TB_RULE_ENGINE_MAX_POLL_RECORDS_PER_MINUTE:120000}"
|
max_poll_records_per_minute: "${TB_RULE_ENGINE_MAX_POLL_RECORDS_PER_MINUTE:120000}"
|
||||||
|
stats:
|
||||||
|
enabled: "${TB_RULE_ENGINE_STATS_ENABLED:false}"
|
||||||
|
print_interval_ms: "${TB_RULE_ENGINE_STATS_PRINT_INTERVAL_MS:10000}"
|
||||||
notifications:
|
notifications:
|
||||||
topic: "${TB_TRANSPORT_NOTIFICATIONS_TOPIC:tb.transport.notifications}"
|
topic: "${TB_TRANSPORT_NOTIFICATIONS_TOPIC:tb.transport.notifications}"
|
||||||
sessions:
|
sessions:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user