diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTenantRoutingInfoService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTenantRoutingInfoService.java index 4c4f76c2b9..400586235e 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTenantRoutingInfoService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTenantRoutingInfoService.java @@ -18,13 +18,13 @@ package org.thingsboard.server.service.queue; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Service; -import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.TenantProfile; +import org.thingsboard.server.common.data.exception.TenantNotFoundException; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.tenant.TbTenantProfileCache; import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.queue.discovery.TenantRoutingInfo; import org.thingsboard.server.queue.discovery.TenantRoutingInfoService; -import org.thingsboard.server.dao.tenant.TbTenantProfileCache; @Slf4j @Service @@ -46,7 +46,7 @@ public class DefaultTenantRoutingInfoService implements TenantRoutingInfoService if (tenantProfile != null) { return new TenantRoutingInfo(tenantId, tenantProfile.isIsolatedTbRuleEngine()); } else { - throw new RuntimeException("Tenant not found!"); + throw new TenantNotFoundException(tenantId); } } } diff --git a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java index 005cc6ac4c..cb08e855c2 100644 --- a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java +++ b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java @@ -40,6 +40,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceIdInfo; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.StringUtils; +import org.thingsboard.server.common.data.exception.TenantNotFoundException; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; @@ -453,6 +454,9 @@ public class DefaultDeviceStateService extends AbstractPartitionBasedService tenantDevicesActivity = devicesActivity.computeIfAbsent(stateData.getTenantId(), tenantId -> Pair.of(new AtomicInteger(), new AtomicInteger())); diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java index 6b21809874..4b43ddaf65 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java @@ -436,7 +436,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { String name = "device " + i; createDevice(name, name); } - await().atMost(5, TimeUnit.SECONDS) + await().atMost(30, TimeUnit.SECONDS) .untilAsserted(() -> { assertThat(getMyNotifications(false, 100)).size().isEqualTo(notificationRequestsLimit); }); diff --git a/application/src/test/java/org/thingsboard/server/service/stats/DevicesStatisticsTest.java b/application/src/test/java/org/thingsboard/server/service/stats/DevicesStatisticsTest.java index d31d6639ac..226c5941d4 100644 --- a/application/src/test/java/org/thingsboard/server/service/stats/DevicesStatisticsTest.java +++ b/application/src/test/java/org/thingsboard/server/service/stats/DevicesStatisticsTest.java @@ -28,6 +28,7 @@ import org.thingsboard.server.controller.AbstractControllerTest; import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.service.apiusage.TbApiUsageStateService; +import org.thingsboard.server.service.state.DeviceStateService; import java.util.ArrayList; import java.util.List; @@ -35,17 +36,14 @@ import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @DaoSqlTest @TestPropertySource(properties = { "usage.stats.report.enabled=true", - "transport.http.enabled=true", "usage.stats.report.interval=2", "usage.stats.gauge_report_interval=1", "state.defaultStateCheckIntervalInSec=3", "state.defaultInactivityTimeoutInSec=10" - }) public class DevicesStatisticsTest extends AbstractControllerTest { @@ -53,6 +51,8 @@ public class DevicesStatisticsTest extends AbstractControllerTest { private TbApiUsageStateService apiUsageStateService; @Autowired private TimeseriesService timeseriesService; + @Autowired + private DeviceStateService deviceStateService; private ApiUsageStateId apiUsageStateId; @@ -86,7 +86,7 @@ public class DevicesStatisticsTest extends AbstractControllerTest { }); for (Device device : activeDevices) { - postTelemetry(device.getName(), "{\"dp\":1}"); + deviceStateService.onDeviceActivity(tenantId, device.getId(), System.currentTimeMillis()); } await().atMost(40, TimeUnit.SECONDS) @@ -102,9 +102,4 @@ public class DevicesStatisticsTest extends AbstractControllerTest { .get().stream().findFirst().flatMap(KvEntry::getLongValue).orElse(null); } - @SneakyThrows - private void postTelemetry(String accessToken, String json) { - doPost("/api/v1/" + accessToken + "/telemetry", json, new String[0]).andExpect(status().isOk()); - } - } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/exception/TenantNotFoundException.java b/common/data/src/main/java/org/thingsboard/server/common/data/exception/TenantNotFoundException.java new file mode 100644 index 0000000000..01005a2c36 --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/common/data/exception/TenantNotFoundException.java @@ -0,0 +1,31 @@ +/** + * Copyright © 2016-2023 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.data.exception; + +import lombok.Getter; +import org.thingsboard.server.common.data.id.TenantId; + +public class TenantNotFoundException extends RuntimeException { + + @Getter + private final TenantId tenantId; + + public TenantNotFoundException(TenantId tenantId) { + super("Tenant with id " + tenantId + " not found"); + this.tenantId = tenantId; + } + +} diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java index f186367b4c..08f2e849f8 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java @@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; +import org.thingsboard.server.common.data.exception.TenantNotFoundException; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.queue.ServiceType; @@ -368,7 +369,7 @@ public class HashPartitionService implements PartitionService { } } if (routingInfo == null) { - throw new RuntimeException("Tenant not found!"); + throw new TenantNotFoundException(tenantId); } switch (serviceType) { case TB_RULE_ENGINE: diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/usagestats/DefaultTbApiUsageReportClient.java b/common/queue/src/main/java/org/thingsboard/server/queue/usagestats/DefaultTbApiUsageReportClient.java index 5dfaa70e12..8a5857e6a7 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/usagestats/DefaultTbApiUsageReportClient.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/usagestats/DefaultTbApiUsageReportClient.java @@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.ApiUsageRecordKey; +import org.thingsboard.server.common.data.exception.TenantNotFoundException; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; @@ -122,6 +123,8 @@ public class DefaultTbApiUsageReportClient implements TbApiUsageReportClient { TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, parent.getTenantId(), parent.getId()) .newByTopic(msgProducer.getDefaultTopic()); msgProducer.send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), statsMsg.build()), null); + } catch (TenantNotFoundException e) { + log.debug("Couldn't report usage stats for non-existing tenant: {}", e.getTenantId()); } catch (Exception e) { log.warn("Failed to report usage stats for tenant {}", parent.getTenantId(), e); }