This is an automated email from the ASF dual-hosted git repository.

tomsun28 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/master by this push:
     new 45416c475e fix: avoid blocking modify monitor by redundant detect call 
(#4154)
45416c475e is described below

commit 45416c475e5ff8135cce2a66bc440c207d6910d5
Author: wilmerdooley <[email protected]>
AuthorDate: Sun Jun 21 21:47:16 2026 -0700

    fix: avoid blocking modify monitor by redundant detect call (#4154)
---
 .../manager/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 d9fe4b9638..63ed4fb68d 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
@@ -433,12 +433,6 @@ public class MonitorServiceImpl implements MonitorService {
                 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
@@ -453,6 +447,8 @@ public class MonitorServiceImpl implements MonitorService {
             // 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 a7351ee221..3f682f933d 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.api.extension.ExtendWith;
 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 @@ class MonitorServiceTest {
                 () -> monitorService.modifyMonitor(dto.getMonitor(), 
dto.getParams(), null, null));
     }
 
+    @Test
+    void testModifyMonitorPreservesLiveStatus() {
+        long monitorId = 1L;
+        List<Param> 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<Monitor> 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<Long> ids = new HashSet<>();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to