From 91f4f9f7ac42c4899ea3da93a1e240429a7c5b94 Mon Sep 17 00:00:00 2001 From: liwei Date: Sun, 29 Mar 2026 16:09:01 +0800 Subject: [PATCH 01/11] fix(manager): set instance to 'unknow' for dynamic monitors on modification In the `modifyMonitor` method, the `instance` field for dynamically discovered monitors (where `isStatic` is false) was not being explicitly set to "unknow". This could lead to incorrect instance values or unexpected behavior when updating service discovery monitors. This commit aligns the behavior of `modifyMonitor` with `addMonitor` by explicitly setting `monitor.setInstance("unknow")` for non-static scrape types before processing the instance and port fields. --- .../manager/service/impl/MonitorServiceImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index 7e06ef78229..c15a62b3217 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -382,6 +382,13 @@ public void modifyMonitor(Monitor monitor, List params, String collector, labelDao.saveAll(addLabels); } + // Construct the collection task Job entity + boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) + || !StringUtils.hasText(monitor.getScrape()); + if (!isStatic) { + monitor.setInstance("unknow"); + } + String instance = monitor.getInstance(); // The port field may be null Param portParam = params.stream() @@ -396,8 +403,6 @@ public void modifyMonitor(Monitor monitor, List params, String collector, } monitor.setInstance(instance); - boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) - || !StringUtils.hasText(monitor.getScrape()); if (preMonitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) { // Construct the collection task Job entity String app = isStatic ? monitor.getApp() : monitor.getScrape(); From c336f9a7aa00e45c8ebdcf71721602db17027df6 Mon Sep 17 00:00:00 2001 From: liwei Date: Sun, 29 Mar 2026 16:11:34 +0800 Subject: [PATCH 02/11] Revert "fix(manager): set instance to 'unknow' for dynamic monitors on modification" This reverts commit 91f4f9f7ac42c4899ea3da93a1e240429a7c5b94. --- .../manager/service/impl/MonitorServiceImpl.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index c15a62b3217..7e06ef78229 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -382,13 +382,6 @@ public void modifyMonitor(Monitor monitor, List params, String collector, labelDao.saveAll(addLabels); } - // Construct the collection task Job entity - boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) - || !StringUtils.hasText(monitor.getScrape()); - if (!isStatic) { - monitor.setInstance("unknow"); - } - String instance = monitor.getInstance(); // The port field may be null Param portParam = params.stream() @@ -403,6 +396,8 @@ public void modifyMonitor(Monitor monitor, List params, String collector, } monitor.setInstance(instance); + boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) + || !StringUtils.hasText(monitor.getScrape()); if (preMonitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) { // Construct the collection task Job entity String app = isStatic ? monitor.getApp() : monitor.getScrape(); From 92e68acae05f16a07846f12d424668ae14e713c0 Mon Sep 17 00:00:00 2001 From: liwei Date: Sun, 29 Mar 2026 16:16:04 +0800 Subject: [PATCH 03/11] fix(manager): set instance to 'unknow' for dynamic monitors on modification In the `modifyMonitor` method, the `instance` field for dynamically discovered monitors (where `isStatic` is false) was not being explicitly set to "unknow". This could lead to incorrect instance values or unexpected behavior when updating service discovery monitors. This commit aligns the behavior of `modifyMonitor` with `addMonitor` by explicitly setting `monitor.setInstance("unknow")` for non-static scrape types before processing the instance and port fields. --- .../manager/service/impl/MonitorServiceImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index 7e06ef78229..7b5f3fdb833 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -382,6 +382,12 @@ public void modifyMonitor(Monitor monitor, List params, String collector, labelDao.saveAll(addLabels); } + boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) + || !StringUtils.hasText(monitor.getScrape()); + if (!isStatic) { + monitor.setInstance("unknow"); + } + String instance = monitor.getInstance(); // The port field may be null Param portParam = params.stream() @@ -396,8 +402,6 @@ public void modifyMonitor(Monitor monitor, List params, String collector, } monitor.setInstance(instance); - boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) - || !StringUtils.hasText(monitor.getScrape()); if (preMonitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) { // Construct the collection task Job entity String app = isStatic ? monitor.getApp() : monitor.getScrape(); From a63d626ec75572c40be44edbbe28b91555307b1e Mon Sep 17 00:00:00 2001 From: liwei Date: Mon, 30 Mar 2026 20:48:58 +0800 Subject: [PATCH 04/11] fix: only set instance to 'unknown' when it is empty When the monitor type is service discovery and the instance is not empty, the instance value should not be overwritten. This commit fixes this issue. Additionally, it corrects the spelling of 'unknow' to 'unknown' and prevents appending the port if the instance already contains it. --- .../manager/service/impl/MonitorServiceImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index 7b5f3fdb833..a49ff05a312 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -172,7 +172,7 @@ public void addMonitor(Monitor monitor, List params, String collector, Gr Job appDefine = appService.getAppDefine(app); if (!isStatic) { appDefine.setSd(true); - monitor.setInstance("unknow"); + monitor.setInstance("unknown"); } if (CommonConstants.PROMETHEUS.equals(monitor.getApp())) { appDefine.setApp(CommonConstants.PROMETHEUS_APP_PREFIX + monitor.getName()); @@ -384,8 +384,8 @@ public void modifyMonitor(Monitor monitor, List params, String collector, boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) || !StringUtils.hasText(monitor.getScrape()); - if (!isStatic) { - monitor.setInstance("unknow"); + if (!isStatic && !StringUtils.hasText(monitor.getInstance())) { + monitor.setInstance("unknown"); } String instance = monitor.getInstance(); @@ -397,9 +397,11 @@ public void modifyMonitor(Monitor monitor, List params, String collector, String portWithMark = (Objects.isNull(portParam) || !StringUtils.hasText(portParam.getParamValue())) ? "" : SignConstants.DOUBLE_MARK + portParam.getParamValue(); - if (Objects.nonNull(instance)) { + if (Objects.nonNull(instance)&&!IpDomainUtil.isHasPortWithMark(instance)) { instance = instance + portWithMark; } + + monitor.setInstance(instance); if (preMonitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) { From dcedd8b27258272fc84d0070c4fcc9ed7a0cd003 Mon Sep 17 00:00:00 2001 From: liwei Date: Tue, 31 Mar 2026 11:55:29 +0800 Subject: [PATCH 05/11] fix Checkstyle formatting error. --- .../service/impl/MonitorServiceImpl.java | 168 +++++++++--------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index a49ff05a312..aa3717ce23e 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -151,7 +151,7 @@ public void detectMonitor(Monitor monitor, List params, String collector) @Override @Transactional(rollbackFor = Exception.class) public void addMonitor(Monitor monitor, List params, String collector, GrafanaDashboard grafanaDashboard) - throws RuntimeException { + throws RuntimeException { // Apply for monitor id long monitorId = SnowFlakeIdGenerator.generateId(); Map labels = monitor.getLabels(); @@ -167,7 +167,7 @@ public void addMonitor(Monitor monitor, List params, String collector, Gr // Construct the collection task Job entity boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) - || !StringUtils.hasText(monitor.getScrape()); + || !StringUtils.hasText(monitor.getScrape()); String app = isStatic ? monitor.getApp() : monitor.getScrape(); Job appDefine = appService.getAppDefine(app); if (!isStatic) { @@ -185,19 +185,19 @@ public void addMonitor(Monitor monitor, List params, String collector, Gr String instance = monitor.getInstance(); // The port field may be null Param portParam = params.stream() - .filter(param -> PARAM_FIELD_PORT.equals(param.getField())) - .findFirst() - .orElse(null); + .filter(param -> PARAM_FIELD_PORT.equals(param.getField())) + .findFirst() + .orElse(null); String portWithMark = (Objects.isNull(portParam) || !StringUtils.hasText(portParam.getParamValue())) - ? "" - : SignConstants.DOUBLE_MARK + portParam.getParamValue(); + ? "" + : SignConstants.DOUBLE_MARK + portParam.getParamValue(); if (!IpDomainUtil.isHasPortWithMark(instance)) { instance = instance + portWithMark; } monitor.setInstance(instance); Map metadata = Map.of(CommonConstants.LABEL_INSTANCE_NAME, monitor.getName(), - CommonConstants.LABEL_INSTANCE, instance); + CommonConstants.LABEL_INSTANCE, instance); appDefine.setMetadata(metadata); appDefine.setLabels(monitor.getLabels()); appDefine.setAnnotations(monitor.getAnnotations()); @@ -207,7 +207,7 @@ public void addMonitor(Monitor monitor, List params, String collector, Gr }).collect(Collectors.toList()); appDefine.setConfigmap(configmaps); long jobId = collector == null ? collectJobScheduling.addAsyncCollectJob(appDefine, null) - : collectJobScheduling.addAsyncCollectJob(appDefine, collector); + : collectJobScheduling.addAsyncCollectJob(appDefine, collector); try { detectMonitor(monitor, params, collector); } catch (Exception ignored) { @@ -216,16 +216,16 @@ public void addMonitor(Monitor monitor, List params, String collector, Gr try { if (collector != null) { CollectorMonitorBind collectorMonitorBind = CollectorMonitorBind.builder() - .collector(collector) - .monitorId(monitorId) - .build(); + .collector(collector) + .monitorId(monitorId) + .build(); collectorMonitorBindDao.save(collectorMonitorBind); } monitor.setId(monitorId); monitor.setJobId(jobId); // create grafana dashboard if (monitor.getApp().equals(CommonConstants.PROMETHEUS) && grafanaDashboard != null - && grafanaDashboard.isEnabled()) { + && grafanaDashboard.isEnabled()) { dashboardService.createOrUpdateDashboard(grafanaDashboard.getTemplate(), monitorId); } monitorDao.save(monitor); @@ -246,9 +246,9 @@ public void export(List ids, String type, HttpServletResponse res) throws public void exportAll(String type, HttpServletResponse res) throws Exception { // Get all monitor IDs from the database List allMonitorIds = monitorDao.findAll() - .stream() - .map(Monitor::getId) - .collect(Collectors.toList()); + .stream() + .map(Monitor::getId) + .collect(Collectors.toList()); // Use the existing export method to export all monitors export(allMonitorIds, type, res); @@ -269,13 +269,13 @@ public void validate(MonitorDto monitorDto, Boolean isModify) throws IllegalArgu monitorInfo.setName(monitorInfo.getName().trim()); Monitor monitor = monitorInfo.toEntity(); Map paramMap = monitorDto.getParamInfos() - .stream() - .peek(param -> { - param.setMonitorId(monitor.getId()); - String value = param.getParamValue() == null ? null : param.getParamValue().trim(); - param.setParamValue(value); - }) - .collect(Collectors.toMap(MonitorParam::getField, param -> param)); + .stream() + .peek(param -> { + param.setMonitorId(monitor.getId()); + String value = param.getParamValue() == null ? null : param.getParamValue().trim(); + param.setParamValue(value); + }) + .collect(Collectors.toMap(MonitorParam::getField, param -> param)); // Check name uniqueness and can not equal app type if (isModify != null) { Optional defineOptional = appService.getAppDefineOption(monitor.getName()); @@ -307,7 +307,7 @@ public void validate(MonitorDto monitorDto, Boolean isModify) throws IllegalArgu List paramDefines = appService.getAppParamDefines(monitor.getApp()); if (!CollectionUtils.isEmpty(paramDefines)) { boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) - || !StringUtils.hasText(monitor.getScrape()); + || !StringUtils.hasText(monitor.getScrape()); for (ParamDefineInfo paramDefine : paramDefines) { String field = paramDefine.getField(); MonitorParam param = paramMap.get(field); @@ -339,16 +339,16 @@ private void checkJobFields(String app) { for (Metrics.Field field : metrics.getFields()) { if (JexlCheckerUtil.verifyKeywords(field.getField())) { throw new IllegalArgumentException(job.getApp() + " " + metrics.getName() + " " - + field.getField() + " prohibited keywords, please modify the template information."); + + field.getField() + " prohibited keywords, please modify the template information."); } if (JexlCheckerUtil.verifyStartCharacter(field.getField())) { throw new IllegalArgumentException(job.getApp() + " " + metrics.getName() + " " - + field.getField() - + " illegal start character, please modify the template information."); + + field.getField() + + " illegal start character, please modify the template information."); } if (JexlCheckerUtil.verifySpaces(field.getField())) { throw new IllegalArgumentException(job.getApp() + " " + metrics.getName() + " " - + field.getField() + " no spaces allowed, please modify the template information."); + + field.getField() + " no spaces allowed, please modify the template information."); } } } @@ -358,7 +358,7 @@ private void checkJobFields(String app) { @Override @Transactional(rollbackFor = Exception.class) public void modifyMonitor(Monitor monitor, List params, String collector, GrafanaDashboard grafanaDashboard) - throws RuntimeException { + throws RuntimeException { long monitorId = monitor.getId(); // Check to determine whether the monitor corresponding to the monitor id exists Optional queryOption = monitorDao.findById(monitorId); @@ -391,13 +391,13 @@ public void modifyMonitor(Monitor monitor, List params, String collector, String instance = monitor.getInstance(); // The port field may be null Param portParam = params.stream() - .filter(param -> PARAM_FIELD_PORT.equals(param.getField())) - .findFirst() - .orElse(null); + .filter(param -> PARAM_FIELD_PORT.equals(param.getField())) + .findFirst() + .orElse(null); String portWithMark = (Objects.isNull(portParam) || !StringUtils.hasText(portParam.getParamValue())) - ? "" - : SignConstants.DOUBLE_MARK + portParam.getParamValue(); - if (Objects.nonNull(instance)&&!IpDomainUtil.isHasPortWithMark(instance)) { + ? "" + : SignConstants.DOUBLE_MARK + portParam.getParamValue(); + if (Objects.nonNull(instance) && !IpDomainUtil.isHasPortWithMark(instance)) { instance = instance + portWithMark; } @@ -422,13 +422,13 @@ public void modifyMonitor(Monitor monitor, List params, String collector, appDefine.setScheduleType(monitor.getScheduleType()); appDefine.setCronExpression(monitor.getCronExpression()); Map metadata = Map.of(CommonConstants.LABEL_INSTANCE_NAME, monitor.getName(), - CommonConstants.LABEL_INSTANCE, monitor.getInstance()); + CommonConstants.LABEL_INSTANCE, monitor.getInstance()); appDefine.setMetadata(metadata); appDefine.setLabels(monitor.getLabels()); appDefine.setAnnotations(monitor.getAnnotations()); List configmaps = params.stream() - .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) - .collect(Collectors.toList()); + .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) + .collect(Collectors.toList()); appDefine.setConfigmap(configmaps); long newJobId; if (collector == null) { @@ -450,8 +450,8 @@ public void modifyMonitor(Monitor monitor, List params, String collector, collectorMonitorBindDao.deleteCollectorMonitorBindsByMonitorId(monitorId); if (collector != null) { CollectorMonitorBind collectorMonitorBind = CollectorMonitorBind.builder() - .collector(collector).monitorId(monitorId) - .build(); + .collector(collector).monitorId(monitorId) + .build(); collectorMonitorBindDao.save(collectorMonitorBind); } // force update gmtUpdate time, due the case: monitor not change, param change. @@ -488,7 +488,7 @@ public void deleteMonitors(Set ids) throws RuntimeException { return; } Set subMonitorIds = monitorBindDao.findMonitorBindsByBizIdIn(ids).stream().map(MonitorBind::getMonitorId) - .collect(Collectors.toSet()); + .collect(Collectors.toSet()); Set allMonitorIds = new HashSet<>(ids); allMonitorIds.addAll(subMonitorIds); List monitors = monitorDao.findMonitorsByIdIn(allMonitorIds); @@ -529,28 +529,28 @@ public MonitorDto getMonitorDto(long id) throws RuntimeException { monitorDto.setParams(params); List metricsInfos; if (DispatchConstants.PROTOCOL_PROMETHEUS.equalsIgnoreCase(monitor.getApp()) - || monitor.getType() == CommonConstants.MONITOR_TYPE_PUSH_AUTO_CREATE) { + || monitor.getType() == CommonConstants.MONITOR_TYPE_PUSH_AUTO_CREATE) { List metricsDataList = warehouseService.queryMonitorMetricsData(id); metricsInfos = metricsDataList.stream() - .map(t -> MetricsInfo.builder().name(t.getMetrics()) - .favorited(favoritedMetrics.contains(t.getMetrics())).build()) - .collect(Collectors.toList()); + .map(t -> MetricsInfo.builder().name(t.getMetrics()) + .favorited(favoritedMetrics.contains(t.getMetrics())).build()) + .collect(Collectors.toList()); monitorDto.setGrafanaDashboard(dashboardService.getDashboardByMonitorId(id)); } else { boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) - || !StringUtils.hasText(monitor.getScrape()); + || !StringUtils.hasText(monitor.getScrape()); String type = isStatic ? monitor.getApp() : monitor.getScrape(); Job job = appService.getAppDefine(type); metricsInfos = job.getMetrics().stream() - .filter(Metrics::isVisible) - .map(t -> MetricsInfo.builder().name(t.getName()) - .favorited(favoritedMetrics.contains(t.getName())).build()) - .collect(Collectors.toList()); + .filter(Metrics::isVisible) + .map(t -> MetricsInfo.builder().name(t.getName()) + .favorited(favoritedMetrics.contains(t.getName())).build()) + .collect(Collectors.toList()); } monitorDto.setMetrics(metricsInfos); monitorDto.setMonitor(monitor); Optional bindOptional = collectorMonitorBindDao - .findCollectorMonitorBindByMonitorId(monitor.getId()); + .findCollectorMonitorBindByMonitorId(monitor.getId()); bindOptional.ifPresent(bind -> monitorDto.setCollector(bind.getCollector())); return monitorDto; } else { @@ -560,7 +560,7 @@ public MonitorDto getMonitorDto(long id) throws RuntimeException { @Override public Page getMonitors(List monitorIds, String app, String search, Byte status, String sort, - String order, int pageIndex, int pageSize, String labels) { + String order, int pageIndex, int pageSize, String labels) { Specification specification = (root, query, criteriaBuilder) -> { List andList = new ArrayList<>(); if (!CollectionUtils.isEmpty(monitorIds)) { @@ -585,7 +585,7 @@ public Page getMonitors(List monitorIds, String app, String searc if (StringUtils.hasText(search)) { Predicate predicateHost = criteriaBuilder.like(root.get("instance"), "%" + search + "%"); Predicate predicateName = criteriaBuilder.like(criteriaBuilder.lower(root.get("name")), - "%" + search.toLowerCase() + "%"); + "%" + search.toLowerCase() + "%"); Long id = Longs.tryParse(search); if (id != null) { orList.add(criteriaBuilder.equal(root.get("id"), id)); @@ -639,12 +639,12 @@ public void cancelManageMonitors(Set ids) { // The jobId is not deleted, and the jobId is reused again after the management // is started. Set subMonitorIds = monitorBindDao.findMonitorBindsByBizIdIn(ids).stream().map(MonitorBind::getMonitorId) - .collect(Collectors.toSet()); + .collect(Collectors.toSet()); ids.addAll(subMonitorIds); List managedMonitors = monitorDao.findMonitorsByIdIn(ids) - .stream().filter(monitor -> monitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) - .peek(monitor -> monitor.setStatus(CommonConstants.MONITOR_PAUSED_CODE)) - .collect(Collectors.toList()); + .stream().filter(monitor -> monitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) + .peek(monitor -> monitor.setStatus(CommonConstants.MONITOR_PAUSED_CODE)) + .collect(Collectors.toList()); if (!CollectionUtils.isEmpty(managedMonitors)) { for (Monitor monitor : managedMonitors) { collectJobScheduling.cancelAsyncCollectJob(monitor.getJobId()); @@ -657,12 +657,12 @@ public void cancelManageMonitors(Set ids) { public void enableManageMonitors(Set ids) { // Update monitoring status Add corresponding monitoring periodic task Set subMonitorIds = monitorBindDao.findMonitorBindsByBizIdIn(ids).stream().map(MonitorBind::getMonitorId) - .collect(Collectors.toSet()); + .collect(Collectors.toSet()); ids.addAll(subMonitorIds); List unManagedMonitors = monitorDao.findMonitorsByIdIn(ids) - .stream().filter(monitor -> monitor.getStatus() == CommonConstants.MONITOR_PAUSED_CODE) - .peek(monitor -> monitor.setStatus(CommonConstants.MONITOR_UP_CODE)) - .collect(Collectors.toList()); + .stream().filter(monitor -> monitor.getStatus() == CommonConstants.MONITOR_PAUSED_CODE) + .peek(monitor -> monitor.setStatus(CommonConstants.MONITOR_UP_CODE)) + .collect(Collectors.toList()); if (unManagedMonitors.isEmpty()) { return; } @@ -671,7 +671,7 @@ public void enableManageMonitors(Set ids) { // Construct the collection task Job entity List params = paramDao.findParamsByMonitorId(monitor.getId()); boolean isStatic = CommonConstants.SCRAPE_STATIC.equals(monitor.getScrape()) - || !StringUtils.hasText(monitor.getScrape()); + || !StringUtils.hasText(monitor.getScrape()); String app = isStatic ? monitor.getApp() : monitor.getScrape(); Job appDefine = appService.getAppDefine(app); if (!isStatic) { @@ -687,20 +687,20 @@ public void enableManageMonitors(Set ids) { appDefine.setScheduleType(monitor.getScheduleType()); appDefine.setCronExpression(monitor.getCronExpression()); Map metadata = Map.of(CommonConstants.LABEL_INSTANCE_NAME, monitor.getName(), - CommonConstants.LABEL_INSTANCE, monitor.getInstance()); + CommonConstants.LABEL_INSTANCE, monitor.getInstance()); appDefine.setMetadata(metadata); appDefine.setLabels(monitor.getLabels()); appDefine.setAnnotations(monitor.getAnnotations()); List configmaps = params.stream() - .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) - .collect(Collectors.toList()); + .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) + .collect(Collectors.toList()); List paramDefaultValue = appDefine.getParams().stream() - .filter(item -> StringUtils.hasText(item.getDefaultValue())) - .toList(); + .filter(item -> StringUtils.hasText(item.getDefaultValue())) + .toList(); paramDefaultValue.forEach(defaultVar -> { if (configmaps.stream().noneMatch(item -> item.getKey().equals(defaultVar.getField()))) { Configmap configmap = new Configmap(defaultVar.getField(), defaultVar.getDefaultValue(), - CommonConstants.TYPE_STRING); + CommonConstants.TYPE_STRING); configmaps.add(configmap); } }); @@ -708,7 +708,7 @@ public void enableManageMonitors(Set ids) { // Issue collection tasks Optional bindOptional = collectorMonitorBindDao - .findCollectorMonitorBindByMonitorId(monitor.getId()); + .findCollectorMonitorBindByMonitorId(monitor.getId()); String collector = bindOptional.map(CollectorMonitorBind::getCollector).orElse(null); long newJobId = collectJobScheduling.addAsyncCollectJob(appDefine, collector); monitor.setJobId(newJobId); @@ -762,15 +762,15 @@ public List getAllAppMonitorsCount() { @Override public void updateAppCollectJob(Job job) { List monitors = monitorDao.findMonitorsByAppEquals(job.getApp()) - .stream().filter(monitor -> monitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) - .toList(); + .stream().filter(monitor -> monitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) + .toList(); if (monitors.isEmpty()) { return; } List monitorBinds = collectorMonitorBindDao.findCollectorMonitorBindsByMonitorIdIn( - monitors.stream().map(Monitor::getId).collect(Collectors.toSet())); + monitors.stream().map(Monitor::getId).collect(Collectors.toSet())); Map monitorIdCollectorMap = monitorBinds.stream().collect( - Collectors.toMap(CollectorMonitorBind::getMonitorId, CollectorMonitorBind::getCollector)); + Collectors.toMap(CollectorMonitorBind::getMonitorId, CollectorMonitorBind::getCollector)); for (Monitor monitor : monitors) { try { Job appDefine = job.clone(); @@ -787,20 +787,20 @@ public void updateAppCollectJob(Job job) { appDefine.setCyclic(true); appDefine.setTimestamp(System.currentTimeMillis()); Map metadata = Map.of(CommonConstants.LABEL_INSTANCE_NAME, monitor.getName(), - CommonConstants.LABEL_INSTANCE, monitor.getInstance()); + CommonConstants.LABEL_INSTANCE, monitor.getInstance()); appDefine.setMetadata(metadata); appDefine.setLabels(monitor.getLabels()); appDefine.setAnnotations(monitor.getAnnotations()); List params = paramDao.findParamsByMonitorId(monitor.getId()); List configmaps = params.stream().map(param -> new Configmap(param.getField(), - param.getParamValue(), param.getType())).collect(Collectors.toList()); + param.getParamValue(), param.getType())).collect(Collectors.toList()); List paramDefaultValue = appDefine.getParams().stream() - .filter(item -> StringUtils.hasText(item.getDefaultValue())) - .toList(); + .filter(item -> StringUtils.hasText(item.getDefaultValue())) + .toList(); paramDefaultValue.forEach(defaultVar -> { if (configmaps.stream().noneMatch(item -> item.getKey().equals(defaultVar.getField()))) { Configmap configmap = new Configmap(defaultVar.getField(), defaultVar.getDefaultValue(), - (byte) 1); + (byte) 1); configmaps.add(configmap); } }); @@ -884,8 +884,8 @@ private void detectSdMonitor(Monitor monitor, List params, String collect appDefine.setLabels(monitor.getLabels()); appDefine.setAnnotations(monitor.getAnnotations()); List configmaps = params.stream() - .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) - .collect(Collectors.toList()); + .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) + .collect(Collectors.toList()); appDefine.setConfigmap(configmaps); appDefine.setSd(true); List collectRep; @@ -920,18 +920,18 @@ private void detectMonitorDirectly(Monitor monitor, List params, String c appDefine.setCyclic(false); appDefine.setTimestamp(System.currentTimeMillis()); Map metadata = Map.of(CommonConstants.LABEL_INSTANCE_NAME, monitor.getName(), - CommonConstants.LABEL_INSTANCE, monitor.getInstance()); + CommonConstants.LABEL_INSTANCE, monitor.getInstance()); appDefine.setMetadata(metadata); appDefine.setLabels(monitor.getLabels()); appDefine.setAnnotations(monitor.getAnnotations()); List configmaps = params.stream() - .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) - .collect(Collectors.toList()); + .map(param -> new Configmap(param.getField(), param.getParamValue(), param.getType())) + .collect(Collectors.toList()); appDefine.setConfigmap(configmaps); // To detect availability, you only need to collect the set of availability // metrics with a priority of 0. List availableMetrics = appDefine.getMetrics().stream() - .filter(item -> item.getPriority() == 0).collect(Collectors.toList()); + .filter(item -> item.getPriority() == 0).collect(Collectors.toList()); appDefine.setMetrics(availableMetrics); List collectRep; if (collector != null) { From be46c3c46a8eab91226a8234d120cc9da6824de5 Mon Sep 17 00:00:00 2001 From: liwei Date: Fri, 3 Apr 2026 20:27:55 +0800 Subject: [PATCH 06/11] when instance has port, then replace it. --- .../manager/service/impl/MonitorServiceImpl.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index aa3717ce23e..1cfb511d2fb 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -82,14 +82,7 @@ import org.springframework.web.multipart.MultipartFile; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -397,7 +390,10 @@ public void modifyMonitor(Monitor monitor, List params, String collector, String portWithMark = (Objects.isNull(portParam) || !StringUtils.hasText(portParam.getParamValue())) ? "" : SignConstants.DOUBLE_MARK + portParam.getParamValue(); - if (Objects.nonNull(instance) && !IpDomainUtil.isHasPortWithMark(instance)) { + if (IpDomainUtil.isHasPortWithMark(instance)){ + instance = Arrays.stream(instance.split(":")).findFirst().orElse(""); + } + if (Objects.nonNull(instance)) { instance = instance + portWithMark; } From 48e8e94f1069e7cfef375a1af41d9d6333e738cd Mon Sep 17 00:00:00 2001 From: liwei Date: Mon, 6 Apr 2026 09:36:04 +0800 Subject: [PATCH 07/11] add test for modifyMonitor. --- .../manager/service/MonitorServiceTest.java | 106 +++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java index a7351ee2219..278bd31e81a 100644 --- a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java +++ b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java @@ -624,7 +624,7 @@ void modifyMonitor() { } catch (IllegalArgumentException e) { assertEquals("Can not modify monitor's app type", e.getMessage()); } - reset(); + reset(monitorDao); Monitor existOkMonitor = Monitor.builder().jobId(1L).intervals(1).app("app").name("memory").instance("host") .id(monitorId).build(); when(monitorDao.findById(monitorId)).thenReturn(Optional.of(existOkMonitor)); @@ -632,6 +632,110 @@ void modifyMonitor() { assertThrows(MonitorDatabaseException.class, () -> monitorService.modifyMonitor(dto.getMonitor(), dto.getParams(), null, null)); + + // 测试逻辑:当 scrape 不等于 static(且不为空),并且 instance 为空时,instance 应被设置为 "unknown" + reset(monitorDao); // 重置前面代码中对 monitorDao 的 mock + + long testSdMonitorId = 2L; + Monitor sdMonitor = Monitor.builder() + .id(testSdMonitorId) + .app("app") + .name("memory") + .scrape("custom_sd") // 非 static + .instance("") // instance 为空 + .intervals(1) + .build(); + + Monitor preSdMonitor = Monitor.builder() + .id(testSdMonitorId) + .app("app") + .name("memory") + .jobId(2L) + .status(CommonConstants.MONITOR_UP_CODE) // 保证非暂停状态,走到后续逻辑 + .build(); + + List emptyParams = new ArrayList<>(); + Job mockJob = new Job(); + mockJob.setMetrics(new ArrayList<>()); + mockJob.setParams(new ArrayList<>()); + + when(monitorDao.findById(testSdMonitorId)).thenReturn(Optional.of(preSdMonitor)); + when(appService.getAppDefine("custom_sd")).thenReturn(mockJob); // 根据 scrape 查询 job + when(collectJobScheduling.updateAsyncCollectJob(any(Job.class))).thenReturn(2L); + when(monitorDao.save(any(Monitor.class))).thenReturn(sdMonitor); + + assertDoesNotThrow(() -> monitorService.modifyMonitor(sdMonitor, emptyParams, null, null)); + + // 断言 instance 被赋值为 unknown + assertEquals("unknown", sdMonitor.getInstance()); + + // 测试逻辑:端口验证(有变无,无变有) + // 场景一:原来没带 port mark(或者带有),现在 params 里面 port 有值 + reset(monitorDao); + + long testPortMonitorId = 3L; + Monitor portMonitor = Monitor.builder() + .id(testPortMonitorId) + .app("app") + .name("memory3") + .scrape(CommonConstants.SCRAPE_STATIC) + .instance("127.0.0.1") + .intervals(1) + .build(); + + Monitor prePortMonitor = Monitor.builder() + .id(testPortMonitorId) + .app("app") + .name("memory3") + .jobId(3L) + .status(CommonConstants.MONITOR_UP_CODE) + .build(); + + List portParams = new ArrayList<>(); + portParams.add(Param.builder().field(MonitorServiceImpl.PARAM_FIELD_PORT).paramValue("8080").build()); + + when(monitorDao.findById(testPortMonitorId)).thenReturn(Optional.of(prePortMonitor)); + when(appService.getAppDefine("app")).thenReturn(mockJob); + when(collectJobScheduling.updateAsyncCollectJob(any(Job.class))).thenReturn(3L); + when(monitorDao.save(any(Monitor.class))).thenReturn(portMonitor); + + assertDoesNotThrow(() -> monitorService.modifyMonitor(portMonitor, portParams, null, null)); + + // 断言 instance 追加了 port + assertEquals("127.0.0.1:8080", portMonitor.getInstance()); + + // 场景二:原来 instance 带有 port mark,现在 params 里面 port 没值 + reset(monitorDao); + + long testNoPortMonitorId = 4L; + Monitor noPortMonitor = Monitor.builder() + .id(testNoPortMonitorId) + .app("app") + .name("memory") + .scrape(CommonConstants.SCRAPE_STATIC) + .instance("127.0.0.1:8080") // 这里原始 instance 带了 port + .intervals(1) + .build(); + + Monitor preNoPortMonitor = Monitor.builder() + .id(testNoPortMonitorId) + .app("app") + .name("memory") + .jobId(4L) + .status(CommonConstants.MONITOR_UP_CODE) + .build(); + + List noPortParams = new ArrayList<>(); // empty + + when(monitorDao.findById(testNoPortMonitorId)).thenReturn(Optional.of(preNoPortMonitor)); + when(appService.getAppDefine("app")).thenReturn(mockJob); + when(collectJobScheduling.updateAsyncCollectJob(any(Job.class))).thenReturn(4L); + when(monitorDao.save(any(Monitor.class))).thenReturn(noPortMonitor); + + assertDoesNotThrow(() -> monitorService.modifyMonitor(noPortMonitor, noPortParams, null, null)); + + // 断言 instance 的 port mark 被移除 + assertEquals("127.0.0.1", noPortMonitor.getInstance()); } @Test From 4bdaf65413c312b192a8f5d394b3688f2c49957b Mon Sep 17 00:00:00 2001 From: liwei Date: Sat, 11 Apr 2026 08:47:51 +0800 Subject: [PATCH 08/11] translate chinese remark to english. --- .../manager/service/MonitorServiceTest.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java index 278bd31e81a..a9cec7ec34b 100644 --- a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java +++ b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MonitorServiceTest.java @@ -633,16 +633,16 @@ void modifyMonitor() { assertThrows(MonitorDatabaseException.class, () -> monitorService.modifyMonitor(dto.getMonitor(), dto.getParams(), null, null)); - // 测试逻辑:当 scrape 不等于 static(且不为空),并且 instance 为空时,instance 应被设置为 "unknown" - reset(monitorDao); // 重置前面代码中对 monitorDao 的 mock + // Test logic: When scrape is not equal to static (and not null), and instance is empty, instance should be set to "unknown" + reset(monitorDao); // Reset the mock of monitorDao from previous code long testSdMonitorId = 2L; Monitor sdMonitor = Monitor.builder() .id(testSdMonitorId) .app("app") .name("memory") - .scrape("custom_sd") // 非 static - .instance("") // instance 为空 + .scrape("custom_sd") // Not static + .instance("") // Instance is empty .intervals(1) .build(); @@ -651,7 +651,7 @@ void modifyMonitor() { .app("app") .name("memory") .jobId(2L) - .status(CommonConstants.MONITOR_UP_CODE) // 保证非暂停状态,走到后续逻辑 + .status(CommonConstants.MONITOR_UP_CODE) // Ensure not paused state to proceed to following logic .build(); List emptyParams = new ArrayList<>(); @@ -660,17 +660,17 @@ void modifyMonitor() { mockJob.setParams(new ArrayList<>()); when(monitorDao.findById(testSdMonitorId)).thenReturn(Optional.of(preSdMonitor)); - when(appService.getAppDefine("custom_sd")).thenReturn(mockJob); // 根据 scrape 查询 job + when(appService.getAppDefine("custom_sd")).thenReturn(mockJob); // Query job based on scrape when(collectJobScheduling.updateAsyncCollectJob(any(Job.class))).thenReturn(2L); when(monitorDao.save(any(Monitor.class))).thenReturn(sdMonitor); assertDoesNotThrow(() -> monitorService.modifyMonitor(sdMonitor, emptyParams, null, null)); - // 断言 instance 被赋值为 unknown + // Assert that instance is assigned as unknown assertEquals("unknown", sdMonitor.getInstance()); - // 测试逻辑:端口验证(有变无,无变有) - // 场景一:原来没带 port mark(或者带有),现在 params 里面 port 有值 + // Test logic: Port verification (from none to exists, from exists to none) + // Scenario 1: Originally without port mark (or with one), now port has value in params reset(monitorDao); long testPortMonitorId = 3L; @@ -701,10 +701,10 @@ void modifyMonitor() { assertDoesNotThrow(() -> monitorService.modifyMonitor(portMonitor, portParams, null, null)); - // 断言 instance 追加了 port + // Assert that instance appended the port assertEquals("127.0.0.1:8080", portMonitor.getInstance()); - // 场景二:原来 instance 带有 port mark,现在 params 里面 port 没值 + // Scenario 2: Originally instance has port mark, now port has no value in params reset(monitorDao); long testNoPortMonitorId = 4L; @@ -713,7 +713,7 @@ void modifyMonitor() { .app("app") .name("memory") .scrape(CommonConstants.SCRAPE_STATIC) - .instance("127.0.0.1:8080") // 这里原始 instance 带了 port + .instance("127.0.0.1:8080") // Original instance has port .intervals(1) .build(); @@ -734,7 +734,7 @@ void modifyMonitor() { assertDoesNotThrow(() -> monitorService.modifyMonitor(noPortMonitor, noPortParams, null, null)); - // 断言 instance 的 port mark 被移除 + // Assert that the port mark in instance is removed assertEquals("127.0.0.1", noPortMonitor.getInstance()); } From 31b2e1973fa75942b95ed2d413a9a3841d42e78d Mon Sep 17 00:00:00 2001 From: liwei Date: Sat, 11 Apr 2026 19:20:08 +0800 Subject: [PATCH 09/11] refactor(manager): optimize imports to avoid wildcard in MonitorServiceImpl --- .../manager/service/impl/MonitorServiceImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index 1cfb511d2fb..359f3eba580 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -82,7 +82,15 @@ import org.springframework.web.multipart.MultipartFile; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.Arrays; import java.util.stream.Collectors; /** From 005590ad010646575dbbb4d384323a251551639f Mon Sep 17 00:00:00 2001 From: liwei Date: Sat, 11 Apr 2026 19:38:23 +0800 Subject: [PATCH 10/11] refactor: remove dead code in MonitorServiceImpl Removed the unnecessary check for port existence in the `instance` string, as `instance` will not contain port information in this context. --- .../manager/service/impl/MonitorServiceImpl.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index 359f3eba580..5d46d681ae5 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -388,7 +388,6 @@ public void modifyMonitor(Monitor monitor, List params, String collector, if (!isStatic && !StringUtils.hasText(monitor.getInstance())) { monitor.setInstance("unknown"); } - String instance = monitor.getInstance(); // The port field may be null Param portParam = params.stream() @@ -398,14 +397,7 @@ public void modifyMonitor(Monitor monitor, List params, String collector, String portWithMark = (Objects.isNull(portParam) || !StringUtils.hasText(portParam.getParamValue())) ? "" : SignConstants.DOUBLE_MARK + portParam.getParamValue(); - if (IpDomainUtil.isHasPortWithMark(instance)){ - instance = Arrays.stream(instance.split(":")).findFirst().orElse(""); - } - if (Objects.nonNull(instance)) { - instance = instance + portWithMark; - } - - + instance = instance + portWithMark; monitor.setInstance(instance); if (preMonitor.getStatus() != CommonConstants.MONITOR_PAUSED_CODE) { From 454f92f704abc26faf99b65e6e1779900618e963 Mon Sep 17 00:00:00 2001 From: liwei Date: Sat, 25 Apr 2026 17:09:27 +0800 Subject: [PATCH 11/11] remove unused import --- .../hertzbeat/manager/service/impl/MonitorServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java index 5d46d681ae5..9d6287487af 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java @@ -90,7 +90,6 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.Arrays; import java.util.stream.Collectors; /**