From 9850e7a4664525f34f569a8efa12995d3ced3e4e Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 28 Nov 2025 00:06:42 +0100 Subject: [PATCH] monitoring: show dashboard link on startup notification. Initial delay set for services to avoid spikes --- .../ThingsboardMonitoringApplication.java | 17 ++++++++++------- .../service/MonitoringEntityService.java | 10 ++++++---- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java b/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java index f225d0d771..88e9ac1fa3 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/ThingsboardMonitoringApplication.java @@ -50,7 +50,7 @@ public class ThingsboardMonitoringApplication { @Value("${monitoring.monitoring_rate_ms}") private int monitoringRateMs; - ScheduledExecutorService scheduler = ThingsBoardExecutors.newSingleThreadScheduledExecutor("monitoring-executor"); + ScheduledExecutorService scheduler = ThingsBoardExecutors.newSingleThreadScheduledExecutor("monitoring"); public static void main(String[] args) { new SpringApplicationBuilder(ThingsboardMonitoringApplication.class) @@ -63,12 +63,15 @@ public class ThingsboardMonitoringApplication { entityService.checkEntities(); monitoringServices.forEach(BaseMonitoringService::init); - scheduler.scheduleWithFixedDelay(() -> { - monitoringServices.forEach(monitoringService -> { - monitoringService.runChecks(); - }); - }, 0, monitoringRateMs, TimeUnit.MILLISECONDS); - notificationService.sendNotification(new InfoNotification(":rocket: Monitoring started")); + for (int i = 0; i < monitoringServices.size(); i++) { + int initialDelay = (monitoringRateMs / monitoringServices.size()) * i; + BaseMonitoringService service = monitoringServices.get(i); + log.info("Scheduling initialDelay {}, fixedDelay {} for monitoring '{}' ", initialDelay, monitoringRateMs, service.getClass().getSimpleName()); + scheduler.scheduleWithFixedDelay(service::runChecks, initialDelay, monitoringRateMs, TimeUnit.MILLISECONDS); + } + + String publicDashboardUrl = entityService.getDashboardPublicLink(); + notificationService.sendNotification(new InfoNotification(":rocket: <"+publicDashboardUrl+"|Monitoring> started")); } @EventListener(ContextClosedEvent.class) diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java index fad9bc6b7c..a0991bce72 100644 --- a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java +++ b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringEntityService.java @@ -91,6 +91,8 @@ public class MonitoringEntityService { @Value("${monitoring.calculated_fields.enabled:true}") private boolean calculatedFieldsMonitoringEnabled; + DashboardId dashboardId = null; + public void checkEntities() { RuleChain ruleChain = tbClient.getRuleChains(RuleChainType.CORE, new PageLink(10)).getData().stream() .filter(RuleChain::isRoot) @@ -132,7 +134,7 @@ public class MonitoringEntityService { tbClient.assignAssetToPublicCustomer(asset.getId()); tbClient.assignDashboardToPublicCustomer(dashboard.getId()); - getDashboardPublicLink(dashboard); + this.dashboardId = Optional.ofNullable(dashboard).map(Dashboard::getId).orElse(null); } public Asset getOrCreateMonitoringAsset() { @@ -266,10 +268,10 @@ public class MonitoringEntityService { tbClient.saveCalculatedField(calculatedField); } - private String getDashboardPublicLink(Dashboard dashboard) { + public String getDashboardPublicLink() { String link = ""; try { - Optional infoOpt = tbClient.getDashboardInfoById(dashboard.getId()); + Optional infoOpt = tbClient.getDashboardInfoById(dashboardId); if (infoOpt.isPresent()) { String publicCustomerId = null; Set customers = infoOpt.get().getAssignedCustomers(); @@ -280,7 +282,7 @@ public class MonitoringEntityService { .findFirst().orElse(null); } if (publicCustomerId != null) { - link = buildPublicDashboardLink(dashboard.getId(), publicCustomerId); + link = buildPublicDashboardLink(dashboardId, publicCustomerId); log.info("Public Monitoring dashboard link: {}", link); } else { log.warn("Dashboard is not assigned to public customer. Public link can't be generated.");