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 97f27b4cb [improve] support multiple receivers. (#1731)
97f27b4cb is described below

commit 97f27b4cbd32b8ad5e255df12b39e06d4004ea73
Author: Logic <[email protected]>
AuthorDate: Sun Apr 14 20:09:32 2024 +0800

    [improve] support multiple receivers. (#1731)
---
 .../manager/JsonLongListAttributeConverter.java    |  32 ++++
 .../manager/JsonStringListAttributeConverter.java  |  28 ++++
 .../manager/JsonTagListAttributeConverter.java     |  15 +-
 .../common/entity/manager/NoticeRule.java          |   8 +-
 .../common/entity/message/CollectRep.java          | 164 ++++++++++-----------
 .../manager/component/alerter/DispatcherAlarm.java |  12 +-
 .../controller/NoticeConfigControllerTest.java     |   4 +-
 .../hertzbeat/manager/dao/NoticeRuleDaoTest.java   |  12 +-
 .../manager/service/NoticeConfigServiceTest.java   |   8 +-
 web-app/src/app/pojo/NoticeRule.ts                 |   4 +-
 .../alert/alert-notice/alert-notice.component.html |   1 +
 .../alert/alert-notice/alert-notice.component.ts   |  27 ++--
 12 files changed, 196 insertions(+), 119 deletions(-)

diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonLongListAttributeConverter.java
 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonLongListAttributeConverter.java
new file mode 100644
index 000000000..00abedd95
--- /dev/null
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonLongListAttributeConverter.java
@@ -0,0 +1,32 @@
+package org.apache.hertzbeat.common.entity.manager;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import jakarta.persistence.AttributeConverter;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hertzbeat.common.util.JsonUtil;
+import java.util.List;
+
+
+/**
+ * json str to id list
+ */
+
+public class JsonLongListAttributeConverter implements 
AttributeConverter<List<Long>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<Long> attribute) {
+        return JsonUtil.toJson(attribute);
+
+    }
+
+    @Override
+    public List<Long> convertToEntityAttribute(String dbData) {
+        TypeReference<List<Long>> typeReference = new TypeReference<>() {};
+        List<Long> longList = JsonUtil.fromJson(dbData, typeReference);
+        if (longList == null && !dbData.isEmpty()) {
+            if (StringUtils.isNumeric(dbData)){
+                return List.of(Long.parseLong(dbData));
+            }
+            else throw new NumberFormatException("String convert to Long 
error");
+        }else return longList;
+    }
+}
diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonStringListAttributeConverter.java
 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonStringListAttributeConverter.java
new file mode 100644
index 000000000..79a3b1f8b
--- /dev/null
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonStringListAttributeConverter.java
@@ -0,0 +1,28 @@
+package org.apache.hertzbeat.common.entity.manager;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import jakarta.persistence.AttributeConverter;
+import org.apache.hertzbeat.common.util.JsonUtil;
+
+import java.util.List;
+
+
+/**
+ * Convert the list of strings to a JSON string
+ */
+public class JsonStringListAttributeConverter implements 
AttributeConverter<List<String>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<String> attribute) {
+        return JsonUtil.toJson(attribute);
+
+    }
+
+    @Override
+    public List<String> convertToEntityAttribute(String dbData) {
+        TypeReference<List<String>> typeReference = new TypeReference<>() {};
+        List<String> stringList = JsonUtil.fromJson(dbData, typeReference);
+        if (stringList == null && !dbData.isEmpty()) {
+            return List.of(dbData);
+        }else return stringList;
+    }
+}
diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonTagListAttributeConverter.java
 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonTagListAttributeConverter.java
