This is an automated email from the ASF dual-hosted git repository.
kirs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new ee95d07 [Feature][Alert plugin] Support slack alert (#5382) (#5384)
ee95d07 is described below
commit ee95d07a90f0190e1b55e2bb6ef8d906dc998f87
Author: ruanwenjun <[email protected]>
AuthorDate: Fri Apr 30 10:11:32 2021 +0800
[Feature][Alert plugin] Support slack alert (#5382) (#5384)
* [Feature][Alert plugin] Support slack alert (#5382)
* fix code smell
* add markdown table
---
.../dolphinscheduler-alert-slack/pom.xml | 84 ++++++++++++
.../plugin/alert/slack/SlackAlertChannel.java | 43 ++++++
.../alert/slack/SlackAlertChannelFactory.java | 66 +++++++++
.../plugin/alert/slack/SlackAlertPlugin.java | 34 +++++
.../plugin/alert/slack/SlackParamsConstants.java | 34 +++++
.../plugin/alert/slack/SlackSender.java | 149 +++++++++++++++++++++
.../alert/slack/SlackAlertChannelFactoryTest.java | 48 +++++++
.../plugin/alert/slack/SlackAlertPluginTest.java | 36 +++++
.../plugin/alert/slack/SlackSenderTest.java | 39 ++++++
dolphinscheduler-alert-plugin/pom.xml | 2 +-
pom.xml | 6 +-
11 files changed, 538 insertions(+), 3 deletions(-)
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/pom.xml
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/pom.xml
new file mode 100644
index 0000000..9b7452a
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/pom.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>dolphinscheduler-alert-plugin</artifactId>
+ <groupId>org.apache.dolphinscheduler</groupId>
+ <version>${revision}</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.dolphinscheduler</groupId>
+ <artifactId>dolphinscheduler-alert-slack</artifactId>
+ <packaging>dolphinscheduler-plugin</packaging>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.dolphinscheduler</groupId>
+ <artifactId>dolphinscheduler-spi</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <type>jar</type>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>dolphinscheduler-alert-slack-${project.version}</finalName>
+ </build>
+
+</project>
\ No newline at end of file
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannel.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannel.java
new file mode 100644
index 0000000..6399d8b
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannel.java
@@ -0,0 +1,43 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.alert.AlertData;
+import org.apache.dolphinscheduler.spi.alert.AlertInfo;
+import org.apache.dolphinscheduler.spi.alert.AlertResult;
+
+import java.util.Map;
+
+/**
+ * SlackAlertChannel
+ */
+public class SlackAlertChannel implements AlertChannel {
+
+ @Override
+ public AlertResult process(AlertInfo alertInfo) {
+ AlertData alertData = alertInfo.getAlertData();
+ Map<String, String> alertParams = alertInfo.getAlertParams();
+ if (alertParams == null || alertParams.size() == 0) {
+ return new AlertResult("false", "Slack alert params is empty");
+ }
+ SlackSender slackSender = new SlackSender(alertParams);
+ String response = slackSender.sendMessage(alertData.getTitle(),
alertData.getContent());
+ return new AlertResult("ok".equals(response) ? "true" : "false",
response);
+ }
+}
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactory.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactory.java
new file mode 100644
index 0000000..f3f135e
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactory.java
@@ -0,0 +1,66 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+import org.apache.dolphinscheduler.spi.params.InputParam;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+import org.apache.dolphinscheduler.spi.params.base.Validate;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Slack alert factory, see {@link AlertChannelFactory}
+ */
+public class SlackAlertChannelFactory implements AlertChannelFactory {
+
+ @Override
+ public String getName() {
+ return "Slack";
+ }
+
+ @Override
+ public List<PluginParams> getParams() {
+ List<PluginParams> paramsList = new LinkedList<>();
+
+ InputParam webHookParam =
InputParam.newBuilder(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME,
SlackParamsConstants.SLACK_WEB_HOOK_URL)
+ .addValidate(Validate.newBuilder()
+ .setRequired(true)
+ .build())
+ .setPlaceholder("Input WebHook Url")
+ .build();
+
+ InputParam botName =
InputParam.newBuilder(SlackParamsConstants.SLACK_BOT_NAME,
SlackParamsConstants.SLACK_BOT)
+ .addValidate(Validate.newBuilder()
+ .setRequired(true)
+ .build())
+ .setPlaceholder("Input the bot username")
+ .build();
+
+ paramsList.add(webHookParam);
+ paramsList.add(botName);
+ return paramsList;
+ }
+
+ @Override
+ public AlertChannel create() {
+ return new SlackAlertChannel();
+ }
+}
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPlugin.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPlugin.java
new file mode 100644
index 0000000..59c45ae
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPlugin.java
@@ -0,0 +1,34 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Slack alert plugin
+ */
+public class SlackAlertPlugin implements DolphinSchedulerPlugin {
+
+ @Override
+ public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
+ return ImmutableList.of(new SlackAlertChannelFactory());
+ }
+}
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackParamsConstants.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackParamsConstants.java
new file mode 100644
index 0000000..fd191c5
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackParamsConstants.java
@@ -0,0 +1,34 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.slack;
+
+public class SlackParamsConstants {
+
+ private SlackParamsConstants() {
+
+ }
+
+ public static final String SLACK_WEB_HOOK_URL = "WebHook";
+ public static final String SLACK_WEN_HOOK_URL_NAME = "webHook";
+ public static final String SLACK_BOT = "Username";
+ public static final String SLACK_BOT_NAME = "username";
+ public static final String TEXT = "text";
+ public static final String ATTACHMENT = "attachments";
+
+ public static final Integer MAX_SHOW_NUMBER = 100;
+}
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
new file mode 100644
index 0000000..21a8286
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
@@ -0,0 +1,149 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.utils.JSONUtils;
+import org.apache.dolphinscheduler.spi.utils.StringUtils;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+public class SlackSender {
+
+ private static final Logger logger =
LoggerFactory.getLogger(SlackSender.class);
+
+ private String webHookUrl;
+
+ private String botName;
+
+ public SlackSender(Map<String, String> slackAlertParam) {
+ webHookUrl =
slackAlertParam.get(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME);
+ botName = slackAlertParam.get(SlackParamsConstants.SLACK_BOT_NAME);
+ Preconditions.checkArgument(!Objects.isNull(webHookUrl),
"SlackWebHookURL can not be null");
+
Preconditions.checkArgument(webHookUrl.startsWith("https://hooks.slack.com/services/"),
"SlackWebHookURL invalidate");
+ Preconditions.checkArgument(!Objects.isNull(botName), "slack bot name
can not be null");
+ }
+
+ /**
+ * Send message to slack channel
+ *
+ * @param title title
+ * @param content content
+ * @return slack response
+ */
+ public String sendMessage(String title, String content) {
+ try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+ Map<String, Object> paramMap = new HashMap<>();
+ paramMap.put(SlackParamsConstants.SLACK_BOT_NAME, botName);
+ paramMap.put(SlackParamsConstants.TEXT, title);
+ if (StringUtils.isNotEmpty(content)) {
+ Map<String, String> attachmentTable = new HashMap<>();
+ attachmentTable.put(SlackParamsConstants.TEXT,
generateMarkDownTable(content));
+ List<Map<String, String>> attachments = new ArrayList<>();
+ attachments.add(attachmentTable);
+ paramMap.put(SlackParamsConstants.ATTACHMENT, attachments);
+ }
+
+ HttpPost httpPost = new HttpPost(webHookUrl);
+ httpPost.setEntity(new
StringEntity(JSONUtils.toJsonString(paramMap), "UTF-8"));
+ CloseableHttpResponse response = httpClient.execute(httpPost);
+
+ HttpEntity entity = response.getEntity();
+ return EntityUtils.toString(entity, "UTF-8");
+ } catch (Exception e) {
+ logger.error("Send message to slack error.", e);
+ return "System Exception";
+ }
+ }
+
+ /**
+ * Because the slack does not support table we can transform to specific
markdown table
+ *
+ * @param content sql data content
+ */
+ private String generateMarkDownTable(String content) {
+ List<LinkedHashMap> linkedHashMaps = JSONUtils.toList(content,
LinkedHashMap.class);
+ if (linkedHashMaps.size() > SlackParamsConstants.MAX_SHOW_NUMBER) {
+ linkedHashMaps = linkedHashMaps.subList(0,
SlackParamsConstants.MAX_SHOW_NUMBER);
+ }
+ int maxLen = 0;
+ List<String> headers = new LinkedList<>();
+ LinkedHashMap<String, Object> tmp = linkedHashMaps.get(0);
+ for (Entry<String, Object> entry : tmp.entrySet()) {
+ maxLen = Math.max(maxLen, entry.getKey().length());
+ headers.add(entry.getKey());
+ }
+ List<List<String>> elements = new ArrayList<>(tmp.size());
+ // build header
+ for (LinkedHashMap<String, Object> linkedHashMap : linkedHashMaps) {
+ List<String> element = new ArrayList<>(linkedHashMap.size());
+ for (Object value : linkedHashMap.values()) {
+ String valueStr = value.toString();
+ maxLen = Math.max(maxLen, valueStr.length());
+ element.add(valueStr);
+ }
+ elements.add(element);
+ }
+ final int elementLen = maxLen;
+ StringBuilder stringBuilder = new StringBuilder(200);
+ stringBuilder.append(headers.stream()
+ .map(header -> generateString(header, elementLen, " "))
+ .collect(Collectors.joining("|")));
+ stringBuilder.append("\n");
+ for (List<String> element : elements) {
+ stringBuilder.append(element.stream()
+ .map(lement -> generateString("", elementLen, "-"))
+ .collect(Collectors.joining("|")));
+ stringBuilder.append("\n");
+ stringBuilder.append(element.stream()
+ .map(e -> generateString(e, elementLen, " "))
+ .collect(Collectors.joining("|")));
+ stringBuilder.append("\n");
+ }
+ return String.format("```%s```", stringBuilder);
+ }
+
+ private String generateString(String value, int len, String supplement) {
+ StringBuilder stringBuilder = new StringBuilder(len);
+ stringBuilder.append(value);
+ for (int i = 0; i < len - stringBuilder.length(); i++) {
+ stringBuilder.append(supplement);
+ }
+ return stringBuilder.toString();
+ }
+}
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactoryTest.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactoryTest.java
new file mode 100644
index 0000000..e294365
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactoryTest.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.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SlackAlertChannelFactoryTest {
+
+ private SlackAlertChannelFactory slackAlertChannelFactory = new
SlackAlertChannelFactory();
+
+ @Test
+ public void testTestGetName() {
+ Assert.assertEquals("Slack", slackAlertChannelFactory.getName());
+ }
+
+ @Test
+ public void testGetParams() {
+ List<PluginParams> params = slackAlertChannelFactory.getParams();
+ Assert.assertEquals(2, params.size());
+ }
+
+ @Test
+ public void testCreate() {
+ AlertChannel alertChannel = slackAlertChannelFactory.create();
+ Assert.assertTrue(alertChannel instanceof SlackAlertChannel);
+ }
+}
\ No newline at end of file
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPluginTest.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPluginTest.java
new file mode 100644
index 0000000..5086352
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPluginTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SlackAlertPluginTest {
+
+ private SlackAlertPlugin slackAlertPlugin = new SlackAlertPlugin();
+
+ @Test
+ public void testGetAlertChannelFactorys() {
+ Iterable<AlertChannelFactory> alertChannelFactorys =
slackAlertPlugin.getAlertChannelFactorys();
+ for (AlertChannelFactory alertChannelFactory : alertChannelFactorys) {
+ Assert.assertTrue(alertChannelFactory instanceof
SlackAlertChannelFactory);
+ }
+ }
+}
\ No newline at end of file
diff --git
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSenderTest.java
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSenderTest.java
new file mode 100644
index 0000000..a488026
--- /dev/null
+++
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSenderTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.slack;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SlackSenderTest {
+
+ @Test
+ public void testSendMessage() {
+ Map<String, String> alertparam = new HashMap<>();
+ alertparam.put(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME,
+ "https://hooks.slack.com/services/123456");
+ alertparam.put(SlackParamsConstants.SLACK_BOT_NAME,
"Dolphinscheduler");
+
+ SlackSender slackSender = new SlackSender(alertparam);
+ String response = slackSender.sendMessage("test title", "test
content");
+ Assert.assertNotEquals("ok", response);
+ }
+}
\ No newline at end of file
diff --git a/dolphinscheduler-alert-plugin/pom.xml
b/dolphinscheduler-alert-plugin/pom.xml
index a10f7de..dba2776 100644
--- a/dolphinscheduler-alert-plugin/pom.xml
+++ b/dolphinscheduler-alert-plugin/pom.xml
@@ -36,7 +36,7 @@
<module>dolphinscheduler-alert-script</module>
<module>dolphinscheduler-alert-http</module>
<module>dolphinscheduler-alert-feishu</module>
+ <module>dolphinscheduler-alert-slack</module>
</modules>
-
</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ea58fec..1d87b0d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1033,16 +1033,18 @@
<include>**/plugin/alert/feishu/FeiShuSenderTest.java</include>
<include>**/plugin/alert/http/HttpAlertPluginTest.java</include>
<include>**/plugin/alert/http/HttpSenderTest.java</include>
+
<include>**/plugin/alert/slack/SlackAlertChannelFactoryTest.java</include>
+
<include>**/plugin/alert/slack/SlackAlertPluginTest.java</include>
+
<include>**/plugin/alert/slack/SlackSenderTest.java</include>
<include>**/spi/params/PluginParamsTransferTest.java</include>
<include>**/alert/plugin/EmailAlertPluginTest.java</include>
<include>**/alert/plugin/AlertPluginManagerTest.java</include>
<include>**/alert/plugin/DolphinPluginLoaderTest.java</include>
-
<include>**/alert/utils/DingTalkUtilsTest.java</include>
-
<include>**/alert/utils/EnterpriseWeChatUtilsTest.java</include>
<include>**/alert/utils/FuncUtilsTest.java</include>
<include>**/alert/processor/AlertRequestProcessorTest.java</include>
<include>**/alert/runner/AlertSenderTest.java</include>
<include>**/alert/AlertServerTest.java</include>
+
</includes>
<!-- <skip>true</skip> -->
</configuration>