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

gongchao pushed a commit to branch pulgin-custom
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/pulgin-custom by this push:
     new 050beb560 [feature] supports plug-in custom parameters (#2605)
050beb560 is described below

commit 050beb56037e3010662b999afb14ab033166022b
Author: linDong <[email protected]>
AuthorDate: Mon Aug 26 18:50:17 2024 +0800

    [feature] supports plug-in custom parameters (#2605)
    
    Co-authored-by: shown <[email protected]>
    Co-authored-by: Kerwin Bryant <[email protected]>
---
 .../manager/component/alerter/DispatcherAlarm.java |   2 +-
 .../manager/controller/PluginController.java       |  17 ++++
 .../hertzbeat/manager/dao/PluginParamDao.java      |  48 +++++++++
 .../hertzbeat/manager/pojo/dto/PluginParam.java    | 110 +++++++++++++++++++++
 .../hertzbeat/manager/service/PluginService.java   |  19 +++-
 .../manager/service/impl/PluginServiceImpl.java    | 109 ++++++++++++++++++--
 .../manager/service/PluginServiceTest.java         |   7 +-
 .../java/org/apache/hertzbeat/plugin/Plugin.java   |   8 ++
 8 files changed, 310 insertions(+), 10 deletions(-)

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 0e688e1c7..c543c08a1 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
@@ -131,7 +131,7 @@ public class DispatcherAlarm implements InitializingBean {
                         // Notice distribution
                         sendNotify(alert);
                         // Execute the plugin if enable
-                        pluginService.pluginExecute(Plugin.class, plugin -> 
plugin.alert(alert));
+                        pluginService.pluginExecute(Plugin.class, plugin -> 
plugin.alert(alert), (plugin, configMapList) -> plugin.alert(alert, 
configMapList));
                     }
                 } catch (IgnoreException ignored) {
                 } catch (InterruptedException e) {
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
index 1fb73ada7..0bd5d83c6 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
@@ -26,7 +26,9 @@ import java.util.List;
 import lombok.RequiredArgsConstructor;
 import org.apache.hertzbeat.common.entity.dto.Message;
 import org.apache.hertzbeat.common.entity.dto.PluginUpload;
+import org.apache.hertzbeat.common.entity.manager.ParamDefine;
 import org.apache.hertzbeat.common.entity.manager.PluginMetadata;
+import org.apache.hertzbeat.manager.pojo.dto.PluginParam;
 import org.apache.hertzbeat.manager.service.PluginService;
 import org.springframework.data.domain.Page;
 import org.springframework.http.ResponseEntity;
@@ -85,4 +87,19 @@ public class PluginController {
         pluginService.updateStatus(plugin);
         return ResponseEntity.ok(Message.success("Update success"));
     }
+
+    @GetMapping("/getParamDefine")
+    @Operation(summary = "get param define", description = "get param define 
by jar path")
+    public ResponseEntity<Message<List<ParamDefine>>> 
getParamDefine(@RequestParam Long pluginMetadataId) {
+        List<ParamDefine> plugins = 
pluginService.getParamDefine(pluginMetadataId);
+        return ResponseEntity.ok(Message.success(plugins));
+    }
+
+    @PostMapping("/saveParams")
+    @Operation(summary = "get param define", description = "get param define 
by jar path")
+    public ResponseEntity<Message<Boolean>> saveParams(@RequestBody 
List<PluginParam> pluginParams) {
+        pluginService.savePluginParam(pluginParams);
+        return ResponseEntity.ok(Message.success(true));
+    }
+
 }
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/dao/PluginParamDao.java 
b/manager/src/main/java/org/apache/hertzbeat/manager/dao/PluginParamDao.java
new file mode 100644
index 000000000..d7fbeaa96
--- /dev/null
+++ b/manager/src/main/java/org/apache/hertzbeat/manager/dao/PluginParamDao.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.manager.dao;
+
+import java.util.List;
+import java.util.Set;
+import org.apache.hertzbeat.manager.pojo.dto.PluginParam;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * PluginParamDao database operations
+ */
+public interface PluginParamDao extends JpaRepository<PluginParam, Long> {
+
+    /**
+     * Query the list of parameters associated with the monitoring ID'
+     * @param pluginMetadataId Monitor ID
+     * @return list of parameter values
+     */
+    List<PluginParam> findParamsByPluginMetadataId(Long pluginMetadataId);
+
+    /**
+     * Remove the parameter list associated with the pluginMetadata ID based 
on it
+     * @param pluginMetadataId Monitor Id
+     */
+    void deleteParamsByPluginMetadataId(long pluginMetadataId);
+
+    /**
+     * Remove the parameter list associated with the pluginMetadata ID list 
based on it
+     * @param pluginMetadataIds Monitoring ID List
+     */
+    void deleteParamsByPluginMetadataIdIn(Set<Long> pluginMetadataIds);
+}
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/PluginParam.java 
b/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/PluginParam.java
new file mode 100644
index 000000000..b92948f2b
--- /dev/null
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/PluginParam.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.manager.pojo.dto;
+
+import static io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_ONLY;
+import static io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_WRITE;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.Table;
+import jakarta.persistence.UniqueConstraint;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.time.LocalDateTime;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+/**
+ * PluginParam
+ */
+@Entity
+@Table(name = "hzb_plugin_param", indexes = { @Index(columnList = 
"pluginMetadataId") },
+        uniqueConstraints = @UniqueConstraint(columnNames = 
{"pluginMetadataId", "field"}))
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "Parameter Entity")
+@EntityListeners(AuditingEntityListener.class)
+public class PluginParam {
+
+    /**
+     * Parameter primary key index ID
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Schema(title = "Parameter primary key index ID", example = "87584674384", 
accessMode = READ_ONLY)
+    private Long id;
+    /**
+     * Monitor ID
+     */
+    @Schema(title = "Plugin task ID", example = "875846754543", accessMode = 
READ_WRITE)
+    @NotNull
+    private Long pluginMetadataId;
+
+    /**
+     * Parameter Field Identifier
+     */
+    @Schema(title = "Parameter identifier field", example = "port", accessMode 
= READ_WRITE)
+    @Size(max = 100)
+    @NotNull
+    private String field;
+
+    /**
+     * Param Value
+     */
+    @Schema(title = "parameter values", example = "8080", accessMode = 
READ_WRITE)
+    @Size(max = 8126)
+    @Column(length = 8126)
+    private String paramValue;
+
+    /**
+     * Parameter type 0: number 1: string 2: encrypted string 3: json string 
mapped by map
+     */
+    @Schema(title = "Parameter types 0: number 1: string 2: encrypted string 
3:map mapped json string 4:arrays string",
+            accessMode = READ_WRITE)
+    @Min(0)
+    private byte type;
+
+    /**
+     * Record create time
+     */
+    @Schema(title = "Record create time", example = "1612198922000", 
accessMode = READ_ONLY)
+    @CreatedDate
+    private LocalDateTime gmtCreate;
+
+    /**
+     * Record the latest modification time
+     */
+    @Schema(title = "Record modify time", example = "1612198444000", 
accessMode = READ_ONLY)
+    @LastModifiedDate
+    private LocalDateTime gmtUpdate;
+
+}
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/PluginService.java 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/PluginService.java
index 23d01a30b..42254d7b5 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/PluginService.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/PluginService.java
@@ -17,10 +17,15 @@
 
 package org.apache.hertzbeat.manager.service;
 
+import java.util.List;
 import java.util.Set;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import org.apache.hertzbeat.common.entity.dto.PluginUpload;
+import org.apache.hertzbeat.common.entity.job.Configmap;
+import org.apache.hertzbeat.common.entity.manager.ParamDefine;
 import org.apache.hertzbeat.common.entity.manager.PluginMetadata;
+import org.apache.hertzbeat.manager.pojo.dto.PluginParam;
 import org.springframework.data.domain.Page;
 
 /**
@@ -58,7 +63,7 @@ public interface PluginService {
      * @param execute run plugin logic
      * @param <T> plugin type
      */
-    <T> void pluginExecute(Class<T> clazz, Consumer<T> execute);
+    <T> void pluginExecute(Class<T> clazz, Consumer<T> execute, BiConsumer<T, 
List<Configmap>> biConsumer);
 
     /**
      * delete plugin
@@ -69,4 +74,16 @@ public interface PluginService {
 
     void updateStatus(PluginMetadata plugin);
 
+    /**
+     * get param define
+     * @param pluginMetadataId plugin id
+     */
+    List<ParamDefine> getParamDefine(Long pluginMetadataId);
+
+    /**
+     * save plugin param
+     * @param params params
+     */
+    void savePluginParam(List<PluginParam> params);
+
 }
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
index 162d4bc39..3ebd6d8a6 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
@@ -39,9 +39,11 @@ import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
+import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
@@ -49,17 +51,23 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.hertzbeat.common.constants.PluginType;
 import org.apache.hertzbeat.common.entity.dto.PluginUpload;
+import org.apache.hertzbeat.common.entity.job.Configmap;
+import org.apache.hertzbeat.common.entity.manager.ParamDefine;
 import org.apache.hertzbeat.common.entity.manager.PluginItem;
 import org.apache.hertzbeat.common.entity.manager.PluginMetadata;
 import org.apache.hertzbeat.common.support.exception.CommonException;
 import org.apache.hertzbeat.manager.dao.PluginItemDao;
 import org.apache.hertzbeat.manager.dao.PluginMetadataDao;
+import org.apache.hertzbeat.manager.dao.PluginParamDao;
+import org.apache.hertzbeat.manager.pojo.dto.PluginParam;
 import org.apache.hertzbeat.manager.service.PluginService;
 import org.apache.hertzbeat.plugin.Plugin;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * plugin service
@@ -73,6 +81,8 @@ public class PluginServiceImpl implements PluginService {
 
     private final PluginItemDao itemDao;
 
+    private final PluginParamDao pluginParamDao;
+
     public static Map<Class<?>, PluginType> PLUGIN_TYPE_MAPPING = new 
HashMap<>();
 
     /**
@@ -80,6 +90,20 @@ public class PluginServiceImpl implements PluginService {
      */
     private static final Map<String, Boolean> PLUGIN_ENABLE_STATUS = new 
ConcurrentHashMap<>();
 
+    /**
+     * plugin param define
+     */
+    private static final Map<Long, List<ParamDefine>> PARAMS_Define_MAP = new 
ConcurrentHashMap<>();
+
+    /**
+     * plugin params
+     */
+    private static final Map<Long,  List<Configmap>> PARAMS_MAP = new 
ConcurrentHashMap<>();
+
+    /**
+     * pluginItem Mapping pluginId
+     */
+    private static final Map<String, Long> ITEM_TO_PLUGINMETADATAID_MAP = new 
ConcurrentHashMap<>();
 
     private final List<URLClassLoader> pluginClassLoaders = new ArrayList<>();
 
@@ -106,6 +130,8 @@ public class PluginServiceImpl implements PluginService {
                 }
                 // delete metadata
                 metadataDao.deleteById(plugin.getId());
+                syncPluginParamMap(plugin.getId(), null, true);
+                pluginParamDao.deleteParamsByPluginMetadataId(plugin.getId());
             } catch (IOException e) {
                 throw new RuntimeException(e);
             }
@@ -139,6 +165,33 @@ public class PluginServiceImpl implements PluginService {
         }
     }
 
