From ccf67e27474e04bbe6029bc9ce20b309f54bc7c3 Mon Sep 17 00:00:00 2001 From: wilmerdooley Date: Sat, 13 Jun 2026 21:17:47 +0000 Subject: [PATCH] fix: avoid blocking modify monitor by redundant detect call Signed-off-by: wilmerdooley --- .../service/impl/MonitorServiceImpl.java | 8 +--- .../manager/service/MonitorServiceTest.java | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 6 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..679c6e875e2 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 @@ -431,12 +431,6 @@ public void modifyMonitor(Monitor monitor, List params, String collector, newJobId = collectJobScheduling.updateAsyncCollectJob(appDefine, collector); } monitor.setJobId(newJobId); - - // execute only in non paused status - try { - detectMonitor(monitor, params, collector); - } catch (Exception ignored) { - } } // After the update is successfully released, refresh the database @@ -451,6 +445,8 @@ public void modifyMonitor(Monitor monitor, List params, String collector, // force update gmtUpdate time, due the case: monitor not change, param change. // we also think monitor change monitor.setGmtUpdate(LocalDateTime.now()); + // preserve the live status owned by the real-time collection path; the modify request must not overwrite it + monitor.setStatus(preMonitor.getStatus()); // update or open grafana dashboard if (monitor.getApp().equals(CommonConstants.PROMETHEUS) && grafanaDashboard != null) { if (grafanaDashboard.isEnabled()) { 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..3f682f933db 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 @@ -65,6 +65,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.aggregator.ArgumentsAccessor; import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -634,6 +635,46 @@ void modifyMonitor() { () -> monitorService.modifyMonitor(dto.getMonitor(), dto.getParams(), null, null)); } + @Test + void testModifyMonitorPreservesLiveStatus() { + long monitorId = 1L; + List params = Collections.singletonList(Param.builder() + .field("field") + .paramValue("value") + .build()); + Monitor preMonitor = Monitor.builder().jobId(1L).intervals(1).app("app").name("memory").instance("host") + .id(monitorId).status(CommonConstants.MONITOR_UP_CODE).build(); + Monitor monitor = Monitor.builder().jobId(1L).intervals(1).app("app").name("memory").instance("host") + .id(monitorId).status(CommonConstants.MONITOR_PAUSED_CODE).build(); + Job job = new Job(); + job.setApp(monitor.getApp()); + when(monitorDao.findById(monitorId)).thenReturn(Optional.of(preMonitor)); + when(tagService.determineNewLabels(any())).thenReturn(Collections.emptyList()); + when(appService.getAppDefine(monitor.getApp())).thenReturn(job); + when(collectJobScheduling.updateAsyncCollectJob(any(Job.class))).thenReturn(1L); + + monitorService.modifyMonitor(monitor, params, null, null); + + ArgumentCaptor monitorCaptor = ArgumentCaptor.forClass(Monitor.class); + verify(monitorDao).save(monitorCaptor.capture()); + assertEquals(CommonConstants.MONITOR_UP_CODE, monitorCaptor.getValue().getStatus()); + + reset(monitorDao, tagService, appService, collectJobScheduling, paramDao, collectorMonitorBindDao); + long pausedMonitorId = 2L; + Monitor pausedPreMonitor = Monitor.builder().jobId(2L).intervals(1).app("app").name("memory").instance("host") + .id(pausedMonitorId).status(CommonConstants.MONITOR_PAUSED_CODE).build(); + Monitor pausedMonitor = Monitor.builder().jobId(2L).intervals(1).app("app").name("memory").instance("host") + .id(pausedMonitorId).status(CommonConstants.MONITOR_UP_CODE).build(); + when(monitorDao.findById(pausedMonitorId)).thenReturn(Optional.of(pausedPreMonitor)); + when(tagService.determineNewLabels(any())).thenReturn(Collections.emptyList()); + + monitorService.modifyMonitor(pausedMonitor, params, null, null); + + monitorCaptor = ArgumentCaptor.forClass(Monitor.class); + verify(monitorDao).save(monitorCaptor.capture()); + assertEquals(CommonConstants.MONITOR_PAUSED_CODE, monitorCaptor.getValue().getStatus()); + } + @Test void deleteMonitor() { Set ids = new HashSet<>();