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 d5cf683f4f [bugfix] Fix imported monitor instance being empty due to 
host/instan… (#4142)
d5cf683f4f is described below

commit d5cf683f4f03b619fbdf3adcad25f227eaa60fe7
Author: starryCoder <[email protected]>
AuthorDate: Fri May 29 00:19:38 2026 +0800

    [bugfix] Fix imported monitor instance being empty due to host/instan… 
(#4142)
    
    Co-authored-by: Tomsun28 <[email protected]>
    Co-authored-by: lynx009 <[email protected]>
---
 .../service/impl/AbstractImExportServiceImpl.java  | 11 +++
 .../manager/service/JsonImExportServiceTest.java   | 80 +++++++++++++++++++++-
 2 files changed, 89 insertions(+), 2 deletions(-)

diff --git 
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/AbstractImExportServiceImpl.java
 
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/AbstractImExportServiceImpl.java
index 7bf85944de..1dab35ae7b 100644
--- 
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/AbstractImExportServiceImpl.java
+++ 
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/AbstractImExportServiceImpl.java
@@ -127,6 +127,17 @@ public abstract class AbstractImExportServiceImpl 
implements ImExportService {
         if (exportMonitor.monitor != null) {
             // Add one more null check
             BeanUtils.copyProperties(exportMonitor.monitor, monitor);
+            if (exportMonitor.params != null) {
+                String host = exportMonitor.params.stream()
+                        .filter(p -> "host".equals(p.field)).findFirst()
+                        .map(p -> p.value).orElse(null);
+                String port = exportMonitor.params.stream()
+                        .filter(p -> "port".equals(p.field)).findFirst()
+                        .map(p -> p.value).orElse(null);
+                if (host != null) {
+                    monitor.setInstance(port != null ? host + ":" + port : 
host);
+                }
+            }
         }
         monitorDto.setMonitor(monitor);
         if (exportMonitor.getMonitor() != null) {
diff --git 
a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/JsonImExportServiceTest.java
 
b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/JsonImExportServiceTest.java
index 3c36a18c33..57c69168b5 100644
--- 
a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/JsonImExportServiceTest.java
+++ 
b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/JsonImExportServiceTest.java
@@ -21,26 +21,47 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.doNothing;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.lang.reflect.Field;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
+import org.apache.hertzbeat.common.entity.manager.Monitor;
+import org.apache.hertzbeat.common.entity.manager.Param;
+import org.apache.hertzbeat.manager.config.ManagerSseManager;
 import org.apache.hertzbeat.manager.service.impl.AbstractImExportServiceImpl;
 import org.apache.hertzbeat.manager.service.impl.JsonImExportServiceImpl;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
 
 /**
  * Test case for {@link JsonImExportServiceImpl}
  */
-
+@ExtendWith(MockitoExtension.class)
 class JsonImExportServiceTest {
 
     private JsonImExportServiceImpl jsonImExportService;
 
+    @Mock
+    private MonitorService monitorService;
+
+    @Mock
+    private ManagerSseManager managerSseManager;
+
     @BeforeEach
-    public void setUp() {
+    public void setUp() throws Exception {
         jsonImExportService = new JsonImExportServiceImpl();
+        Field monitorServiceField = 
jsonImExportService.getClass().getSuperclass().getDeclaredField("monitorService");
+        monitorServiceField.setAccessible(true);
+        monitorServiceField.set(jsonImExportService, monitorService);
+        Field sseField = 
jsonImExportService.getClass().getSuperclass().getDeclaredField("managerSseManager");
+        sseField.setAccessible(true);
+        sseField.set(jsonImExportService, managerSseManager);
     }
 
     @Test
@@ -89,4 +110,59 @@ class JsonImExportServiceTest {
         assertEquals("JSON", jsonImExportService.type());
     }
 
+    @Test
+    void testImportConfig_shouldSetInstanceFromHostAndPortParams() {
+        String json = 
"[{\"monitor\":{\"name\":\"test\",\"app\":\"windows\",\"intervals\":6000,\"status\":1},"
+                + 
"\"params\":[{\"field\":\"host\",\"type\":1,\"value\":\"localhost\"},"
+                + "{\"field\":\"port\",\"type\":0,\"value\":\"161\"}]}]";
+
+        ArgumentCaptor<Monitor> monitorCaptor = 
ArgumentCaptor.forClass(Monitor.class);
+        ArgumentCaptor<List<Param>> paramsCaptor = 
ArgumentCaptor.forClass(List.class);
+        doNothing().when(monitorService).addMonitor(monitorCaptor.capture(), 
paramsCaptor.capture(),
+                org.mockito.Mockito.any(), org.mockito.Mockito.any());
+
+        ByteArrayInputStream bis = new 
ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
+        jsonImExportService.importConfig("test.json", bis);
+
+        Monitor captured = monitorCaptor.getValue();
+        assertEquals("localhost:161", captured.getInstance());
+        assertEquals("test", captured.getName());
+        assertEquals("windows", captured.getApp());
+
+        List<Param> capturedParams = paramsCaptor.getValue();
+        assertNotNull(capturedParams);
+        assertEquals(2, capturedParams.size());
+    }
+
+    @Test
+    void testImportConfig_shouldSetInstanceWithHostOnly() {
+        String json = 
"[{\"monitor\":{\"name\":\"test\",\"app\":\"linux\",\"intervals\":6000,\"status\":1},"
+                + 
"\"params\":[{\"field\":\"host\",\"type\":1,\"value\":\"192.168.1.1\"}]}]";
+
+        ArgumentCaptor<Monitor> monitorCaptor = 
ArgumentCaptor.forClass(Monitor.class);
+        doNothing().when(monitorService).addMonitor(monitorCaptor.capture(),
+                org.mockito.Mockito.any(), org.mockito.Mockito.any(), 
org.mockito.Mockito.any());
+
+        ByteArrayInputStream bis = new 
ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
+        jsonImExportService.importConfig("test.json", bis);
+
+        Monitor captured = monitorCaptor.getValue();
+        assertEquals("192.168.1.1", captured.getInstance());
+    }
+
+    @Test
+    void testImportConfig_shouldHandleNoHostParam() {
+        String json = 
"[{\"monitor\":{\"name\":\"test\",\"app\":\"website\",\"intervals\":6000,\"status\":1},"
+                + 
"\"params\":[{\"field\":\"url\",\"type\":1,\"value\":\"http://example.com\"}]}]";;
+
+        ArgumentCaptor<Monitor> monitorCaptor = 
ArgumentCaptor.forClass(Monitor.class);
+        doNothing().when(monitorService).addMonitor(monitorCaptor.capture(),
+                org.mockito.Mockito.any(), org.mockito.Mockito.any(), 
org.mockito.Mockito.any());
+
+        ByteArrayInputStream bis = new 
ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
+        jsonImExportService.importConfig("test.json", bis);
+
+        Monitor captured = monitorCaptor.getValue();
+        assertEquals(null, captured.getInstance());
+    }
 }


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

Reply via email to