+    @Override
+    public List<ParamDefine> getParamDefine(Long pluginMetadataId) {
+        if (PARAMS_Define_MAP.containsKey(pluginMetadataId)) {
+            return PARAMS_Define_MAP.get(pluginMetadataId);
+        }
+        return List.of();
+    }
+
+    @Override
+    public void savePluginParam(List<PluginParam> params) {
+        if (CollectionUtils.isEmpty(params)) {
+            return;
+        }
+        
pluginParamDao.deleteParamsByPluginMetadataId(params.get(0).getPluginMetadataId());
+        pluginParamDao.saveAll(params);
+        syncPluginParamMap(params.get(0).getPluginMetadataId(), params, false);
+    }
+
+    private void syncPluginParamMap(Long pluginMetadataId, List<PluginParam> 
params, boolean isDelete) {
+        if (isDelete) {
+            PARAMS_MAP.remove(pluginMetadataId);
+            return;
+        }
+        List<Configmap> configmapList = params.stream().map(item -> new 
Configmap(item.getField(), item.getParamValue(), item.getType())).toList();
+        PARAMS_MAP.put(pluginMetadataId, configmapList);
+    }
+
     static {
         PLUGIN_TYPE_MAPPING.put(Plugin.class, PluginType.POST_ALERT);
     }
