Browse Source

Add tests for resource shortage

pull/12616/head
Andrii Landiak 1 year ago
parent
commit
f366e277df
  1. 5
      application/src/main/java/org/thingsboard/server/service/system/DefaultSystemInfoService.java
  2. 59
      application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java

5
application/src/main/java/org/thingsboard/server/service/system/DefaultSystemInfoService.java

@ -198,8 +198,9 @@ public class DefaultSystemInfoService extends TbApplicationEventListener<Partiti
List<TsKvEntry> tsList = new ArrayList<>();
tsList.add(new BasicTsKvEntry(ts, new BooleanDataEntry("clusterMode", false)));
getCpuUsage().ifPresent(v -> {
tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("cpuUsage", (long) v)));
notificationRule.process(ResourcesShortageTrigger.builder().resource(Resource.CPU).usage((long) v).build());
long value = (long) v;
tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("cpuUsage", value)));
notificationRule.process(ResourcesShortageTrigger.builder().resource(Resource.CPU).usage(value).build());
});
getMemoryUsage().ifPresent(v -> {
long value = (long) v;

59
application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java

@ -68,6 +68,8 @@ import org.thingsboard.server.common.data.notification.rule.NotificationRule;
import org.thingsboard.server.common.data.notification.rule.NotificationRuleInfo;
import org.thingsboard.server.common.data.notification.rule.trigger.NewPlatformVersionTrigger;
import org.thingsboard.server.common.data.notification.rule.trigger.RateLimitsTrigger;
import org.thingsboard.server.common.data.notification.rule.trigger.ResourcesShortageTrigger;
import org.thingsboard.server.common.data.notification.rule.trigger.ResourcesShortageTrigger.Resource;
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmAssignmentNotificationRuleTriggerConfig;
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmCommentNotificationRuleTriggerConfig;
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmNotificationRuleTriggerConfig;
@ -78,6 +80,7 @@ import org.thingsboard.server.common.data.notification.rule.trigger.config.Entit
import org.thingsboard.server.common.data.notification.rule.trigger.config.NewPlatformVersionNotificationRuleTriggerConfig;
import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType;
import org.thingsboard.server.common.data.notification.rule.trigger.config.RateLimitsNotificationRuleTriggerConfig;
import org.thingsboard.server.common.data.notification.rule.trigger.config.ResourcesShortageNotificationRuleTriggerConfig;
import org.thingsboard.server.common.data.notification.targets.NotificationTarget;
import org.thingsboard.server.common.data.notification.targets.platform.AffectedTenantAdministratorsFilter;
import org.thingsboard.server.common.data.notification.targets.platform.SystemAdministratorsFilter;
@ -98,8 +101,10 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.queue.notification.DefaultNotificationDeduplicationService;
import org.thingsboard.server.service.notification.rule.cache.DefaultNotificationRulesCache;
import org.thingsboard.server.service.state.DeviceStateService;
import org.thingsboard.server.service.system.DefaultSystemInfoService;
import org.thingsboard.server.service.telemetry.AlarmSubscriptionService;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -132,7 +137,9 @@ import static org.thingsboard.server.common.data.notification.rule.trigger.confi
public class NotificationRuleApiTest extends AbstractNotificationApiTest {
@SpyBean
private AlarmSubscriptionService alarmSubscriptionService;
private AlarmSubscriptionService alarmSubscriptionService;;
@Autowired
private DefaultSystemInfoService systemInfoService;
@Autowired
private NotificationRequestService notificationRequestService;
@Autowired
@ -780,6 +787,56 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
});
}
@Test
public void testNotificationRuleProcessing_resourcesShortage() throws Exception {
loginSysAdmin();
ResourcesShortageNotificationRuleTriggerConfig triggerConfig = ResourcesShortageNotificationRuleTriggerConfig.builder()
.resource(Resource.CPU.name())
.cpuThreshold(0.01f)
.ramThreshold(0.01f)
.storageThreshold(0.01f)
.build();
createNotificationRule(triggerConfig, "Test", "Test", createNotificationTarget(tenantAdminUserId).getId());
loginTenantAdmin();
Method method = DefaultSystemInfoService.class.getDeclaredMethod("saveCurrentMonolithSystemInfo");
method.setAccessible(true);
method.invoke(systemInfoService);
TimeUnit.SECONDS.sleep(5);
assertThat(getMyNotifications(false, 100)).size().isEqualTo(3);
}
@Test
public void testNotificationsDeduplication_resourcesShortage() throws Exception {
loginSysAdmin();
ResourcesShortageNotificationRuleTriggerConfig triggerConfig = ResourcesShortageNotificationRuleTriggerConfig.builder()
.resource(Resource.CPU.name())
.cpuThreshold(0.1f)
.build();
createNotificationRule(triggerConfig, "Test", "Test", createNotificationTarget(tenantAdminUserId).getId());
loginTenantAdmin();
assertThat(getMyNotifications(false, 100)).size().isZero();
for (int i = 0; i < 10; i++) {
notificationRuleProcessor.process(ResourcesShortageTrigger.builder()
.resource(Resource.CPU)
.usage(15L)
.build());
TimeUnit.MILLISECONDS.sleep(300);
}
TimeUnit.SECONDS.sleep(5);
assertThat(getMyNotifications(false, 100)).size().isOne();
// deduplication is 5 minute, no new message is exp
notificationRuleProcessor.process(ResourcesShortageTrigger.builder()
.resource(Resource.CPU)
.usage(5L)
.build());
await("").atMost(5, TimeUnit.SECONDS).untilAsserted(() -> assertThat(getMyNotifications(false, 100)).size().isOne());
}
@Test
public void testNotificationRuleDisabling() throws Exception {
EntityActionNotificationRuleTriggerConfig triggerConfig = new EntityActionNotificationRuleTriggerConfig();

Loading…
Cancel
Save