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..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 @@ -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,12 +167,12 @@ 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) { appDefine.setSd(true); - monitor.setInstance("unknow"); + monitor.setInstance("unknown"); } if (CommonConstants.PROMETHEUS.equals(monitor.getApp())) { appDefine.setApp(CommonConstants.PROMETHEUS_APP_PREFIX + monitor.getName()); @@ -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); @@ -382,22 +382,23 @@ 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 && !StringUtils.hasText(monitor.getInstance())) { + monitor.setInstance("unknown"); + } 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)) { - instance = instance + portWithMark; - } + ? "" + : SignConstants.DOUBLE_MARK + portParam.getParamValue(); + instance = instance + portWithMark; 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(); @@ -416,13 +417,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) { @@ -444,8 +445,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. @@ -482,7 +483,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); @@ -523,28 +524,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 { @@ -554,7 +555,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)) { @@ -579,7 +580,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)); @@ -633,12 +634,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()); @@ -651,12 +652,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; } @@ -665,7 +666,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) { @@ -681,20 +682,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); } }); @@ -702,7 +703,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); @@ -756,15 +757,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(); @@ -781,20 +782,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); } }); @@ -878,8 +879,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; @@ -914,18 +915,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) { 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..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 @@ -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)); + + // 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") // Not static + .instance("") // Instance is empty + .intervals(1) + .build(); + + Monitor preSdMonitor = Monitor.builder() + .id(testSdMonitorId) + .app("app") + .name("memory") + .jobId(2L) + .status(CommonConstants.MONITOR_UP_CODE) // Ensure not paused state to proceed to following logic + .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); // 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)); + + // Assert that instance is assigned as unknown + assertEquals("unknown", sdMonitor.getInstance()); + + // 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; + 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)); + + // Assert that instance appended the port + assertEquals("127.0.0.1:8080", portMonitor.getInstance()); + + // Scenario 2: Originally instance has port mark, now port has no value in params + 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") // Original instance has 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)); + + // Assert that the port mark in instance is removed + assertEquals("127.0.0.1", noPortMonitor.getInstance()); } @Test