@@ -268,13 +321,33 @@ public class PluginServiceImpl implements PluginService {
     private void syncPluginStatus() {
         List<PluginMetadata> plugins = metadataDao.findAll();
         Map<String, Boolean> statusMap = new HashMap<>();
+        Map<String, Long> itemToPluginMetadataIdMap = new HashMap<>();
         for (PluginMetadata plugin : plugins) {
             for (PluginItem item : plugin.getItems()) {
                 statusMap.put(item.getClassIdentifier(), 
plugin.getEnableStatus());
+                itemToPluginMetadataIdMap.put(item.getClassIdentifier(), 
plugin.getId());
             }
         }
         PLUGIN_ENABLE_STATUS.clear();
         PLUGIN_ENABLE_STATUS.putAll(statusMap);
+        ITEM_TO_PLUGINMETADATAID_MAP.clear();
+        ITEM_TO_PLUGINMETADATAID_MAP.putAll(itemToPluginMetadataIdMap);
+    }
+
+    @PostConstruct
+    private void initParams(){
+        try {
+            List<PluginParam> params = pluginParamDao.findAll();
+            Map<Long, List<PluginParam>> content = params.stream()
+                    
.collect(Collectors.groupingBy(PluginParam::getPluginMetadataId));
+
+            for (Map.Entry<Long, List<PluginParam>> entry : 
content.entrySet()) {
+                syncPluginParamMap(entry.getKey(), entry.getValue(), false);
+            }
+        } catch (Exception e) {
+            log.error("Failed to init params:{}", e.getMessage());
+            throw new CommonException("Failed to init params:" + 
e.getMessage());
+        }
     }
 
     /**
@@ -288,14 +361,19 @@ public class PluginServiceImpl implements PluginService {
                     pluginClassLoader.close();
                 }
             }
-            pluginClassLoaders.clear();
-            System.gc();
+
+            if (!pluginClassLoaders.isEmpty()) {
+                pluginClassLoaders.clear();
+                System.gc();
+            }
+            PARAMS_Define_MAP.clear();
             List<PluginMetadata> plugins = 
metadataDao.findPluginMetadataByEnableStatusTrue();
             for (PluginMetadata metadata : plugins) {
-                List<URL> urls = loadLibInPlugin(metadata.getJarFilePath());
+                List<URL> urls = loadLibInPlugin(metadata.getJarFilePath(), 
metadata.getId());
                 urls.add(new File(metadata.getJarFilePath()).toURI().toURL());
                 pluginClassLoaders.add(new URLClassLoader(urls.toArray(new 
URL[0]), Plugin.class.getClassLoader()));
             }
+
         } catch (MalformedURLException e) {
             log.error("Failed to load plugin:{}", e.getMessage());
             throw new CommonException("Failed to load plugin:" + 
e.getMessage());
@@ -308,19 +386,24 @@ public class PluginServiceImpl implements PluginService {
      * loading other JAR files that are dependencies for the plugin
      *
      * @param pluginJarPath jar file path
+     * @param pluginMetadataId plugin id
      * @return urls
      */
     @SneakyThrows
-    private List<URL> loadLibInPlugin(String pluginJarPath) {
+    private List<URL> loadLibInPlugin(String pluginJarPath, Long 
pluginMetadataId) {
         File libDir = new File(getOtherLibDir(pluginJarPath));
         FileUtils.forceMkdir(libDir);
         List<URL> libUrls = new ArrayList<>();
         try (JarFile jarFile = new JarFile(pluginJarPath)) {
             Enumeration<JarEntry> entries = jarFile.entries();
+            Yaml yaml = new Yaml();
             while (entries.hasMoreElements()) {
                 JarEntry entry = entries.nextElement();
                 File file = new File(libDir, entry.getName());
-                if (!entry.isDirectory() && entry.getName().endsWith(".jar")) {
+                if (entry.isDirectory()) {
+                    continue;
+                }
+                if (entry.getName().endsWith(".jar")) {
                     if (!file.getParentFile().exists()) {
                         FileUtils.createParentDirectories(file);
                     }
@@ -335,18 +418,30 @@ public class PluginServiceImpl implements PluginService {
                         out.flush();
                     }
                 }
+                if ((entry.getName().contains("define")) && 
(entry.getName().endsWith(".yml") || entry.getName().endsWith(".yaml"))) {
+                    try (InputStream ymlInputStream = 
jarFile.getInputStream(entry)) {
+                        List<ParamDefine> params = yaml.loadAs(ymlInputStream, 
List.class);
+                        PARAMS_Define_MAP.putIfAbsent(pluginMetadataId, 
params);
+                    }
+                }
             }
         }
         return libUrls;
     }
 
     @Override
-    public <T> void pluginExecute(Class<T> clazz, Consumer<T> execute) {
+    public <T> void pluginExecute(Class<T> clazz, Consumer<T> execute, 
BiConsumer<T, List<Configmap>> biConsumer) {
         for (URLClassLoader pluginClassLoader : pluginClassLoaders) {
             ServiceLoader<T> load = ServiceLoader.load(clazz, 
pluginClassLoader);
             for (T t : load) {
                 if (pluginIsEnable(t.getClass())) {
-                    execute.accept(t);
+                    Long pluginId = 
ITEM_TO_PLUGINMETADATAID_MAP.get(t.getClass().getName());
+                    List<Configmap> configmapList = PARAMS_MAP.get(pluginId);
+                    if (CollectionUtils.isEmpty(configmapList)) {
+                        execute.accept(t);
+                    } else {
+                        biConsumer.accept(t, configmapList);
+                    }
                 }
             }
         }
diff --git 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
index ed94f69c6..39cf4365a 100644
--- 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
+++ 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
@@ -39,6 +39,7 @@ import org.apache.hertzbeat.common.entity.manager.PluginItem;
 import org.apache.hertzbeat.common.entity.manager.PluginMetadata;
 import org.apache.hertzbeat.manager.dao.PluginItemDao;
 import org.apache.hertzbeat.manager.dao.PluginMetadataDao;
+import org.apache.hertzbeat.manager.dao.PluginParamDao;
 import org.apache.hertzbeat.manager.service.impl.PluginServiceImpl;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -60,16 +61,20 @@ class PluginServiceTest {
 
     @InjectMocks
     private PluginServiceImpl pluginService;
+
     @Mock
     private PluginMetadataDao metadataDao;
 
+    @Mock
+    private PluginParamDao pluginParamDao;
+
     @Mock
     private PluginItemDao itemDao;
 
 
     @BeforeEach
     void setUp() {
-        pluginService = new PluginServiceImpl(metadataDao, itemDao);
+        pluginService = new PluginServiceImpl(metadataDao, 
itemDao,pluginParamDao);
     }
 
     @Test
diff --git a/plugin/src/main/java/org/apache/hertzbeat/plugin/Plugin.java 
b/plugin/src/main/java/org/apache/hertzbeat/plugin/Plugin.java
index d72632925..efeed5046 100644
--- a/plugin/src/main/java/org/apache/hertzbeat/plugin/Plugin.java
+++ b/plugin/src/main/java/org/apache/hertzbeat/plugin/Plugin.java
@@ -17,7 +17,9 @@
 
 package org.apache.hertzbeat.plugin;
 
+import java.util.List;
 import org.apache.hertzbeat.common.entity.alerter.Alert;
+import org.apache.hertzbeat.common.entity.job.Configmap;
 
 /**
  * Plugin
@@ -28,4 +30,10 @@ public interface Plugin {
      * execute when alert
      */
     void alert(Alert alert);
+
+    /**
+     * Supports user-defined parameters
+     */
+    void alert(Alert alert, List<Configmap> params);
+
 }


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

Reply via email to