index aa447f165..791a701df 100644
--- 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonTagListAttributeConverter.java
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/JsonTagListAttributeConverter.java
@@ -37,18 +37,19 @@ public class JsonTagListAttributeConverter implements 
AttributeConverter<List<Ta
 
     @Override
     public List<TagItem> convertToEntityAttribute(String dbData) {
-        try {
-            TypeReference<List<TagItem>> typeReference = new TypeReference<>() 
{};
-            return JsonUtil.fromJson(dbData, typeReference);
-        } catch (Exception e) {
-            // history data handler
-            TypeReference<Map<String, String>> typeReference = new 
TypeReference<>() {};
-            Map<String, String> map = JsonUtil.fromJson(dbData, typeReference);
+        TypeReference<List<TagItem>> typeReference = new TypeReference<>() {};
+        List<TagItem> tagItems = JsonUtil.fromJson(dbData, typeReference);
+        if (tagItems == null) {
+            TypeReference<Map<String, String>> mapTypeReference = new 
TypeReference<>() {};
+            Map<String, String> map = JsonUtil.fromJson(dbData, 
mapTypeReference);
             if (map != null) {
                 return map.entrySet().stream().map(entry -> new 
TagItem(entry.getKey(), entry.getValue())).collect(Collectors.toList());
             } else {
                 return null;
             }
+        } else {
+            return tagItems;
         }
+
     }
 }
diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/NoticeRule.java
 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/NoticeRule.java
index 4faf60a98..aa7dba9c2 100644
--- 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/NoticeRule.java
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/NoticeRule.java
@@ -69,14 +69,14 @@ public class NoticeRule {
             description = "接收人ID",
             example = "4324324", accessMode = READ_WRITE)
     @NotNull
-    private Long receiverId;
+    @Convert(converter = JsonLongListAttributeConverter.class)
+    private List<Long> receiverId;
 
     @Schema(title = "Recipient identification",
             description = "接收人标识",
             example = "tom", accessMode = READ_WRITE)
-    @Length(max = 100)
-    @NotNull
-    private String receiverName;
+    @Convert(converter = JsonStringListAttributeConverter.class)
+    private List<String> receiverName;
 
     @Schema(title = "Template ID",
             description = "模板ID",
diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/entity/message/CollectRep.java
 
b/common/src/main/java/org/apache/hertzbeat/common/entity/message/CollectRep.java
index 1df820071..f15206ad4 100644
--- 
a/common/src/main/java/org/apache/hertzbeat/common/entity/message/CollectRep.java
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/entity/message/CollectRep.java
@@ -580,13 +580,13 @@ public final class CollectRep {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_descriptor;
+      return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable
+      return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
               MetricsData.class, Builder.class);
     }
@@ -1202,13 +1202,13 @@ public final class CollectRep {
         MetricsDataOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_descriptor;
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_descriptor;
       }
 
       @Override
       protected FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
                 MetricsData.class, Builder.class);
       }
@@ -1267,7 +1267,7 @@ public final class CollectRep {
       @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_descriptor;
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_descriptor;
       }
 
       @Override
