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

gongchao 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 5c3d1a04de [improve] SLS integrated access supports merged alarm 
resolution (#3835)
5c3d1a04de is described below

commit 5c3d1a04de8904b2fa19e9fb4a250eca8549701d
Author: Duansg <[email protected]>
AuthorDate: Fri Oct 31 21:00:34 2025 +0800

    [improve] SLS integrated access supports merged alarm resolution (#3835)
---
 .../impl/AlibabaCloudSlsExternAlertService.java    | 25 +++++++++++++---
 .../AlibabaCloudSlsExternAlertServiceTest.java     | 35 ++++++++++++++++++++++
 .../org/apache/hertzbeat/common/util/JsonUtil.java | 22 ++++++++++++++
 .../apache/hertzbeat/common/util/JsonUtilTest.java | 15 ++++++++++
 4 files changed, 93 insertions(+), 4 deletions(-)

diff --git 
a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/AlibabaCloudSlsExternAlertService.java
 
b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/AlibabaCloudSlsExternAlertService.java
index 220466eb97..89260fd254 100644
--- 
a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/AlibabaCloudSlsExternAlertService.java
+++ 
b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/AlibabaCloudSlsExternAlertService.java
@@ -17,7 +17,9 @@
 
 package org.apache.hertzbeat.alert.service.impl;
 
+import com.fasterxml.jackson.core.type.TypeReference;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hertzbeat.alert.dto.AlibabaCloudSlsExternAlert;
 import org.apache.hertzbeat.alert.reduce.AlarmCommonReduce;
@@ -33,7 +35,9 @@ import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
@@ -46,19 +50,32 @@ public class AlibabaCloudSlsExternAlertService implements 
ExternAlertService {
 
     private final AlarmCommonReduce alarmCommonReduce;
 
+    private static final AlibabaCloudSlsConverter CONVERTER = new 
AlibabaCloudSlsConverter();
+
     public AlibabaCloudSlsExternAlertService(AlarmCommonReduce 
alarmCommonReduce) {
         this.alarmCommonReduce = alarmCommonReduce;
     }
 
     @Override
     public void addExternAlert(String content) {
-        AlibabaCloudSlsExternAlert externAlert = JsonUtil.fromJson(content, 
AlibabaCloudSlsExternAlert.class);
-        if (externAlert == null) {
+        List<AlibabaCloudSlsExternAlert> externAlerts = new ArrayList<>();
+        if (BooleanUtils.isTrue(JsonUtil.isArray(content))) {
+            TypeReference<List<AlibabaCloudSlsExternAlert>> typeReference = 
new TypeReference<>() {};
+            externAlerts = JsonUtil.fromJson(content, typeReference);
+        } else {
+            AlibabaCloudSlsExternAlert externAlert = 
JsonUtil.fromJson(content, AlibabaCloudSlsExternAlert.class);
+            if (null != externAlert) {
+                externAlerts.add(externAlert);
+            }
+        }
+        if (null == externAlerts || externAlerts.isEmpty()) {
             log.warn("Failure to parse external alert content. content: {}", 
content);
             return;
         }
-        SingleAlert singleAlert = new 
AlibabaCloudSlsConverter().convert(externAlert);
-        alarmCommonReduce.reduceAndSendAlarm(singleAlert);
+        for (AlibabaCloudSlsExternAlert externAlert : externAlerts) {
+            SingleAlert singleAlert = CONVERTER.convert(externAlert);
+            alarmCommonReduce.reduceAndSendAlarm(singleAlert);
+        }
     }
 
     @Override
diff --git 
a/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/AlibabaCloudSlsExternAlertServiceTest.java
 
b/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/AlibabaCloudSlsExternAlertServiceTest.java
index d3aeb5aa95..1ef8917f14 100644
--- 
a/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/AlibabaCloudSlsExternAlertServiceTest.java
+++ 
b/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/AlibabaCloudSlsExternAlertServiceTest.java
@@ -28,9 +28,12 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.beans.BeanUtils;
 
 import java.time.Instant;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -147,4 +150,36 @@ public class AlibabaCloudSlsExternAlertServiceTest {
         verify(alarmCommonReduce, 
times(1)).reduceAndSendAlarm(any(SingleAlert.class));
     }
 
+    @Test
+    void testAddMergeExternAlert() {
+        String source = externAlertService.supportSource();
+        assertEquals("alibabacloud-sls", source);
+
+        AlibabaCloudSlsExternAlert externAlert = new 
AlibabaCloudSlsExternAlert();
+        externAlert.setAlertName("Test SLS alert");
+        externAlert.setFireTime((int) Instant.now().getEpochSecond());
+        externAlert.setAlertTime((int) Instant.now().getEpochSecond());
+        externAlert.setRegion("cn-hangzhou");
+        externAlert.setProject("project");
+        externAlert.setStatus("firing");
+        
externAlert.setSeverity(AlibabaCloudSlsExternAlert.Severity.HIGH.getStatus());
+
+        Map<String, String> labels = new HashMap<>();
+        labels.put("labels-k", "labels-v");
+        externAlert.setLabels(labels);
+
+        Map<String, String> annotations = new HashMap<>();
+        annotations.put("annotations-k", "annotations-v");
+        externAlert.setAnnotations(annotations);
+
+        AlibabaCloudSlsExternAlert externAlert1 = new 
AlibabaCloudSlsExternAlert();
+        BeanUtils.copyProperties(externAlert, externAlert1);
+
+        List<AlibabaCloudSlsExternAlert> externAlerts = new ArrayList<>();
+        externAlerts.add(externAlert);
+        externAlerts.add(externAlert1);
+        externAlertService.addExternAlert(JsonUtil.toJson(externAlerts));
+        verify(alarmCommonReduce, 
times(2)).reduceAndSendAlarm(any(SingleAlert.class));
+    }
+
 }
\ No newline at end of file
diff --git 
a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/util/JsonUtil.java 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/util/JsonUtil.java
index e996c18779..b7a46e3a03 100644
--- 
a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/util/JsonUtil.java
+++ 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/util/JsonUtil.java
@@ -121,4 +121,26 @@ public final class JsonUtil {
             return false;
         }
     }
+
+    public static Boolean isArray(String jsonStr) {
+        if (!isJsonLike(jsonStr)) {
+            return false;
+        }
+        try {
+            JsonNode jsonNode = OBJECT_MAPPER.readTree(jsonStr);
+            return jsonNode.isArray();
+        } catch (Exception ignore) {
+            return false;
+        }
+    }
+
+    public static boolean isJsonLike(String jsonStr) {
+        if (jsonStr == null || jsonStr.trim().isEmpty()) {
+            return false;
+        }
+        jsonStr = jsonStr.trim();
+        char start = jsonStr.charAt(0);
+        char end = jsonStr.charAt(jsonStr.length() - 1);
+        return (start == '{' && end == '}') || (start == '[' && end == ']');
+    }
 }
diff --git 
a/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/util/JsonUtilTest.java
 
b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/util/JsonUtilTest.java
index 8908485cab..88caafb190 100644
--- 
a/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/util/JsonUtilTest.java
+++ 
b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/util/JsonUtilTest.java
@@ -18,8 +18,10 @@
 package org.apache.hertzbeat.common.util;
 
 import static org.apache.hertzbeat.common.util.JsonUtil.isJsonStr;
+import static org.apache.hertzbeat.common.util.JsonUtil.isArray;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -76,4 +78,17 @@ class JsonUtilTest {
         assertFalse(isJsonStr("{invalid}"));
     }
 
+    @Test
+    void testIsArray() {
+        String jsonStringNull = "{\"name\":\"John\", \"age\":30";
+        assertEquals(Boolean.FALSE, isArray(jsonStringNull));
+
+        String jsonString = "{\"name\":\"John\", \"age\":30}";
+        assertNotNull(isArray(jsonString));
+        assertEquals(Boolean.FALSE, isArray(jsonString));
+
+        String jsonStringArrays = "[{\"name\":\"John\"}, {\"name\":\"Doe\"}]";
+        assertNotNull(isArray(jsonStringArrays));
+        assertEquals(Boolean.TRUE, isArray(jsonStringArrays));
+    }
 }


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

Reply via email to