Added producer stats to 'transport' services
This commit is contained in:
parent
4d7e5add13
commit
1700cf7707
@ -298,18 +298,6 @@
|
||||
<groupId>com.github.ua-parser</groupId>
|
||||
<artifactId>uap-java</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@ -31,6 +31,7 @@ import org.thingsboard.server.queue.TbQueueConsumer;
|
||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.queue.discovery.PartitionChangeEvent;
|
||||
import org.thingsboard.server.queue.provider.TbCoreQueueFactory;
|
||||
import org.thingsboard.server.common.msg.stats.StatsFactory;
|
||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||
import org.thingsboard.server.service.encoding.DataDecodingEncodingService;
|
||||
import org.thingsboard.server.service.queue.processing.AbstractConsumerService;
|
||||
@ -38,7 +39,6 @@ import org.thingsboard.server.service.rpc.FromDeviceRpcResponse;
|
||||
import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService;
|
||||
import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg;
|
||||
import org.thingsboard.server.service.state.DeviceStateService;
|
||||
import org.thingsboard.server.service.stats.StatsCounterFactory;
|
||||
import org.thingsboard.server.service.subscription.SubscriptionManagerService;
|
||||
import org.thingsboard.server.service.subscription.TbLocalSubscriptionService;
|
||||
import org.thingsboard.server.service.subscription.TbSubscriptionUtils;
|
||||
@ -78,14 +78,14 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
|
||||
public DefaultTbCoreConsumerService(TbCoreQueueFactory tbCoreQueueFactory, ActorSystemContext actorContext,
|
||||
DeviceStateService stateService, TbLocalSubscriptionService localSubscriptionService,
|
||||
SubscriptionManagerService subscriptionManagerService, DataDecodingEncodingService encodingService,
|
||||
TbCoreDeviceRpcService tbCoreDeviceRpcService, StatsCounterFactory counterFactory) {
|
||||
TbCoreDeviceRpcService tbCoreDeviceRpcService, StatsFactory statsFactory) {
|
||||
super(actorContext, encodingService, tbCoreQueueFactory.createToCoreNotificationsMsgConsumer());
|
||||
this.mainConsumer = tbCoreQueueFactory.createToCoreMsgConsumer();
|
||||
this.stateService = stateService;
|
||||
this.localSubscriptionService = localSubscriptionService;
|
||||
this.subscriptionManagerService = subscriptionManagerService;
|
||||
this.tbCoreDeviceRpcService = tbCoreDeviceRpcService;
|
||||
this.stats = new TbCoreConsumerStats(counterFactory);
|
||||
this.stats = new TbCoreConsumerStats(statsFactory);
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
|
||||
@ -42,6 +42,7 @@ import org.thingsboard.server.queue.discovery.PartitionChangeEvent;
|
||||
import org.thingsboard.server.queue.provider.TbRuleEngineQueueFactory;
|
||||
import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings;
|
||||
import org.thingsboard.server.queue.settings.TbRuleEngineQueueConfiguration;
|
||||
import org.thingsboard.server.common.msg.stats.StatsFactory;
|
||||
import org.thingsboard.server.queue.util.TbRuleEngineComponent;
|
||||
import org.thingsboard.server.service.encoding.DataDecodingEncodingService;
|
||||
import org.thingsboard.server.service.queue.processing.AbstractConsumerService;
|
||||
@ -54,7 +55,6 @@ import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrateg
|
||||
import org.thingsboard.server.service.rpc.FromDeviceRpcResponse;
|
||||
import org.thingsboard.server.service.rpc.TbRuleEngineDeviceRpcService;
|
||||
import org.thingsboard.server.service.stats.RuleEngineStatisticsService;
|
||||
import org.thingsboard.server.service.stats.StatsCounterFactory;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
@ -83,7 +83,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService<
|
||||
@Value("${queue.rule-engine.stats.enabled:true}")
|
||||
private boolean statsEnabled;
|
||||
|
||||
private final StatsCounterFactory counterFactory;
|
||||
private final StatsFactory statsFactory;
|
||||
private final TbRuleEngineSubmitStrategyFactory submitStrategyFactory;
|
||||
private final TbRuleEngineProcessingStrategyFactory processingStrategyFactory;
|
||||
private final TbRuleEngineQueueFactory tbRuleEngineQueueFactory;
|
||||
@ -101,7 +101,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService<
|
||||
TbRuleEngineQueueFactory tbRuleEngineQueueFactory, RuleEngineStatisticsService statisticsService,
|
||||
ActorSystemContext actorContext, DataDecodingEncodingService encodingService,
|
||||
TbRuleEngineDeviceRpcService tbDeviceRpcService,
|
||||
StatsCounterFactory counterFactory) {
|
||||
StatsFactory statsFactory) {
|
||||
super(actorContext, encodingService, tbRuleEngineQueueFactory.createToRuleEngineNotificationsMsgConsumer());
|
||||
this.statisticsService = statisticsService;
|
||||
this.ruleEngineSettings = ruleEngineSettings;
|
||||
@ -109,7 +109,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService<
|
||||
this.submitStrategyFactory = submitStrategyFactory;
|
||||
this.processingStrategyFactory = processingStrategyFactory;
|
||||
this.tbDeviceRpcService = tbDeviceRpcService;
|
||||
this.counterFactory = counterFactory;
|
||||
this.statsFactory = statsFactory;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
@ -118,7 +118,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService<
|
||||
for (TbRuleEngineQueueConfiguration configuration : ruleEngineSettings.getQueues()) {
|
||||
consumerConfigurations.putIfAbsent(configuration.getName(), configuration);
|
||||
consumers.computeIfAbsent(configuration.getName(), queueName -> tbRuleEngineQueueFactory.createToRuleEngineMsgConsumer(configuration));
|
||||
consumerStats.put(configuration.getName(), new TbRuleEngineConsumerStats(configuration.getName(), counterFactory));
|
||||
consumerStats.put(configuration.getName(), new TbRuleEngineConsumerStats(configuration.getName(), statsFactory));
|
||||
}
|
||||
submitExecutor = Executors.newSingleThreadExecutor();
|
||||
}
|
||||
|
||||
@ -17,12 +17,11 @@ package org.thingsboard.server.service.queue;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.service.stats.StatsCounter;
|
||||
import org.thingsboard.server.service.stats.StatsCounterFactory;
|
||||
import org.thingsboard.server.service.stats.StatsType;
|
||||
import org.thingsboard.server.common.msg.stats.StatsCounter;
|
||||
import org.thingsboard.server.common.msg.stats.StatsFactory;
|
||||
import org.thingsboard.server.common.msg.stats.StatsType;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@Slf4j
|
||||
public class TbCoreConsumerStats {
|
||||
@ -53,20 +52,20 @@ public class TbCoreConsumerStats {
|
||||
|
||||
private final List<StatsCounter> counters = new ArrayList<>();
|
||||
|
||||
public TbCoreConsumerStats(StatsCounterFactory counterFactory) {
|
||||
public TbCoreConsumerStats(StatsFactory statsFactory) {
|
||||
String statsKey = StatsType.CORE.getName();
|
||||
|
||||
this.totalCounter = counterFactory.createStatsCounter(statsKey, TOTAL_MSGS);
|
||||
this.sessionEventCounter = counterFactory.createStatsCounter(statsKey, SESSION_EVENTS);
|
||||
this.getAttributesCounter = counterFactory.createStatsCounter(statsKey, GET_ATTRIBUTE);
|
||||
this.subscribeToAttributesCounter = counterFactory.createStatsCounter(statsKey, ATTRIBUTE_SUBSCRIBES);
|
||||
this.subscribeToRPCCounter = counterFactory.createStatsCounter(statsKey, RPC_SUBSCRIBES);
|
||||
this.toDeviceRPCCallResponseCounter = counterFactory.createStatsCounter(statsKey, TO_DEVICE_RPC_CALL_RESPONSES);
|
||||
this.subscriptionInfoCounter = counterFactory.createStatsCounter(statsKey, SUBSCRIPTION_INFO);
|
||||
this.claimDeviceCounter = counterFactory.createStatsCounter(statsKey, DEVICE_CLAIMS);
|
||||
this.deviceStateCounter = counterFactory.createStatsCounter(statsKey, DEVICE_STATES);
|
||||
this.subscriptionMsgCounter = counterFactory.createStatsCounter(statsKey, SUBSCRIPTION_MSGS);
|
||||
this.toCoreNotificationsCounter = counterFactory.createStatsCounter(statsKey, TO_CORE_NOTIFICATIONS);
|
||||
this.totalCounter = statsFactory.createStatsCounter(statsKey, TOTAL_MSGS);
|
||||
this.sessionEventCounter = statsFactory.createStatsCounter(statsKey, SESSION_EVENTS);
|
||||
this.getAttributesCounter = statsFactory.createStatsCounter(statsKey, GET_ATTRIBUTE);
|
||||
this.subscribeToAttributesCounter = statsFactory.createStatsCounter(statsKey, ATTRIBUTE_SUBSCRIBES);
|
||||
this.subscribeToRPCCounter = statsFactory.createStatsCounter(statsKey, RPC_SUBSCRIBES);
|
||||
this.toDeviceRPCCallResponseCounter = statsFactory.createStatsCounter(statsKey, TO_DEVICE_RPC_CALL_RESPONSES);
|
||||
this.subscriptionInfoCounter = statsFactory.createStatsCounter(statsKey, SUBSCRIPTION_INFO);
|
||||
this.claimDeviceCounter = statsFactory.createStatsCounter(statsKey, DEVICE_CLAIMS);
|
||||
this.deviceStateCounter = statsFactory.createStatsCounter(statsKey, DEVICE_STATES);
|
||||
this.subscriptionMsgCounter = statsFactory.createStatsCounter(statsKey, SUBSCRIPTION_MSGS);
|
||||
this.toCoreNotificationsCounter = statsFactory.createStatsCounter(statsKey, TO_CORE_NOTIFICATIONS);
|
||||
|
||||
|
||||
counters.add(totalCounter);
|
||||
|
||||
@ -15,21 +15,19 @@
|
||||
*/
|
||||
package org.thingsboard.server.service.queue;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.msg.queue.RuleEngineException;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
|
||||
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
|
||||
import org.thingsboard.server.common.msg.stats.StatsFactory;
|
||||
import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingResult;
|
||||
import org.thingsboard.server.service.stats.StatsCounter;
|
||||
import org.thingsboard.server.service.stats.StatsCounterFactory;
|
||||
import org.thingsboard.server.service.stats.StatsType;
|
||||
import org.thingsboard.server.common.msg.stats.StatsCounter;
|
||||
import org.thingsboard.server.common.msg.stats.StatsType;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@Slf4j
|
||||
public class TbRuleEngineConsumerStats {
|
||||
@ -60,18 +58,18 @@ public class TbRuleEngineConsumerStats {
|
||||
|
||||
private final String queueName;
|
||||
|
||||
public TbRuleEngineConsumerStats(String queueName, StatsCounterFactory counterFactory) {
|
||||
public TbRuleEngineConsumerStats(String queueName, StatsFactory statsFactory) {
|
||||
this.queueName = queueName;
|
||||
|
||||
String statsKey = StatsType.RULE_ENGINE.getName() + "." + queueName;
|
||||
this.totalMsgCounter = counterFactory.createStatsCounter(statsKey, TOTAL_MSGS);
|
||||
this.successMsgCounter = counterFactory.createStatsCounter(statsKey, SUCCESSFUL_MSGS);
|
||||
this.timeoutMsgCounter = counterFactory.createStatsCounter(statsKey, TIMEOUT_MSGS);
|
||||
this.failedMsgCounter = counterFactory.createStatsCounter(statsKey, FAILED_MSGS);
|
||||
this.tmpTimeoutMsgCounter = counterFactory.createStatsCounter(statsKey, TMP_TIMEOUT);
|
||||
this.tmpFailedMsgCounter = counterFactory.createStatsCounter(statsKey, TMP_FAILED);
|
||||
this.successIterationsCounter = counterFactory.createStatsCounter(statsKey, SUCCESSFUL_ITERATIONS);
|
||||
this.failedIterationsCounter = counterFactory.createStatsCounter(statsKey, FAILED_ITERATIONS);
|
||||
this.totalMsgCounter = statsFactory.createStatsCounter(statsKey, TOTAL_MSGS);
|
||||
this.successMsgCounter = statsFactory.createStatsCounter(statsKey, SUCCESSFUL_MSGS);
|
||||
this.timeoutMsgCounter = statsFactory.createStatsCounter(statsKey, TIMEOUT_MSGS);
|
||||
this.failedMsgCounter = statsFactory.createStatsCounter(statsKey, FAILED_MSGS);
|
||||
this.tmpTimeoutMsgCounter = statsFactory.createStatsCounter(statsKey, TMP_TIMEOUT);
|
||||
this.tmpFailedMsgCounter = statsFactory.createStatsCounter(statsKey, TMP_FAILED);
|
||||
this.successIterationsCounter = statsFactory.createStatsCounter(statsKey, SUCCESSFUL_ITERATIONS);
|
||||
this.failedIterationsCounter = statsFactory.createStatsCounter(statsKey, FAILED_ITERATIONS);
|
||||
|
||||
counters.add(totalMsgCounter);
|
||||
counters.add(successMsgCounter);
|
||||
|
||||
@ -18,6 +18,9 @@ package org.thingsboard.server.service.stats;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.actors.JsInvokeStats;
|
||||
import org.thingsboard.server.common.msg.stats.StatsCounter;
|
||||
import org.thingsboard.server.common.msg.stats.StatsFactory;
|
||||
import org.thingsboard.server.common.msg.stats.StatsType;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
@ -32,14 +35,14 @@ public class DefaultJsInvokeStats implements JsInvokeStats {
|
||||
private StatsCounter failuresCounter;
|
||||
|
||||
@Autowired
|
||||
private StatsCounterFactory counterFactory;
|
||||
private StatsFactory statsFactory;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
String key = StatsType.JS_INVOKE.getName();
|
||||
this.requestsCounter = counterFactory.createStatsCounter(key, REQUESTS);
|
||||
this.responsesCounter = counterFactory.createStatsCounter(key, RESPONSES);
|
||||
this.failuresCounter = counterFactory.createStatsCounter(key, FAILURES);
|
||||
this.requestsCounter = statsFactory.createStatsCounter(key, REQUESTS);
|
||||
this.responsesCounter = statsFactory.createStatsCounter(key, RESPONSES);
|
||||
this.failuresCounter = statsFactory.createStatsCounter(key, FAILURES);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -20,6 +20,9 @@ import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.common.msg.stats.MessagesStats;
|
||||
import org.thingsboard.server.common.msg.stats.StatsFactory;
|
||||
import org.thingsboard.server.common.msg.stats.StatsType;
|
||||
import org.thingsboard.server.queue.TbQueueConsumer;
|
||||
import org.thingsboard.server.queue.TbQueueProducer;
|
||||
import org.thingsboard.server.queue.TbQueueResponseTemplate;
|
||||
@ -29,10 +32,6 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestM
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponseMsg;
|
||||
import org.thingsboard.server.queue.provider.TbCoreQueueFactory;
|
||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||
import org.thingsboard.server.service.stats.DefaultQueueStats;
|
||||
import org.thingsboard.server.service.stats.StatsCounter;
|
||||
import org.thingsboard.server.service.stats.StatsCounterFactory;
|
||||
import org.thingsboard.server.service.stats.StatsType;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
@ -45,13 +44,9 @@ import java.util.concurrent.*;
|
||||
@Service
|
||||
@TbCoreComponent
|
||||
public class TbCoreTransportApiService {
|
||||
private static final String TOTAL_MSGS = "totalMsgs";
|
||||
private static final String SUCCESSFUL_MSGS = "successfulMsgs";
|
||||
private static final String FAILED_MSGS = "failedMsgs";
|
||||
|
||||
private final TbCoreQueueFactory tbCoreQueueFactory;
|
||||
private final TransportApiService transportApiService;
|
||||
private final StatsCounterFactory counterFactory;
|
||||
private final StatsFactory statsFactory;
|
||||
|
||||
@Value("${queue.transport_api.max_pending_requests:10000}")
|
||||
private int maxPendingRequests;
|
||||
@ -66,10 +61,10 @@ public class TbCoreTransportApiService {
|
||||
private TbQueueResponseTemplate<TbProtoQueueMsg<TransportApiRequestMsg>,
|
||||
TbProtoQueueMsg<TransportApiResponseMsg>> transportApiTemplate;
|
||||
|
||||
public TbCoreTransportApiService(TbCoreQueueFactory tbCoreQueueFactory, TransportApiService transportApiService, StatsCounterFactory counterFactory) {
|
||||
public TbCoreTransportApiService(TbCoreQueueFactory tbCoreQueueFactory, TransportApiService transportApiService, StatsFactory statsFactory) {
|
||||
this.tbCoreQueueFactory = tbCoreQueueFactory;
|
||||
this.transportApiService = transportApiService;
|
||||
this.counterFactory = counterFactory;
|
||||
this.statsFactory = statsFactory;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
@ -79,10 +74,7 @@ public class TbCoreTransportApiService {
|
||||
TbQueueConsumer<TbProtoQueueMsg<TransportApiRequestMsg>> consumer = tbCoreQueueFactory.createTransportApiRequestConsumer();
|
||||
|
||||
String key = StatsType.TRANSPORT.getName();
|
||||
StatsCounter totalCounter = counterFactory.createStatsCounter(key, TOTAL_MSGS);
|
||||
StatsCounter successfulCounter = counterFactory.createStatsCounter(key, SUCCESSFUL_MSGS);
|
||||
StatsCounter failedCounter = counterFactory.createStatsCounter(key, FAILED_MSGS);
|
||||
DefaultQueueStats queueStats = new DefaultQueueStats(totalCounter, successfulCounter, failedCounter);
|
||||
MessagesStats queueStats = statsFactory.createMessagesStats(key);
|
||||
|
||||
DefaultTbQueueResponseTemplate.DefaultTbQueueResponseTemplateBuilder
|
||||
<TbProtoQueueMsg<TransportApiRequestMsg>, TbProtoQueueMsg<TransportApiResponseMsg>> builder = DefaultTbQueueResponseTemplate.builder();
|
||||
|
||||
@ -69,6 +69,21 @@
|
||||
<artifactId>protobuf-java</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!--TODO is this a good idea to put actuator here?-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
|
||||
@ -13,16 +13,14 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.stats;
|
||||
package org.thingsboard.server.common.msg.stats;
|
||||
|
||||
import org.thingsboard.server.queue.stats.QueueStats;
|
||||
|
||||
public class DefaultQueueStats implements QueueStats {
|
||||
public class DefaultMessagesStats implements MessagesStats {
|
||||
private final StatsCounter totalCounter;
|
||||
private final StatsCounter successfulCounter;
|
||||
private final StatsCounter failedCounter;
|
||||
|
||||
public DefaultQueueStats(StatsCounter totalCounter, StatsCounter successfulCounter, StatsCounter failedCounter) {
|
||||
public DefaultMessagesStats(StatsCounter totalCounter, StatsCounter successfulCounter, StatsCounter failedCounter) {
|
||||
this.totalCounter = totalCounter;
|
||||
this.successfulCounter = successfulCounter;
|
||||
this.failedCounter = failedCounter;
|
||||
@ -13,19 +13,22 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.stats;
|
||||
package org.thingsboard.server.common.msg.stats;
|
||||
|
||||
import io.micrometer.core.instrument.Counter;
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.service.metrics.StubCounter;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@Service
|
||||
public class StatsCounterFactory {
|
||||
public class DefaultStatsFactory implements StatsFactory {
|
||||
private static final String TOTAL_MSGS = "totalMsgs";
|
||||
private static final String SUCCESSFUL_MSGS = "successfulMsgs";
|
||||
private static final String FAILED_MSGS = "failedMsgs";
|
||||
|
||||
private static final String STATS_NAME_TAG = "statsName";
|
||||
|
||||
private static final Counter STUB_COUNTER = new StubCounter();
|
||||
@ -33,9 +36,10 @@ public class StatsCounterFactory {
|
||||
@Autowired
|
||||
private MeterRegistry meterRegistry;
|
||||
|
||||
@Value("${metrics.enabled}")
|
||||
@Value("${metrics.enabled:false}")
|
||||
private Boolean metricsEnabled;
|
||||
|
||||
@Override
|
||||
public StatsCounter createStatsCounter(String key, String statsName) {
|
||||
return new StatsCounter(
|
||||
new AtomicInteger(0),
|
||||
@ -45,4 +49,27 @@ public class StatsCounterFactory {
|
||||
statsName
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessagesStats createMessagesStats(String key) {
|
||||
StatsCounter totalCounter = createStatsCounter(key, TOTAL_MSGS);
|
||||
StatsCounter successfulCounter = createStatsCounter(key, SUCCESSFUL_MSGS);
|
||||
StatsCounter failedCounter = createStatsCounter(key, FAILED_MSGS);
|
||||
return new DefaultMessagesStats(totalCounter, successfulCounter, failedCounter);
|
||||
}
|
||||
|
||||
private static class StubCounter implements Counter {
|
||||
@Override
|
||||
public void increment(double amount) {}
|
||||
|
||||
@Override
|
||||
public double count() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Id getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -13,9 +13,9 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.queue.stats;
|
||||
package org.thingsboard.server.common.msg.stats;
|
||||
|
||||
public interface QueueStats {
|
||||
public interface MessagesStats {
|
||||
default void incrementTotal() {
|
||||
incrementTotal(1);
|
||||
}
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.stats;
|
||||
package org.thingsboard.server.common.msg.stats;
|
||||
|
||||
import io.micrometer.core.instrument.Counter;
|
||||
|
||||
@ -13,21 +13,10 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.metrics;
|
||||
package org.thingsboard.server.common.msg.stats;
|
||||
|
||||
import io.micrometer.core.instrument.Counter;
|
||||
public interface StatsFactory {
|
||||
StatsCounter createStatsCounter(String key, String statsName);
|
||||
|
||||
public class StubCounter implements Counter {
|
||||
@Override
|
||||
public void increment(double amount) {}
|
||||
|
||||
@Override
|
||||
public double count() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Id getId() {
|
||||
return null;
|
||||
}
|
||||
MessagesStats createMessagesStats(String key);
|
||||
}
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.service.stats;
|
||||
package org.thingsboard.server.common.msg.stats;
|
||||
|
||||
public enum StatsType {
|
||||
RULE_ENGINE("ruleEngine"), CORE("core"), TRANSPORT("transport"), JS_INVOKE("jsInvoke");
|
||||
@ -112,6 +112,7 @@
|
||||
<groupId>org.apache.curator</groupId>
|
||||
<artifactId>curator-recipes</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package org.thingsboard.server.queue;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import org.thingsboard.server.common.msg.stats.MessagesStats;
|
||||
|
||||
public interface TbQueueRequestTemplate<Request extends TbQueueMsg, Response extends TbQueueMsg> {
|
||||
|
||||
@ -25,4 +26,5 @@ public interface TbQueueRequestTemplate<Request extends TbQueueMsg, Response ext
|
||||
|
||||
void stop();
|
||||
|
||||
void setMessagesStats(MessagesStats messagesStats);
|
||||
}
|
||||
|
||||
@ -28,6 +28,7 @@ import org.thingsboard.server.queue.TbQueueMsg;
|
||||
import org.thingsboard.server.queue.TbQueueMsgMetadata;
|
||||
import org.thingsboard.server.queue.TbQueueProducer;
|
||||
import org.thingsboard.server.queue.TbQueueRequestTemplate;
|
||||
import org.thingsboard.server.common.msg.stats.MessagesStats;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
@ -54,6 +55,8 @@ public class DefaultTbQueueRequestTemplate<Request extends TbQueueMsg, Response
|
||||
private volatile long tickSize = 0L;
|
||||
private volatile boolean stopped = false;
|
||||
|
||||
private MessagesStats messagesStats;
|
||||
|
||||
@Builder
|
||||
public DefaultTbQueueRequestTemplate(TbQueueAdmin queueAdmin,
|
||||
TbQueueProducer<Request> requestTemplate,
|
||||
@ -153,6 +156,11 @@ public class DefaultTbQueueRequestTemplate<Request extends TbQueueMsg, Response
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMessagesStats(MessagesStats messagesStats) {
|
||||
this.messagesStats = messagesStats;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenableFuture<Response> send(Request request) {
|
||||
if (tickSize > maxPendingRequests) {
|
||||
@ -166,14 +174,17 @@ public class DefaultTbQueueRequestTemplate<Request extends TbQueueMsg, Response
|
||||
ResponseMetaData<Response> responseMetaData = new ResponseMetaData<>(tickTs + maxRequestTimeout, future);
|
||||
pendingRequests.putIfAbsent(requestId, responseMetaData);
|
||||
log.trace("[{}] Sending request, key [{}], expTime [{}]", requestId, request.getKey(), responseMetaData.expTime);
|
||||
if (messagesStats != null) messagesStats.incrementTotal();
|
||||
requestTemplate.send(TopicPartitionInfo.builder().topic(requestTemplate.getDefaultTopic()).build(), request, new TbQueueCallback() {
|
||||
@Override
|
||||
public void onSuccess(TbQueueMsgMetadata metadata) {
|
||||
if (messagesStats != null) messagesStats.incrementSuccessful();
|
||||
log.trace("[{}] Request sent: {}", requestId, metadata);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable t) {
|
||||
if (messagesStats != null) messagesStats.incrementFailed();
|
||||
pendingRequests.remove(requestId);
|
||||
future.setException(t);
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ import org.thingsboard.server.queue.TbQueueHandler;
|
||||
import org.thingsboard.server.queue.TbQueueMsg;
|
||||
import org.thingsboard.server.queue.TbQueueProducer;
|
||||
import org.thingsboard.server.queue.TbQueueResponseTemplate;
|
||||
import org.thingsboard.server.queue.stats.QueueStats;
|
||||
import org.thingsboard.server.common.msg.stats.MessagesStats;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
@ -45,7 +45,7 @@ public class DefaultTbQueueResponseTemplate<Request extends TbQueueMsg, Response
|
||||
private final ExecutorService loopExecutor;
|
||||
private final ScheduledExecutorService timeoutExecutor;
|
||||
private final ExecutorService callbackExecutor;
|
||||
private final QueueStats stats;
|
||||
private final MessagesStats stats;
|
||||
private final int maxPendingRequests;
|
||||
private final long requestTimeout;
|
||||
|
||||
@ -61,7 +61,7 @@ public class DefaultTbQueueResponseTemplate<Request extends TbQueueMsg, Response
|
||||
long requestTimeout,
|
||||
int maxPendingRequests,
|
||||
ExecutorService executor,
|
||||
QueueStats stats) {
|
||||
MessagesStats stats) {
|
||||
this.requestTemplate = requestTemplate;
|
||||
this.responseTemplate = responseTemplate;
|
||||
this.pendingRequests = new ConcurrentHashMap<>();
|
||||
|
||||
@ -55,6 +55,9 @@ import org.thingsboard.server.queue.discovery.PartitionService;
|
||||
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
||||
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
|
||||
import org.thingsboard.server.queue.provider.TbTransportQueueFactory;
|
||||
import org.thingsboard.server.common.msg.stats.MessagesStats;
|
||||
import org.thingsboard.server.common.msg.stats.StatsFactory;
|
||||
import org.thingsboard.server.common.msg.stats.StatsType;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
@ -101,12 +104,17 @@ public class DefaultTransportService implements TransportService {
|
||||
private final TbQueueProducerProvider producerProvider;
|
||||
private final PartitionService partitionService;
|
||||
private final TbServiceInfoProvider serviceInfoProvider;
|
||||
private final StatsFactory statsFactory;
|
||||
|
||||
protected TbQueueRequestTemplate<TbProtoQueueMsg<TransportApiRequestMsg>, TbProtoQueueMsg<TransportApiResponseMsg>> transportApiRequestTemplate;
|
||||
protected TbQueueProducer<TbProtoQueueMsg<ToRuleEngineMsg>> ruleEngineMsgProducer;
|
||||
protected TbQueueProducer<TbProtoQueueMsg<ToCoreMsg>> tbCoreMsgProducer;
|
||||
protected TbQueueConsumer<TbProtoQueueMsg<ToTransportMsg>> transportNotificationsConsumer;
|
||||
|
||||
protected MessagesStats ruleEngineProducerStats;
|
||||
protected MessagesStats tbCoreProducerStats;
|
||||
protected MessagesStats transportApiStats;
|
||||
|
||||
protected ScheduledExecutorService schedulerExecutor;
|
||||
protected ExecutorService transportCallbackExecutor;
|
||||
|
||||
@ -119,11 +127,12 @@ public class DefaultTransportService implements TransportService {
|
||||
private ExecutorService mainConsumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("transport-consumer"));
|
||||
private volatile boolean stopped = false;
|
||||
|
||||
public DefaultTransportService(TbServiceInfoProvider serviceInfoProvider, TbTransportQueueFactory queueProvider, TbQueueProducerProvider producerProvider, PartitionService partitionService) {
|
||||
public DefaultTransportService(TbServiceInfoProvider serviceInfoProvider, TbTransportQueueFactory queueProvider, TbQueueProducerProvider producerProvider, PartitionService partitionService, StatsFactory statsFactory) {
|
||||
this.serviceInfoProvider = serviceInfoProvider;
|
||||
this.queueProvider = queueProvider;
|
||||
this.producerProvider = producerProvider;
|
||||
this.partitionService = partitionService;
|
||||
this.statsFactory = statsFactory;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
@ -133,10 +142,14 @@ public class DefaultTransportService implements TransportService {
|
||||
new TbRateLimits(perTenantLimitsConf);
|
||||
new TbRateLimits(perDevicesLimitsConf);
|
||||
}
|
||||
this.ruleEngineProducerStats = statsFactory.createMessagesStats(StatsType.RULE_ENGINE.getName() + ".producer");
|
||||
this.tbCoreProducerStats = statsFactory.createMessagesStats(StatsType.CORE.getName() + ".producer");
|
||||
this.transportApiStats = statsFactory.createMessagesStats(StatsType.TRANSPORT.getName() + ".producer");
|
||||
this.schedulerExecutor = Executors.newSingleThreadScheduledExecutor(ThingsBoardThreadFactory.forName("transport-scheduler"));
|
||||
this.transportCallbackExecutor = Executors.newWorkStealingPool(20);
|
||||
this.schedulerExecutor.scheduleAtFixedRate(this::checkInactivityAndReportActivity, new Random().nextInt((int) sessionReportTimeout), sessionReportTimeout, TimeUnit.MILLISECONDS);
|
||||
transportApiRequestTemplate = queueProvider.createTransportApiRequestTemplate();
|
||||
transportApiRequestTemplate.setMessagesStats(transportApiStats);
|
||||
ruleEngineMsgProducer = producerProvider.getRuleEngineMsgProducer();
|
||||
tbCoreMsgProducer = producerProvider.getTbCoreMsgProducer();
|
||||
transportNotificationsConsumer = queueProvider.createTransportNotificationsConsumer();
|
||||
@ -557,10 +570,14 @@ public class DefaultTransportService implements TransportService {
|
||||
if (log.isTraceEnabled()) {
|
||||
log.trace("[{}][{}] Pushing to topic {} message {}", getTenantId(sessionInfo), getDeviceId(sessionInfo), tpi.getFullTopicName(), toDeviceActorMsg);
|
||||
}
|
||||
TransportTbQueueCallback transportTbQueueCallback = callback != null ?
|
||||
new TransportTbQueueCallback(callback) : null;
|
||||
tbCoreProducerStats.incrementTotal();
|
||||
StatsCallback wrappedCallback = new StatsCallback(transportTbQueueCallback, tbCoreProducerStats);
|
||||
tbCoreMsgProducer.send(tpi,
|
||||
new TbProtoQueueMsg<>(getRoutingKey(sessionInfo),
|
||||
ToCoreMsg.newBuilder().setToDeviceActorMsg(toDeviceActorMsg).build()), callback != null ?
|
||||
new TransportTbQueueCallback(callback) : null);
|
||||
ToCoreMsg.newBuilder().setToDeviceActorMsg(toDeviceActorMsg).build()),
|
||||
wrappedCallback);
|
||||
}
|
||||
|
||||
protected void sendToRuleEngine(TenantId tenantId, TbMsg tbMsg, TbQueueCallback callback) {
|
||||
@ -571,7 +588,9 @@ public class DefaultTransportService implements TransportService {
|
||||
ToRuleEngineMsg msg = ToRuleEngineMsg.newBuilder().setTbMsg(TbMsg.toByteString(tbMsg))
|
||||
.setTenantIdMSB(tenantId.getId().getMostSignificantBits())
|
||||
.setTenantIdLSB(tenantId.getId().getLeastSignificantBits()).build();
|
||||
ruleEngineMsgProducer.send(tpi, new TbProtoQueueMsg<>(tbMsg.getId(), msg), callback);
|
||||
ruleEngineProducerStats.incrementTotal();
|
||||
StatsCallback wrappedCallback = new StatsCallback(callback, ruleEngineProducerStats);
|
||||
ruleEngineMsgProducer.send(tpi, new TbProtoQueueMsg<>(tbMsg.getId(), msg), wrappedCallback);
|
||||
}
|
||||
|
||||
private class TransportTbQueueCallback implements TbQueueCallback {
|
||||
@ -592,6 +611,30 @@ public class DefaultTransportService implements TransportService {
|
||||
}
|
||||
}
|
||||
|
||||
private class StatsCallback implements TbQueueCallback {
|
||||
private final TbQueueCallback callback;
|
||||
private final MessagesStats stats;
|
||||
|
||||
private StatsCallback(TbQueueCallback callback, MessagesStats stats) {
|
||||
this.callback = callback;
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(TbQueueMsgMetadata metadata) {
|
||||
stats.incrementSuccessful();
|
||||
if (callback != null)
|
||||
callback.onSuccess(metadata);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable t) {
|
||||
stats.incrementFailed();
|
||||
if (callback != null)
|
||||
callback.onFailure(t);
|
||||
}
|
||||
}
|
||||
|
||||
private class MsgPackCallback implements TbQueueCallback {
|
||||
private final AtomicInteger msgCount;
|
||||
private final TransportServiceCallback<Void> callback;
|
||||
|
||||
@ -14,8 +14,16 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
spring.main.web-environment: false
|
||||
spring.main.web-application-type: none
|
||||
# If you enabled process metrics you should also enable 'web-environment'.
|
||||
spring.main.web-environment: "${WEB_APPLICATION_ENABLE:false}"
|
||||
# If you enabled process metrics you should set 'web-application-type' to 'servlet' value.
|
||||
spring.main.web-application-type: "${WEB_APPLICATION_TYPE:none}"
|
||||
|
||||
server:
|
||||
# Server bind address (has no effect if web-environment is disabled).
|
||||
address: "${HTTP_BIND_ADDRESS:0.0.0.0}"
|
||||
# Server bind port (has no effect if web-environment is disabled).
|
||||
port: "${HTTP_BIND_PORT:8083}"
|
||||
|
||||
# Zookeeper connection parameters. Used for service discovery.
|
||||
zk:
|
||||
@ -211,4 +219,16 @@ service:
|
||||
type: "${TB_SERVICE_TYPE:tb-transport}"
|
||||
# Unique id for this service (autogenerated if empty)
|
||||
id: "${TB_SERVICE_ID:}"
|
||||
tenant_id: "${TB_SERVICE_TENANT_ID:}" # empty or specific tenant id.
|
||||
tenant_id: "${TB_SERVICE_TENANT_ID:}" # empty or specific tenant id.
|
||||
|
||||
|
||||
metrics:
|
||||
# Enable/disable actuator metrics.
|
||||
enabled: "${METRICS_ENABLED:false}"
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
# Expose metrics endpoint (use value 'prometheus' to enable prometheus metrics).
|
||||
include: '${METRICS_ENDPOINTS_EXPOSE:info}'
|
||||
@ -212,4 +212,16 @@ service:
|
||||
type: "${TB_SERVICE_TYPE:tb-transport}"
|
||||
# Unique id for this service (autogenerated if empty)
|
||||
id: "${TB_SERVICE_ID:}"
|
||||
tenant_id: "${TB_SERVICE_TENANT_ID:}" # empty or specific tenant id.
|
||||
tenant_id: "${TB_SERVICE_TENANT_ID:}" # empty or specific tenant id.
|
||||
|
||||
|
||||
metrics:
|
||||
# Enable/disable actuator metrics.
|
||||
enabled: "${METRICS_ENABLED:false}"
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
# Expose metrics endpoint (use value 'prometheus' to enable prometheus metrics).
|
||||
include: '${METRICS_ENDPOINTS_EXPOSE:info}'
|
||||
@ -14,8 +14,16 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
spring.main.web-environment: false
|
||||
spring.main.web-application-type: none
|
||||
# If you enabled process metrics you should also enable 'web-environment'.
|
||||
spring.main.web-environment: "${WEB_APPLICATION_ENABLE:false}"
|
||||
# If you enabled process metrics you should set 'web-application-type' to 'servlet' value.
|
||||
spring.main.web-application-type: "${WEB_APPLICATION_TYPE:none}"
|
||||
|
||||
server:
|
||||
# Server bind address (has no effect if web-environment is disabled).
|
||||
address: "${HTTP_BIND_ADDRESS:0.0.0.0}"
|
||||
# Server bind port (has no effect if web-environment is disabled).
|
||||
port: "${HTTP_BIND_PORT:8083}"
|
||||
|
||||
# Zookeeper connection parameters. Used for service discovery.
|
||||
zk:
|
||||
@ -232,4 +240,15 @@ service:
|
||||
type: "${TB_SERVICE_TYPE:tb-transport}"
|
||||
# Unique id for this service (autogenerated if empty)
|
||||
id: "${TB_SERVICE_ID:}"
|
||||
tenant_id: "${TB_SERVICE_TENANT_ID:}" # empty or specific tenant id.
|
||||
tenant_id: "${TB_SERVICE_TENANT_ID:}" # empty or specific tenant id.
|
||||
|
||||
metrics:
|
||||
# Enable/disable actuator metrics.
|
||||
enabled: "${METRICS_ENABLED:false}"
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
# Expose metrics endpoint (use value 'prometheus' to enable prometheus metrics).
|
||||
include: '${METRICS_ENDPOINTS_EXPOSE:info}'
|
||||
Loading…
x
Reference in New Issue
Block a user