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]