@@ -2085,7 +2085,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder setFields(
           int index, Field.Builder builderForValue) {
@@ -2103,7 +2103,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder addFields(Field value) {
         if (fieldsBuilder_ == null) {
@@ -2123,7 +2123,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder addFields(
           int index, Field value) {
@@ -2144,7 +2144,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder addFields(
           Field.Builder builderForValue) {
@@ -2162,7 +2162,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder addFields(
           int index, Field.Builder builderForValue) {
@@ -2180,7 +2180,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder addAllFields(
           Iterable<? extends Field> values) {
@@ -2199,7 +2199,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder clearFields() {
         if (fieldsBuilder_ == null) {
@@ -2216,7 +2216,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Builder removeFields(int index) {
         if (fieldsBuilder_ == null) {
@@ -2233,7 +2233,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Field.Builder getFieldsBuilder(
           int index) {
@@ -2244,7 +2244,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public FieldOrBuilder getFieldsOrBuilder(
           int index) {
@@ -2258,7 +2258,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public java.util.List<? extends FieldOrBuilder> 
            getFieldsOrBuilderList() {
@@ -2273,7 +2273,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Field.Builder addFieldsBuilder() {
         return getFieldsFieldBuilder().addBuilder(
@@ -2284,7 +2284,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public Field.Builder addFieldsBuilder(
           int index) {
@@ -2296,7 +2296,7 @@ public final class CollectRep {
        * monitoring collect metric field
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.Field 
fields = 9;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.Field 
fields = 9;</code>
        */
       public java.util.List<Field.Builder> 
            getFieldsBuilderList() {
@@ -2334,7 +2334,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public java.util.List<ValueRow> getValuesList() {
         if (valuesBuilder_ == null) {
@@ -2348,7 +2348,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public int getValuesCount() {
         if (valuesBuilder_ == null) {
@@ -2362,7 +2362,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public ValueRow getValues(int index) {
         if (valuesBuilder_ == null) {
@@ -2376,7 +2376,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder setValues(
           int index, ValueRow value) {
@@ -2397,7 +2397,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder setValues(
           int index, ValueRow.Builder builderForValue) {
@@ -2415,7 +2415,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder addValues(ValueRow value) {
         if (valuesBuilder_ == null) {
@@ -2435,7 +2435,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder addValues(
           int index, ValueRow value) {
@@ -2456,7 +2456,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder addValues(
           ValueRow.Builder builderForValue) {
@@ -2474,7 +2474,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder addValues(
           int index, ValueRow.Builder builderForValue) {
@@ -2492,7 +2492,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder addAllValues(
           Iterable<? extends ValueRow> values) {
@@ -2511,7 +2511,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder clearValues() {
         if (valuesBuilder_ == null) {
@@ -2528,7 +2528,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public Builder removeValues(int index) {
         if (valuesBuilder_ == null) {
@@ -2545,7 +2545,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public ValueRow.Builder getValuesBuilder(
           int index) {
@@ -2556,7 +2556,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public ValueRowOrBuilder getValuesOrBuilder(
           int index) {
@@ -2570,7 +2570,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public java.util.List<? extends ValueRowOrBuilder> 
            getValuesOrBuilderList() {
@@ -2585,7 +2585,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public ValueRow.Builder addValuesBuilder() {
         return getValuesFieldBuilder().addBuilder(
@@ -2596,7 +2596,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public ValueRow.Builder addValuesBuilder(
           int index) {
@@ -2608,7 +2608,7 @@ public final class CollectRep {
        * monitoring collect metric data, mapping with the fields
        * </pre>
        *
-       * <code>repeated .org.dromara.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
+       * <code>repeated .org.apache.hertzbeat.common.entity.message.ValueRow 
values = 10;</code>
        */
       public java.util.List<ValueRow.Builder> 
            getValuesBuilderList() {
@@ -2641,10 +2641,10 @@ public final class CollectRep {
       }
 
 
-      // 
@@protoc_insertion_point(builder_scope:org.dromara.hertzbeat.common.entity.message.MetricsData)
+      // 
@@protoc_insertion_point(builder_scope:org.apache.hertzbeat.common.entity.message.MetricsData)
     }
 
-    // 
@@protoc_insertion_point(class_scope:org.dromara.hertzbeat.common.entity.message.MetricsData)
+    // 
@@protoc_insertion_point(class_scope:org.apache.hertzbeat.common.entity.message.MetricsData)
     private static final MetricsData DEFAULT_INSTANCE;
     static {
       DEFAULT_INSTANCE = new MetricsData();
@@ -2682,7 +2682,7 @@ public final class CollectRep {
   }
 
   public interface FieldOrBuilder extends
-      // 
@@protoc_insertion_point(interface_extends:org.dromara.hertzbeat.common.entity.message.Field)
+      // 
@@protoc_insertion_point(interface_extends:org.apache.hertzbeat.common.entity.message.Field)
       com.google.protobuf.MessageOrBuilder {
 
     /**
@@ -2746,11 +2746,11 @@ public final class CollectRep {
     boolean getLabel();
   }
   /**
-   * Protobuf type {@code org.dromara.hertzbeat.common.entity.message.Field}
+   * Protobuf type {@code org.apache.hertzbeat.common.entity.message.Field}
    */
   public static final class Field extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // 
@@protoc_insertion_point(message_implements:org.dromara.hertzbeat.common.entity.message.Field)
+      // 
@@protoc_insertion_point(message_implements:org.apache.hertzbeat.common.entity.message.Field)
       FieldOrBuilder {
   private static final long serialVersionUID = 0L;
     // Use Field.newBuilder() to construct.
@@ -2837,13 +2837,13 @@ public final class CollectRep {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_Field_descriptor;
+      return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_Field_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_Field_fieldAccessorTable
+      return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_Field_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
               Field.class, Builder.class);
     }
@@ -3158,21 +3158,21 @@ public final class CollectRep {
       return builder;
     }
     /**
-     * Protobuf type {@code org.dromara.hertzbeat.common.entity.message.Field}
+     * Protobuf type {@code org.apache.hertzbeat.common.entity.message.Field}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // 
@@protoc_insertion_point(builder_implements:org.dromara.hertzbeat.common.entity.message.Field)
+        // 
@@protoc_insertion_point(builder_implements:org.apache.hertzbeat.common.entity.message.Field)
         FieldOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_Field_descriptor;
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_Field_descriptor;
       }
 
       @Override
       protected FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_Field_fieldAccessorTable
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_Field_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
                 Field.class, Builder.class);
       }
@@ -3209,7 +3209,7 @@ public final class CollectRep {
       @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_Field_descriptor;
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_Field_descriptor;
       }
 
       @Override
@@ -3614,10 +3614,10 @@ public final class CollectRep {
       }
 
 
-      // 
@@protoc_insertion_point(builder_scope:org.dromara.hertzbeat.common.entity.message.Field)
+      // 
@@protoc_insertion_point(builder_scope:org.apache.hertzbeat.common.entity.message.Field)
     }
 
-    // 
@@protoc_insertion_point(class_scope:org.dromara.hertzbeat.common.entity.message.Field)
+    // 
@@protoc_insertion_point(class_scope:org.apache.hertzbeat.common.entity.message.Field)
     private static final Field DEFAULT_INSTANCE;
     static {
       DEFAULT_INSTANCE = new Field();
@@ -3655,7 +3655,7 @@ public final class CollectRep {
   }
 
   public interface ValueRowOrBuilder extends
-      // 
@@protoc_insertion_point(interface_extends:org.dromara.hertzbeat.common.entity.message.ValueRow)
+      // 
@@protoc_insertion_point(interface_extends:org.apache.hertzbeat.common.entity.message.ValueRow)
       com.google.protobuf.MessageOrBuilder {
 
     /**
@@ -3700,11 +3700,11 @@ public final class CollectRep {
         getColumnsBytes(int index);
   }
   /**
-   * Protobuf type {@code org.dromara.hertzbeat.common.entity.message.ValueRow}
+   * Protobuf type {@code org.apache.hertzbeat.common.entity.message.ValueRow}
    */
   public static final class ValueRow extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // 
@@protoc_insertion_point(message_implements:org.dromara.hertzbeat.common.entity.message.ValueRow)
+      // 
@@protoc_insertion_point(message_implements:org.apache.hertzbeat.common.entity.message.ValueRow)
       ValueRowOrBuilder {
   private static final long serialVersionUID = 0L;
     // Use ValueRow.newBuilder() to construct.
@@ -3781,13 +3781,13 @@ public final class CollectRep {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_descriptor;
+      return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable
+      return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
               ValueRow.class, Builder.class);
     }
@@ -4005,21 +4005,21 @@ public final class CollectRep {
       return builder;
     }
     /**
-     * Protobuf type {@code 
org.dromara.hertzbeat.common.entity.message.ValueRow}
+     * Protobuf type {@code 
org.apache.hertzbeat.common.entity.message.ValueRow}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // 
@@protoc_insertion_point(builder_implements:org.dromara.hertzbeat.common.entity.message.ValueRow)
+        // 
@@protoc_insertion_point(builder_implements:org.apache.hertzbeat.common.entity.message.ValueRow)
         ValueRowOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_descriptor;
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_descriptor;
       }
 
       @Override
       protected FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
                 ValueRow.class, Builder.class);
       }
@@ -4050,7 +4050,7 @@ public final class CollectRep {
       @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return 
CollectRep.internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_descriptor;
+        return 
CollectRep.internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_descriptor;
       }
 
       @Override
@@ -4322,10 +4322,10 @@ public final class CollectRep {
       }
 
 
-      // 
@@protoc_insertion_point(builder_scope:org.dromara.hertzbeat.common.entity.message.ValueRow)
+      // 
@@protoc_insertion_point(builder_scope:org.apache.hertzbeat.common.entity.message.ValueRow)
     }
 
-    // 
@@protoc_insertion_point(class_scope:org.dromara.hertzbeat.common.entity.message.ValueRow)
+    // 
@@protoc_insertion_point(class_scope:org.apache.hertzbeat.common.entity.message.ValueRow)
     private static final ValueRow DEFAULT_INSTANCE;
     static {
       DEFAULT_INSTANCE = new ValueRow();
@@ -4363,20 +4363,20 @@ public final class CollectRep {
   }
 
   private static final com.google.protobuf.Descriptors.Descriptor
-    
internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_descriptor;
+    
internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      
internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable;
+      
internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    
internal_static_org_dromara_hertzbeat_common_entity_message_Field_descriptor;
+    
internal_static_org_apache_hertzbeat_common_entity_message_Field_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      
internal_static_org_dromara_hertzbeat_common_entity_message_Field_fieldAccessorTable;
+      
internal_static_org_apache_hertzbeat_common_entity_message_Field_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    
internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_descriptor;
+    
internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      
internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable;
+      
internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -4386,15 +4386,15 @@ public final class CollectRep {
       descriptor;
   static {
     String[] descriptorData = {
-      "\n\021collect_rep.proto\022+org.dromara.hertzbe" +
+      "\n\021collect_rep.proto\022+org.apache.hertzbe" +
       "at.common.entity.message\"\302\002\n\013MetricsData" +
       "\022\n\n\002id\030\001 \001(\004\022\020\n\010tenantId\030\002 
\001(\004\022\013\n\003app\030\003 " +
       "\001(\t\022\017\n\007metrics\030\004 
\001(\t\022\020\n\010priority\030\005 \001(\r\022\014" +
-      "\n\004time\030\006 \001(\004\022?\n\004code\030\007 
\001(\01621.org.dromara" +
+      "\n\004time\030\006 \001(\004\022?\n\004code\030\007 
\001(\01621.org.apache" +
       ".hertzbeat.common.entity.message.Code\022\013\n" +
-      "\003msg\030\010 \001(\t\022B\n\006fields\030\t \003(\01322.org.dromara" 
+
+      "\003msg\030\010 \001(\t\022B\n\006fields\030\t \003(\01322.org.apache" +
       ".hertzbeat.common.entity.message.Field\022E" +
-      "\n\006values\030\n \003(\01325.org.dromara.hertzbeat.c" +
+      "\n\006values\030\n \003(\01325.org.apache.hertzbeat.c" +
       "ommon.entity.message.ValueRow\"@\n\005Field\022\014" +
       "\n\004name\030\001 \001(\t\022\014\n\004type\030\002 
\001(\r\022\014\n\004unit\030\003 \001(\t" +
       "\022\r\n\005label\030\004 
\001(\010\"\033\n\010ValueRow\022\017\n\007columns\030\001" +
@@ -4406,23 +4406,23 @@ public final class CollectRep {
       .internalBuildGeneratedFileFrom(descriptorData,
         new com.google.protobuf.Descriptors.FileDescriptor[] {
         });
-    
internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_descriptor
 =
+    
internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_descriptor
 =
       getDescriptor().getMessageTypes().get(0);
-    
internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable
 = new
+    
internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_fieldAccessorTable
 = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        
internal_static_org_dromara_hertzbeat_common_entity_message_MetricsData_descriptor,
+        
internal_static_org_apache_hertzbeat_common_entity_message_MetricsData_descriptor,
         new String[] { "Id", "TenantId", "App", "Metrics", "Priority", "Time", 
"Code", "Msg", "Fields", "Values", });
-    
internal_static_org_dromara_hertzbeat_common_entity_message_Field_descriptor =
+    
internal_static_org_apache_hertzbeat_common_entity_message_Field_descriptor =
       getDescriptor().getMessageTypes().get(1);
-    
internal_static_org_dromara_hertzbeat_common_entity_message_Field_fieldAccessorTable
 = new
+    
internal_static_org_apache_hertzbeat_common_entity_message_Field_fieldAccessorTable
 = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        
internal_static_org_dromara_hertzbeat_common_entity_message_Field_descriptor,
+        
internal_static_org_apache_hertzbeat_common_entity_message_Field_descriptor,
         new String[] { "Name", "Type", "Unit", "Label", });
-    
internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_descriptor 
=
+    
internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_descriptor =
       getDescriptor().getMessageTypes().get(2);
-    
internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable
 = new
+    
internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_fieldAccessorTable
 = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        
internal_static_org_dromara_hertzbeat_common_entity_message_ValueRow_descriptor,
+        
internal_static_org_apache_hertzbeat_common_entity_message_ValueRow_descriptor,
         new String[] { "Columns", });
   }
 
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/component/alerter/DispatcherAlarm.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/component/alerter/DispatcherAlarm.java
index 76b9a92c5..801d51920 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/component/alerter/DispatcherAlarm.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/component/alerter/DispatcherAlarm.java
@@ -132,11 +132,17 @@ public class DispatcherAlarm implements InitializingBean {
                 for (NoticeRule rule : noticeRules) {
                     try {
                         if (rule.getTemplateId() == null) {
-                            
sendNoticeMsg(getOneReceiverById(rule.getReceiverId()),
-                                    null, alert);
+                            List<Long> receiverIdList = rule.getReceiverId();
+                            for (Long receiverId : receiverIdList) {
+                                sendNoticeMsg(getOneReceiverById(receiverId),
+                                        null, alert);
+                            }
                         } else {
-                            
sendNoticeMsg(getOneReceiverById(rule.getReceiverId()),
+                            List<Long> receiverIdList = rule.getReceiverId();
+                            for (Long receiverId : receiverIdList) {
+                                sendNoticeMsg(getOneReceiverById(receiverId),
                                     getOneTemplateById(rule.getTemplateId()), 
alert);
+                            }
                         }
                     } catch (AlertNoticeException e) {
                         log.warn("DispatchTask sendNoticeMsg error, message: 
{}", e.getMessage());
diff --git 
a/manager/src/test/java/org/apache/hertzbeat/manager/controller/NoticeConfigControllerTest.java
 
b/manager/src/test/java/org/apache/hertzbeat/manager/controller/NoticeConfigControllerTest.java
index 98c02039f..b679a0a9b 100644
--- 
a/manager/src/test/java/org/apache/hertzbeat/manager/controller/NoticeConfigControllerTest.java
+++ 
b/manager/src/test/java/org/apache/hertzbeat/manager/controller/NoticeConfigControllerTest.java
@@ -67,8 +67,8 @@ class NoticeConfigControllerTest {
         NoticeRule noticeRule = new NoticeRule();
         noticeRule.setId(87584674384L);
         noticeRule.setName("dispatch-1");
-        noticeRule.setReceiverId(4324324L);
-        noticeRule.setReceiverName("tom");
+        noticeRule.setReceiverId(List.of(4324324L));
+        noticeRule.setReceiverName(List.of("tom"));
         noticeRule.setTemplateId(4324324L);
         noticeRule.setTemplateName("test");
         noticeRule.setCreator("tom");
diff --git 
a/manager/src/test/java/org/apache/hertzbeat/manager/dao/NoticeRuleDaoTest.java 
b/manager/src/test/java/org/apache/hertzbeat/manager/dao/NoticeRuleDaoTest.java
index a7dd46615..51361fd1d 100644
--- 
a/manager/src/test/java/org/apache/hertzbeat/manager/dao/NoticeRuleDaoTest.java
+++ 
b/manager/src/test/java/org/apache/hertzbeat/manager/dao/NoticeRuleDaoTest.java
@@ -53,10 +53,10 @@ class NoticeRuleDaoTest extends 
AbstractSpringIntegrationTest {
                 .modifier("mock")
                 .creator("mock")
                 .priorities(Collections.emptyList())
-                .receiverId(1L)
-                .receiverName("mock receiver")
+                .receiverId(List.of(1L))
+                .receiverName(List.of("mock receiver"))
                 .templateId(1L)
-                .receiverName("mock template")
+                .receiverName(List.of("mock template"))
                 .tags(Collections.emptyList())
                 .build();
         enabled = noticeRuleDao.saveAndFlush(enabled);
@@ -73,10 +73,10 @@ class NoticeRuleDaoTest extends 
AbstractSpringIntegrationTest {
                 .modifier("mock")
                 .creator("mock")
                 .priorities(Collections.emptyList())
-                .receiverId(1L)
-                .receiverName("mock receiver")
+                .receiverId(List.of(1L))
+                .receiverName(List.of("mock receiver"))
                 .templateId(1L)
-                .receiverName("mock template")
+                .receiverName(List.of("mock template"))
                 .tags(Collections.emptyList())
                 .build();
         disabled = noticeRuleDao.saveAndFlush(disabled);
diff --git 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/NoticeConfigServiceTest.java
 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/NoticeConfigServiceTest.java
index 040262773..eabc261d1 100644
--- 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/NoticeConfigServiceTest.java
+++ 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/NoticeConfigServiceTest.java
@@ -168,27 +168,27 @@ class NoticeConfigServiceTest {
                 .id(1L)
                 .filterAll(true)
                 .priorities(priorities)
-                .receiverId(1L)
+                .receiverId(List.of(1L))
                 .build();
         final NoticeRule rule2 = NoticeRule.builder()
                 .id(2L)
                 .filterAll(false)
                 .priorities(prioritiesFail)
-                .receiverId(2L)
+                .receiverId(List.of(2L))
                 .build();
         final NoticeRule rule3 = NoticeRule.builder()
                 .id(3L)
                 .filterAll(false)
                 .priorities(priorities)
                 .tags(tagsFail)
-                .receiverId(3L)
+                .receiverId(List.of(3L))
                 .build();
         final NoticeRule rule4 = NoticeRule.builder()
                 .id(4L)
                 .filterAll(false)
                 .priorities(priorities)
                 .tags(tags)
-                .receiverId(4L)
+                .receiverId(List.of(4L))
                 .build();
         final List<NoticeRule> rules = Lists.newArrayList(rule1, rule2, rule3, 
rule4);
 
diff --git a/web-app/src/app/pojo/NoticeRule.ts 
b/web-app/src/app/pojo/NoticeRule.ts
index 4c454d0d5..94d82fd3a 100644
--- a/web-app/src/app/pojo/NoticeRule.ts
+++ b/web-app/src/app/pojo/NoticeRule.ts
@@ -20,8 +20,8 @@
 export class NoticeRule {
   id!: number;
   name!: string;
-  receiverId!: number;
-  receiverName!: string;
+  receiverId!: number[];
+  receiverName!: string[];
   templateId!: number | null;
   templateName!: string | null;
   enable: boolean = true;
diff --git 
a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html 
b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html
index fe60d65f5..023b329ac 100644
--- a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html
+++ b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html
@@ -390,6 +390,7 @@
             [(ngModel)]="rule.receiverId"
             (ngModelChange)="onSwitchReceiver()"
             [nzOptions]="receiversOption"
+            nzMode="multiple"
             id="receiver"
             name="receiver"
             nzPlaceHolder="Select a receiver"
diff --git 
a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts 
b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts
index 65ea70e39..6712e01b2 100644
--- a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts
+++ b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts
@@ -439,10 +439,14 @@ export class AlertNoticeComponent implements OnInit {
     this.isManageRuleModalVisible = true;
     this.isManageRuleModalAdd = false;
     this.receiversOption = [];
-    this.receiversOption.push({
-      value: rule.receiverId,
-      label: rule.receiverName
+
+    this.rule.receiverId.forEach(id => {
+      this.receiversOption.push({
+        value: id,
+        label: this.rule.receiverName[this.rule.receiverId.indexOf(id)]
+      });
     });
+
     this.templatesOption = [];
     if (this.rule.templateId && this.rule.templateName) {
       this.templatesOption.push({
@@ -492,9 +496,11 @@ export class AlertNoticeComponent implements OnInit {
 
   onSwitchReceiver() {
     this.receiversOption.forEach(option => {
-      if (option.value == this.rule.receiverId) {
-        this.switchReceiver = option.receiver;
-      }
+      this.rule.receiverId.forEach(id => {
+        if (option.value == id) {
+          this.switchReceiver = option.receiver;
+        }
+      });
     });
     this.rule.templateId = -1;
   }
@@ -685,10 +691,13 @@ export class AlertNoticeComponent implements OnInit {
   }
 
   onManageRuleModalOk() {
+    this.rule.receiverName = [];
     this.receiversOption.forEach(option => {
-      if (option.value == this.rule.receiverId) {
-        this.rule.receiverName = option.label;
-      }
+      this.rule.receiverId.forEach(id => {
+        if (option.value == id) {
+          this.rule.receiverName.push(option.label);
+        }
+      });
     });
     // template model
     if (this.rule.templateId != null && this.rule.templateId >= 0) {


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


Reply via email to