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]