Refactor alert plugins and simplify its usage (#6723)
parent
02350ea37b
commit
05bae0b226
|
|
@ -15,6 +15,7 @@
|
|||
# limitations under the License.
|
||||
#
|
||||
|
||||
dolphinscheduler/dolphinscheduler-alert @kezhenxu94
|
||||
dolphinscheduler/dolphinscheduler-e2e @kezhenxu94
|
||||
dolphinscheduler/dolphinscheduler-registry @kezhenxu94
|
||||
dolphinscheduler/dolphinscheduler-standalone-server @kezhenxu94
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
#This configuration file configures the configuration parameters related to the AlertServer.
|
||||
#These parameters are only related to the AlertServer, and it has nothing to do with the specific Alert Plugin.
|
||||
#eg : max retry num.
|
||||
#eg : Alert Server Listener port
|
||||
|
||||
#alert.plugin.dir config the Alert Plugin dir . AlertServer while find and load the Alert Plugin Jar from this dir when deploy and start AlertServer on the server .
|
||||
alert.plugin.dir=${ALERT_PLUGIN_DIR}
|
||||
|
||||
#maven.local.repository=/Users/gaojun/Documents/jianguoyun/localRepository
|
||||
|
||||
#alert.plugin.binding config the Alert Plugin need be load when development and run in IDE
|
||||
#alert.plugin.binding=\
|
||||
# ./dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/pom.xml
|
||||
|
|
@ -107,7 +107,6 @@ export ALERT_LISTEN_HOST=${ALERT_LISTEN_HOST:-"localhost"}
|
|||
# Alert Server
|
||||
#============================================================================
|
||||
export ALERT_SERVER_OPTS=${ALERT_SERVER_OPTS:-"-Xms512m -Xmx512m -Xmn256m"}
|
||||
export ALERT_PLUGIN_DIR=${ALERT_PLUGIN_DIR:-"lib/plugin/alert"}
|
||||
|
||||
#============================================================================
|
||||
# Api Server
|
||||
|
|
|
|||
|
|
@ -109,7 +109,6 @@ ALERT_LISTEN_HOST=dolphinscheduler-alert
|
|||
# Alert Server
|
||||
#============================================================================
|
||||
ALERT_SERVER_OPTS=-Xms512m -Xmx512m -Xmn256m
|
||||
ALERT_PLUGIN_DIR=lib/plugin/alert
|
||||
|
||||
#============================================================================
|
||||
# Api Server
|
||||
|
|
|
|||
|
|
@ -299,7 +299,6 @@ alert:
|
|||
## Configmap
|
||||
configmap:
|
||||
ALERT_SERVER_OPTS: "-Xms512m -Xmx512m -Xmn256m"
|
||||
ALERT_PLUGIN_DIR: "lib/plugin/alert"
|
||||
## Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated.
|
||||
## More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
|
||||
livenessProbe:
|
||||
|
|
@ -411,4 +410,4 @@ ingress:
|
|||
path: "/dolphinscheduler"
|
||||
tls:
|
||||
enabled: false
|
||||
secretName: "dolphinscheduler-tls"
|
||||
secretName: "dolphinscheduler-tls"
|
||||
|
|
|
|||
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* 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.dingtalk;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
/**
|
||||
* DingTalkAlertPlugin
|
||||
*/
|
||||
public class DingTalkAlertPlugin implements DolphinSchedulerPlugin {
|
||||
|
||||
@Override
|
||||
public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
|
||||
return ImmutableList.of(new DingTalkAlertChannelFactory());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
/*
|
||||
* 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.email;
|
||||
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_FALSE;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_NO;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_TRUE;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_YES;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.PasswordParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* email alert factory
|
||||
*/
|
||||
public class EmailAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Email";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> getParams() {
|
||||
|
||||
List<PluginParams> paramsList = new ArrayList<>();
|
||||
InputParam receivesParam = InputParam.newBuilder(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS, MailParamsConstants.PLUGIN_DEFAULT_EMAIL_RECEIVERS)
|
||||
.setPlaceholder("please input receives")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam receiveCcsParam = InputParam.newBuilder(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERCCS, MailParamsConstants.PLUGIN_DEFAULT_EMAIL_RECEIVERCCS)
|
||||
.build();
|
||||
|
||||
InputParam mailSmtpHost = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_HOST, MailParamsConstants.MAIL_SMTP_HOST)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam mailSmtpPort = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_PORT, MailParamsConstants.MAIL_SMTP_PORT)
|
||||
.setValue("25")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam mailSender = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SENDER, MailParamsConstants.MAIL_SENDER)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
RadioParam enableSmtpAuth = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_AUTH, MailParamsConstants.MAIL_SMTP_AUTH)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_TRUE)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam mailUser = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_USER, MailParamsConstants.MAIL_USER)
|
||||
.setPlaceholder("if enable use authentication, you need input user")
|
||||
.build();
|
||||
|
||||
PasswordParam mailPassword = PasswordParam.newBuilder(MailParamsConstants.NAME_MAIL_PASSWD, MailParamsConstants.MAIL_PASSWD)
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.build();
|
||||
|
||||
RadioParam enableTls = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_STARTTLS_ENABLE, MailParamsConstants.MAIL_SMTP_STARTTLS_ENABLE)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_FALSE)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
RadioParam enableSsl = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_SSL_ENABLE, MailParamsConstants.MAIL_SMTP_SSL_ENABLE)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_FALSE)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam sslTrust = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_SSL_TRUST, MailParamsConstants.MAIL_SMTP_SSL_TRUST)
|
||||
.setValue("*")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
RadioParam showType = RadioParam.newBuilder(AlertConstants.NAME_SHOW_TYPE, AlertConstants.SHOW_TYPE)
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TABLE.getDescp(), ShowType.TABLE.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TEXT.getDescp(), ShowType.TEXT.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.ATTACHMENT.getDescp(), ShowType.ATTACHMENT.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TABLEATTACHMENT.getDescp(), ShowType.TABLEATTACHMENT.getDescp(), false))
|
||||
.setValue(ShowType.TABLE.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
paramsList.add(receivesParam);
|
||||
paramsList.add(receiveCcsParam);
|
||||
paramsList.add(mailSmtpHost);
|
||||
paramsList.add(mailSmtpPort);
|
||||
paramsList.add(mailSender);
|
||||
paramsList.add(enableSmtpAuth);
|
||||
paramsList.add(mailUser);
|
||||
paramsList.add(mailPassword);
|
||||
paramsList.add(enableTls);
|
||||
paramsList.add(enableSsl);
|
||||
paramsList.add(sslTrust);
|
||||
paramsList.add(showType);
|
||||
|
||||
return paramsList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertChannel create() {
|
||||
return new EmailAlertChannel();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/*
|
||||
* 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.email;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
/**
|
||||
* email alert plugin
|
||||
*/
|
||||
public class EmailAlertPlugin implements DolphinSchedulerPlugin {
|
||||
@Override
|
||||
public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
|
||||
return ImmutableList.of(new EmailAlertChannelFactory());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* 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.feishu;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
public class FeiShuAlertPlugin implements DolphinSchedulerPlugin {
|
||||
@Override
|
||||
public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
|
||||
return ImmutableList.of(new FeiShuAlertChannelFactory());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* 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.http;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
/**
|
||||
* http alertPlugins
|
||||
*/
|
||||
public class HttpAlertPlugin implements DolphinSchedulerPlugin {
|
||||
|
||||
@Override
|
||||
public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
|
||||
return ImmutableList.of(new HttpAlertChannelFactory());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
* 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.http;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* HttpAlertPlugin UT
|
||||
*/
|
||||
public class HttpAlertPluginTest {
|
||||
|
||||
@Test
|
||||
public void getAlertChannelFactorysTest() {
|
||||
|
||||
HttpAlertPlugin httpAlertPlugin = new HttpAlertPlugin();
|
||||
Iterable<AlertChannelFactory> alertChannelFactorys = httpAlertPlugin.getAlertChannelFactorys();
|
||||
Assert.assertNotNull(alertChannelFactorys);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
* 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.script;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
/**
|
||||
* ScriptAlertPlugin
|
||||
*/
|
||||
public class ScriptAlertPlugin implements DolphinSchedulerPlugin {
|
||||
|
||||
@Override
|
||||
public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
|
||||
return ImmutableList.of(new ScriptAlertChannelFactory());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* 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());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
<?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>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-wechat</artifactId>
|
||||
<packaging>dolphinscheduler-plugin</packaging>
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</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>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
<classifier>runtime</classifier>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>dolphinscheduler-alert-wechat-${project.version}</finalName>
|
||||
</build>
|
||||
</project>
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
/*
|
||||
* 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.wechat;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* WeChatAlertChannelFactory
|
||||
*/
|
||||
public class WeChatAlertChannelFactory implements AlertChannelFactory {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "WeChat";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> getParams() {
|
||||
InputParam corpIdParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_CORP_ID, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_CORP_ID)
|
||||
.setPlaceholder("please input corp id ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam secretParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_SECRET, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_SECRET)
|
||||
.setPlaceholder("please input secret ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam usersParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USERS, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_USERS)
|
||||
.setPlaceholder("please input users ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam userSendMsgParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USER_SEND_MSG, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_USER_SEND_MSG)
|
||||
.setPlaceholder("please input corp id ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam agentIdParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_AGENT_ID)
|
||||
.setPlaceholder("please input agent id ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
RadioParam showType = RadioParam.newBuilder(AlertConstants.NAME_SHOW_TYPE, AlertConstants.SHOW_TYPE)
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TABLE.getDescp(), ShowType.TABLE.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TEXT.getDescp(), ShowType.TEXT.getDescp(), false))
|
||||
.setValue(ShowType.TABLE.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
return Arrays.asList(corpIdParam, secretParam, usersParam, userSendMsgParam, agentIdParam, showType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertChannel create() {
|
||||
return new WeChatAlertChannel();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* 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.wechat;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
/**
|
||||
* WeChatAlertPlugin
|
||||
*/
|
||||
public class WeChatAlertPlugin implements DolphinSchedulerPlugin {
|
||||
|
||||
@Override
|
||||
public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
|
||||
return ImmutableList.of(new WeChatAlertChannelFactory());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* 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.wechat.exception;
|
||||
|
||||
public class WeChatAlertException extends RuntimeException {
|
||||
|
||||
/**
|
||||
* Create Runtime Exception
|
||||
*
|
||||
* @param errMsg - Error message
|
||||
*/
|
||||
public WeChatAlertException(String errMsg) {
|
||||
super(errMsg);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Licensed to 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. Apache Software Foundation (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:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>dolphinscheduler-alert</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>dolphinscheduler-alert-api</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-spi</artifactId> <!-- TODO should get rid off this -->
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Licensed to 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. Apache Software Foundation (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.alert.api;
|
||||
|
||||
public interface AlertChannel {
|
||||
AlertResult process(AlertInfo info);
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Licensed to 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. Apache Software Foundation (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.alert.api;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface AlertChannelFactory {
|
||||
String name();
|
||||
|
||||
AlertChannel create();
|
||||
|
||||
/**
|
||||
* Returns the configurable parameters that this plugin needs to display on the web ui
|
||||
*/
|
||||
List<PluginParams> params();
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Licensed to 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. Apache Software Foundation (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.alert.api;
|
||||
|
||||
public final class AlertConstants {
|
||||
/**
|
||||
* the field name of alert show type
|
||||
**/
|
||||
public static final String SHOW_TYPE = "$t('showType')";
|
||||
|
||||
public static final String NAME_SHOW_TYPE = "showType";
|
||||
|
||||
private AlertConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
* Licensed to 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. Apache Software Foundation (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.alert.api;
|
||||
|
||||
public class AlertData {
|
||||
private int id;
|
||||
private String title;
|
||||
private String content;
|
||||
private String log;
|
||||
|
||||
public AlertData(int id, String title, String content, String log) {
|
||||
this.id = id;
|
||||
this.title = title;
|
||||
this.content = content;
|
||||
this.log = log;
|
||||
}
|
||||
|
||||
public AlertData() {
|
||||
}
|
||||
|
||||
public static AlertDataBuilder builder() {
|
||||
return new AlertDataBuilder();
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public AlertData setId(int id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return this.title;
|
||||
}
|
||||
|
||||
public AlertData setTitle(String title) {
|
||||
this.title = title;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return this.content;
|
||||
}
|
||||
|
||||
public AlertData setContent(String content) {
|
||||
this.content = content;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getLog() {
|
||||
return this.log;
|
||||
}
|
||||
|
||||
public AlertData setLog(String log) {
|
||||
this.log = log;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof AlertData)) {
|
||||
return false;
|
||||
}
|
||||
final AlertData other = (AlertData) o;
|
||||
if (!other.canEqual((Object) this)) {
|
||||
return false;
|
||||
}
|
||||
if (this.getId() != other.getId()) {
|
||||
return false;
|
||||
}
|
||||
final Object this$title = this.getTitle();
|
||||
final Object other$title = other.getTitle();
|
||||
if (this$title == null ? other$title != null : !this$title.equals(other$title)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$content = this.getContent();
|
||||
final Object other$content = other.getContent();
|
||||
if (this$content == null ? other$content != null : !this$content.equals(other$content)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$log = this.getLog();
|
||||
final Object other$log = other.getLog();
|
||||
if (this$log == null ? other$log != null : !this$log.equals(other$log)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean canEqual(final Object other) {
|
||||
return other instanceof AlertData;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
result = result * PRIME + this.getId();
|
||||
final Object $title = this.getTitle();
|
||||
result = result * PRIME + ($title == null ? 43 : $title.hashCode());
|
||||
final Object $content = this.getContent();
|
||||
result = result * PRIME + ($content == null ? 43 : $content.hashCode());
|
||||
final Object $log = this.getLog();
|
||||
result = result * PRIME + ($log == null ? 43 : $log.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "AlertData(id=" + this.getId() + ", title=" + this.getTitle() + ", content=" + this.getContent() + ", log=" + this.getLog() + ")";
|
||||
}
|
||||
|
||||
public static class AlertDataBuilder {
|
||||
private int id;
|
||||
private String title;
|
||||
private String content;
|
||||
private String log;
|
||||
|
||||
AlertDataBuilder() {
|
||||
}
|
||||
|
||||
public AlertDataBuilder id(int id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertDataBuilder title(String title) {
|
||||
this.title = title;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertDataBuilder content(String content) {
|
||||
this.content = content;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertDataBuilder log(String log) {
|
||||
this.log = log;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertData build() {
|
||||
return new AlertData(id, title, content, log);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "AlertData.AlertDataBuilder(id=" + this.id + ", title=" + this.title + ", content=" + this.content + ", log=" + this.log + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* Licensed to 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. Apache Software Foundation (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.alert.api;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class AlertInfo {
|
||||
private Map<String, String> alertParams;
|
||||
private AlertData alertData;
|
||||
|
||||
public AlertInfo(Map<String, String> alertParams, AlertData alertData) {
|
||||
this.alertParams = alertParams;
|
||||
this.alertData = alertData;
|
||||
}
|
||||
|
||||
public AlertInfo() {
|
||||
}
|
||||
|
||||
public static AlertInfoBuilder builder() {
|
||||
return new AlertInfoBuilder();
|
||||
}
|
||||
|
||||
public Map<String, String> getAlertParams() {
|
||||
return this.alertParams;
|
||||
}
|
||||
|
||||
public AlertInfo setAlertParams(Map<String, String> alertParams) {
|
||||
this.alertParams = alertParams;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertData getAlertData() {
|
||||
return this.alertData;
|
||||
}
|
||||
|
||||
public AlertInfo setAlertData(AlertData alertData) {
|
||||
this.alertData = alertData;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof AlertInfo)) {
|
||||
return false;
|
||||
}
|
||||
final AlertInfo other = (AlertInfo) o;
|
||||
if (!other.canEqual((Object) this)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$alertParams = this.getAlertParams();
|
||||
final Object other$alertParams = other.getAlertParams();
|
||||
if (this$alertParams == null ? other$alertParams != null : !this$alertParams.equals(other$alertParams)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$alertData = this.getAlertData();
|
||||
final Object other$alertData = other.getAlertData();
|
||||
if (this$alertData == null ? other$alertData != null : !this$alertData.equals(other$alertData)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean canEqual(final Object other) {
|
||||
return other instanceof AlertInfo;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final Object $alertParams = this.getAlertParams();
|
||||
result = result * PRIME + ($alertParams == null ? 43 : $alertParams.hashCode());
|
||||
final Object $alertData = this.getAlertData();
|
||||
result = result * PRIME + ($alertData == null ? 43 : $alertData.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "AlertInfo(alertParams=" + this.getAlertParams() + ", alertData=" + this.getAlertData() + ")";
|
||||
}
|
||||
|
||||
public static class AlertInfoBuilder {
|
||||
private Map<String, String> alertParams;
|
||||
private AlertData alertData;
|
||||
|
||||
AlertInfoBuilder() {
|
||||
}
|
||||
|
||||
public AlertInfoBuilder alertParams(Map<String, String> alertParams) {
|
||||
this.alertParams = alertParams;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertInfoBuilder alertData(AlertData alertData) {
|
||||
this.alertData = alertData;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertInfo build() {
|
||||
return new AlertInfo(alertParams, alertData);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "AlertInfo.AlertInfoBuilder(alertParams=" + this.alertParams + ", alertData=" + this.alertData + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* Licensed to 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. Apache Software Foundation (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.alert.api;
|
||||
|
||||
public class AlertResult {
|
||||
private String status;
|
||||
private String message;
|
||||
|
||||
public AlertResult(String status, String message) {
|
||||
this.status = status;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public AlertResult() {
|
||||
}
|
||||
|
||||
public static AlertResultBuilder builder() {
|
||||
return new AlertResultBuilder();
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return this.status;
|
||||
}
|
||||
|
||||
public AlertResult setStatus(String status) {
|
||||
this.status = status;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return this.message;
|
||||
}
|
||||
|
||||
public AlertResult setMessage(String message) {
|
||||
this.message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof AlertResult)) {
|
||||
return false;
|
||||
}
|
||||
final AlertResult other = (AlertResult) o;
|
||||
if (!other.canEqual((Object) this)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$status = this.getStatus();
|
||||
final Object other$status = other.getStatus();
|
||||
if (this$status == null ? other$status != null : !this$status.equals(other$status)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$message = this.getMessage();
|
||||
final Object other$message = other.getMessage();
|
||||
if (this$message == null ? other$message != null : !this$message.equals(other$message)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean canEqual(final Object other) {
|
||||
return other instanceof AlertResult;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final Object $status = this.getStatus();
|
||||
result = result * PRIME + ($status == null ? 43 : $status.hashCode());
|
||||
final Object $message = this.getMessage();
|
||||
result = result * PRIME + ($message == null ? 43 : $message.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "AlertResult(status=" + this.getStatus() + ", message=" + this.getMessage() + ")";
|
||||
}
|
||||
|
||||
public static class AlertResultBuilder {
|
||||
private String status;
|
||||
private String message;
|
||||
|
||||
AlertResultBuilder() {
|
||||
}
|
||||
|
||||
public AlertResultBuilder status(String status) {
|
||||
this.status = status;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertResultBuilder message(String message) {
|
||||
this.message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlertResult build() {
|
||||
return new AlertResult(status, message);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "AlertResult.AlertResultBuilder(status=" + this.status + ", message=" + this.message + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Licensed to 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. Apache Software Foundation (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.alert.api;
|
||||
|
||||
public enum ShowType {
|
||||
/**
|
||||
* 0 TABLE;
|
||||
* 1 TEXT;
|
||||
* 2 attachment;
|
||||
* 3 TABLE+attachment;
|
||||
*/
|
||||
TABLE(0, "table"),
|
||||
TEXT(1, "text"),
|
||||
ATTACHMENT(2, "attachment"),
|
||||
TABLEATTACHMENT(3, "table attachment");
|
||||
|
||||
private final int code;
|
||||
private final String descp;
|
||||
|
||||
ShowType(int code, String descp) {
|
||||
this.code = code;
|
||||
this.descp = descp;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getDescp() {
|
||||
return descp;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,70 +15,27 @@
|
|||
~ 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"
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
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>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-dingtalk</artifactId>
|
||||
<packaging>dolphinscheduler-plugin</packaging>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<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>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
<classifier>runtime</classifier>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>dolphinscheduler-alert-dingtalk-${project.version}</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
|
@ -17,21 +17,17 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.dingtalk;
|
||||
|
||||
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 org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* DingTalkAlertChannel
|
||||
*/
|
||||
public class DingTalkAlertChannel implements AlertChannel {
|
||||
public final class DingTalkAlertChannel implements AlertChannel {
|
||||
|
||||
@Override
|
||||
public AlertResult process(AlertInfo alertInfo) {
|
||||
|
||||
AlertData alertData = alertInfo.getAlertData();
|
||||
Map<String, String> paramsMap = alertInfo.getAlertParams();
|
||||
if (null == paramsMap) {
|
||||
|
|
@ -22,67 +22,67 @@ import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_NO;
|
|||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_TRUE;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_YES;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.PasswordParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* DingTalkAlertChannelFactory
|
||||
*/
|
||||
public class DingTalkAlertChannelFactory implements AlertChannelFactory {
|
||||
import com.google.auto.service.AutoService;
|
||||
|
||||
@AutoService(AlertChannelFactory.class)
|
||||
public final class DingTalkAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String getName() {
|
||||
public String name() {
|
||||
return "DingTalk";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> getParams() {
|
||||
public List<PluginParams> params() {
|
||||
InputParam webHookParam = InputParam.newBuilder(DingTalkParamsConstants.NAME_DING_TALK_WEB_HOOK, DingTalkParamsConstants.DING_TALK_WEB_HOOK)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
InputParam keywordParam = InputParam.newBuilder(DingTalkParamsConstants.NAME_DING_TALK_KEYWORD, DingTalkParamsConstants.DING_TALK_KEYWORD)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
RadioParam isEnableProxy =
|
||||
RadioParam.newBuilder(DingTalkParamsConstants.NAME_DING_TALK_PROXY_ENABLE, DingTalkParamsConstants.DING_TALK_PROXY_ENABLE)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_TRUE)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false)
|
||||
.build())
|
||||
.build();
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_TRUE)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false)
|
||||
.build())
|
||||
.build();
|
||||
InputParam proxyParam =
|
||||
InputParam.newBuilder(DingTalkParamsConstants.NAME_DING_TALK_PROXY, DingTalkParamsConstants.DING_TALK_PROXY)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
|
||||
InputParam portParam = InputParam.newBuilder(DingTalkParamsConstants.NAME_DING_TALK_PORT, DingTalkParamsConstants.DING_TALK_PORT)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
|
||||
InputParam userParam =
|
||||
InputParam.newBuilder(DingTalkParamsConstants.NAME_DING_TALK_USER, DingTalkParamsConstants.DING_TALK_USER)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
PasswordParam passwordParam = PasswordParam.newBuilder(DingTalkParamsConstants.NAME_DING_TALK_PASSWORD, DingTalkParamsConstants.DING_TALK_PASSWORD)
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.build();
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.build();
|
||||
|
||||
return Arrays.asList(webHookParam, keywordParam, isEnableProxy, proxyParam, portParam, userParam, passwordParam);
|
||||
}
|
||||
|
|
@ -17,12 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.dingtalk;
|
||||
|
||||
/**
|
||||
* DingTalkParamsConstants
|
||||
*/
|
||||
public class DingTalkParamsConstants {
|
||||
|
||||
|
||||
public final class DingTalkParamsConstants {
|
||||
static final String DING_TALK_PROXY_ENABLE = "$t('isEnableProxy')";
|
||||
static final String NAME_DING_TALK_PROXY_ENABLE = "IsEnableProxy";
|
||||
|
||||
|
|
@ -45,7 +40,6 @@ public class DingTalkParamsConstants {
|
|||
static final String NAME_DING_TALK_PASSWORD = "Password";
|
||||
|
||||
private DingTalkParamsConstants() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.dingtalk;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
import org.apache.commons.codec.binary.StringUtils;
|
||||
|
|
@ -36,23 +36,17 @@ import org.apache.http.impl.client.HttpClients;
|
|||
import org.apache.http.util.EntityUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Ding Talk Sender
|
||||
*/
|
||||
public class DingTalkSender {
|
||||
private static final Logger logger = LoggerFactory.getLogger(DingTalkSender.class);
|
||||
|
||||
private String url;
|
||||
|
||||
private String keyword;
|
||||
|
||||
private Boolean enableProxy;
|
||||
public final class DingTalkSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(DingTalkSender.class);
|
||||
private final String url;
|
||||
private final String keyword;
|
||||
private final Boolean enableProxy;
|
||||
|
||||
private String proxy;
|
||||
|
||||
|
|
@ -72,12 +66,11 @@ public class DingTalkSender {
|
|||
user = config.get(DingTalkParamsConstants.DING_TALK_USER);
|
||||
password = config.get(DingTalkParamsConstants.NAME_DING_TALK_PASSWORD);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static HttpPost constructHttpPost(String url, String msg, String charset) {
|
||||
private static HttpPost constructHttpPost(String url, String msg) {
|
||||
HttpPost post = new HttpPost(url);
|
||||
StringEntity entity = new StringEntity(msg, charset);
|
||||
StringEntity entity = new StringEntity(msg, StandardCharsets.UTF_8);
|
||||
post.setEntity(entity);
|
||||
post.addHeader("Content-Type", "application/json; charset=utf-8");
|
||||
return post;
|
||||
|
|
@ -116,13 +109,13 @@ public class DingTalkSender {
|
|||
|
||||
if (null == result) {
|
||||
alertResult.setMessage("send ding talk msg error");
|
||||
logger.info("send ding talk msg error,ding talk server resp is null");
|
||||
log.info("send ding talk msg error,ding talk server resp is null");
|
||||
return alertResult;
|
||||
}
|
||||
DingTalkSendMsgResponse sendMsgResponse = JSONUtils.parseObject(result, DingTalkSendMsgResponse.class);
|
||||
if (null == sendMsgResponse) {
|
||||
alertResult.setMessage("send ding talk msg fail");
|
||||
logger.info("send ding talk msg error,resp error");
|
||||
log.info("send ding talk msg error,resp error");
|
||||
return alertResult;
|
||||
}
|
||||
if (sendMsgResponse.errcode == 0) {
|
||||
|
|
@ -131,7 +124,7 @@ public class DingTalkSender {
|
|||
return alertResult;
|
||||
}
|
||||
alertResult.setMessage(String.format("alert send ding talk msg error : %s", sendMsgResponse.getErrmsg()));
|
||||
logger.info("alert send ding talk msg error : {}", sendMsgResponse.getErrmsg());
|
||||
log.info("alert send ding talk msg error : {}", sendMsgResponse.getErrmsg());
|
||||
return alertResult;
|
||||
}
|
||||
|
||||
|
|
@ -141,7 +134,7 @@ public class DingTalkSender {
|
|||
String resp = sendMsg(title, content);
|
||||
return checkSendDingTalkSendMsgResult(resp);
|
||||
} catch (Exception e) {
|
||||
logger.info("send ding talk alert msg exception : {}", e.getMessage());
|
||||
log.info("send ding talk alert msg exception : {}", e.getMessage());
|
||||
alertResult = new AlertResult();
|
||||
alertResult.setStatus("false");
|
||||
alertResult.setMessage("send ding talk alert fail.");
|
||||
|
|
@ -152,7 +145,7 @@ public class DingTalkSender {
|
|||
private String sendMsg(String title, String content) throws IOException {
|
||||
|
||||
String msgToJson = textToJsonString(title + content + "#" + keyword);
|
||||
HttpPost httpPost = constructHttpPost(url, msgToJson, "UTF-8");
|
||||
HttpPost httpPost = constructHttpPost(url, msgToJson);
|
||||
|
||||
CloseableHttpClient httpClient;
|
||||
if (Boolean.TRUE.equals(enableProxy)) {
|
||||
|
|
@ -173,19 +166,22 @@ public class DingTalkSender {
|
|||
} finally {
|
||||
response.close();
|
||||
}
|
||||
logger.info("Ding Talk send title :{},content : {}, resp: {}", title, content, resp);
|
||||
log.info("Ding Talk send title :{},content : {}, resp: {}", title, content, resp);
|
||||
return resp;
|
||||
} finally {
|
||||
httpClient.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static class DingTalkSendMsgResponse {
|
||||
static final class DingTalkSendMsgResponse {
|
||||
private Integer errcode;
|
||||
private String errmsg;
|
||||
|
||||
public DingTalkSendMsgResponse() {
|
||||
}
|
||||
|
||||
public Integer getErrcode() {
|
||||
return errcode;
|
||||
return this.errcode;
|
||||
}
|
||||
|
||||
public void setErrcode(Integer errcode) {
|
||||
|
|
@ -193,12 +189,46 @@ public class DingTalkSender {
|
|||
}
|
||||
|
||||
public String getErrmsg() {
|
||||
return errmsg;
|
||||
return this.errmsg;
|
||||
}
|
||||
|
||||
public void setErrmsg(String errmsg) {
|
||||
this.errmsg = errmsg;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof DingTalkSendMsgResponse)) {
|
||||
return false;
|
||||
}
|
||||
final DingTalkSendMsgResponse other = (DingTalkSendMsgResponse) o;
|
||||
final Object this$errcode = this.getErrcode();
|
||||
final Object other$errcode = other.getErrcode();
|
||||
if (this$errcode == null ? other$errcode != null : !this$errcode.equals(other$errcode)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$errmsg = this.getErrmsg();
|
||||
final Object other$errmsg = other.getErrmsg();
|
||||
if (this$errmsg == null ? other$errmsg != null : !this$errmsg.equals(other$errmsg)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final Object $errcode = this.getErrcode();
|
||||
result = result * PRIME + ($errcode == null ? 43 : $errcode.hashCode());
|
||||
final Object $errmsg = this.getErrmsg();
|
||||
result = result * PRIME + ($errmsg == null ? 43 : $errmsg.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "DingTalkSender.DingTalkSendMsgResponse(errcode=" + this.getErrcode() + ", errmsg=" + this.getErrmsg() + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -17,26 +17,20 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.dingtalk;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* DingTalkAlertChannelFactoryTest
|
||||
*/
|
||||
@Ignore
|
||||
public class DingTalkAlertChannelFactoryTest {
|
||||
|
||||
@Test
|
||||
public void testGetParams() {
|
||||
DingTalkAlertChannelFactory dingTalkAlertChannelFactory = new DingTalkAlertChannelFactory();
|
||||
List<PluginParams> params = dingTalkAlertChannelFactory.getParams();
|
||||
List<PluginParams> params = dingTalkAlertChannelFactory.params();
|
||||
JSONUtils.toJsonString(params);
|
||||
Assert.assertEquals(7, params.size());
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.dingtalk;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -26,12 +26,9 @@ import org.junit.Assert;
|
|||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* DingTalkSenderTest
|
||||
*/
|
||||
public class DingTalkSenderTest {
|
||||
|
||||
private static Map<String, String> dingTalkConfig = new HashMap<>();
|
||||
private static final Map<String, String> dingTalkConfig = new HashMap<>();
|
||||
|
||||
@Before
|
||||
public void initDingTalkConfig() {
|
||||
|
|
@ -51,7 +48,7 @@ public class DingTalkSenderTest {
|
|||
dingTalkConfig.put(DingTalkParamsConstants.NAME_DING_TALK_PROXY_ENABLE, "true");
|
||||
dingTalkSender = new DingTalkSender(dingTalkConfig);
|
||||
AlertResult alertResult = dingTalkSender.sendDingTalkMsg("title", "content test");
|
||||
Assert.assertEquals("false",alertResult.getStatus());
|
||||
Assert.assertEquals("false", alertResult.getStatus());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -15,21 +15,27 @@
|
|||
~ 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"
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
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>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-script</artifactId>
|
||||
<packaging>dolphinscheduler-plugin</packaging>
|
||||
<artifactId>dolphinscheduler-alert-email</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
|
|
@ -37,44 +43,8 @@
|
|||
</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>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
<classifier>runtime</classifier>
|
||||
<scope>test</scope>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-email</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>dolphinscheduler-alert-script-${project.version}</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
|
@ -17,21 +17,17 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.email;
|
||||
|
||||
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 org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* email alert channel . use email to seed the alertInfo
|
||||
*/
|
||||
public class EmailAlertChannel implements AlertChannel {
|
||||
private static final Logger logger = LoggerFactory.getLogger(EmailAlertChannel.class);
|
||||
public final class EmailAlertChannel implements AlertChannel {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(EmailAlertChannel.class);
|
||||
|
||||
@Override
|
||||
public AlertResult process(AlertInfo info) {
|
||||
|
|
@ -44,25 +40,24 @@ public class EmailAlertChannel implements AlertChannel {
|
|||
MailSender mailSender = new MailSender(paramsMap);
|
||||
AlertResult alertResult = mailSender.sendMails(alert.getTitle(), alert.getContent());
|
||||
|
||||
//send flag
|
||||
boolean flag = false;
|
||||
boolean flag;
|
||||
|
||||
if (alertResult == null) {
|
||||
alertResult = new AlertResult();
|
||||
alertResult.setStatus("false");
|
||||
alertResult.setMessage("alert send error.");
|
||||
logger.info("alert send error : {}", alertResult.getMessage());
|
||||
log.info("alert send error : {}", alertResult.getMessage());
|
||||
return alertResult;
|
||||
}
|
||||
|
||||
flag = Boolean.parseBoolean(String.valueOf(alertResult.getStatus()));
|
||||
|
||||
if (flag) {
|
||||
logger.info("alert send success");
|
||||
log.info("alert send success");
|
||||
alertResult.setMessage("email send success.");
|
||||
} else {
|
||||
alertResult.setMessage("alert send error.");
|
||||
logger.info("alert send error : {}", alertResult.getMessage());
|
||||
log.info("alert send error : {}", alertResult.getMessage());
|
||||
}
|
||||
|
||||
return alertResult;
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* 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.email;
|
||||
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_FALSE;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_NO;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_TRUE;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_YES;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertConstants;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.params.PasswordParam;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.auto.service.AutoService;
|
||||
|
||||
@AutoService(AlertChannelFactory.class)
|
||||
public final class EmailAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String name() {
|
||||
return "Email";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> params() {
|
||||
List<PluginParams> paramsList = new ArrayList<>();
|
||||
InputParam receivesParam = InputParam.newBuilder(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS, MailParamsConstants.PLUGIN_DEFAULT_EMAIL_RECEIVERS)
|
||||
.setPlaceholder("please input receives")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam receiveCcsParam = InputParam.newBuilder(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERCCS, MailParamsConstants.PLUGIN_DEFAULT_EMAIL_RECEIVERCCS)
|
||||
.build();
|
||||
|
||||
InputParam mailSmtpHost = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_HOST, MailParamsConstants.MAIL_SMTP_HOST)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam mailSmtpPort = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_PORT, MailParamsConstants.MAIL_SMTP_PORT)
|
||||
.setValue("25")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam mailSender = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SENDER, MailParamsConstants.MAIL_SENDER)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
RadioParam enableSmtpAuth = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_AUTH, MailParamsConstants.MAIL_SMTP_AUTH)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_TRUE)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam mailUser = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_USER, MailParamsConstants.MAIL_USER)
|
||||
.setPlaceholder("if enable use authentication, you need input user")
|
||||
.build();
|
||||
|
||||
PasswordParam mailPassword = PasswordParam.newBuilder(MailParamsConstants.NAME_MAIL_PASSWD, MailParamsConstants.MAIL_PASSWD)
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.build();
|
||||
|
||||
RadioParam enableTls = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_STARTTLS_ENABLE, MailParamsConstants.MAIL_SMTP_STARTTLS_ENABLE)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_FALSE)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
RadioParam enableSsl = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_SSL_ENABLE, MailParamsConstants.MAIL_SMTP_SSL_ENABLE)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_FALSE)
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam sslTrust = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_SSL_TRUST, MailParamsConstants.MAIL_SMTP_SSL_TRUST)
|
||||
.setValue("*")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
RadioParam showType = RadioParam.newBuilder(AlertConstants.NAME_SHOW_TYPE, AlertConstants.SHOW_TYPE)
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TABLE.getDescp(), ShowType.TABLE.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TEXT.getDescp(), ShowType.TEXT.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.ATTACHMENT.getDescp(), ShowType.ATTACHMENT.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TABLEATTACHMENT.getDescp(), ShowType.TABLEATTACHMENT.getDescp(), false))
|
||||
.setValue(ShowType.TABLE.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
paramsList.add(receivesParam);
|
||||
paramsList.add(receiveCcsParam);
|
||||
paramsList.add(mailSmtpHost);
|
||||
paramsList.add(mailSmtpPort);
|
||||
paramsList.add(mailSender);
|
||||
paramsList.add(enableSmtpAuth);
|
||||
paramsList.add(mailUser);
|
||||
paramsList.add(mailPassword);
|
||||
paramsList.add(enableTls);
|
||||
paramsList.add(enableSsl);
|
||||
paramsList.add(sslTrust);
|
||||
paramsList.add(showType);
|
||||
|
||||
return paramsList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertChannel create() {
|
||||
return new EmailAlertChannel();
|
||||
}
|
||||
}
|
||||
|
|
@ -17,19 +17,11 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.email;
|
||||
|
||||
public class EmailConstants {
|
||||
|
||||
private EmailConstants() {
|
||||
throw new IllegalStateException(EmailConstants.class.getName());
|
||||
}
|
||||
|
||||
|
||||
public final class EmailConstants {
|
||||
public static final String XLS_FILE_PATH = "xls.file.path";
|
||||
|
||||
public static final String MAIL_TRANSPORT_PROTOCOL = "mail.transport.protocol";
|
||||
|
||||
public static final String DEFAULT_SMTP_PORT = "25";
|
||||
|
||||
public static final String TEXT_HTML_CHARSET_UTF_8 = "text/html;charset=utf-8";
|
||||
|
||||
public static final int NUMBER_1000 = 1000;
|
||||
|
|
@ -42,32 +34,23 @@ public class EmailConstants {
|
|||
|
||||
public static final String TR_END = "</tr>";
|
||||
|
||||
public static final String TITLE = "title";
|
||||
|
||||
public static final String CONTENT = "content";
|
||||
|
||||
public static final String TH = "<th>";
|
||||
|
||||
public static final String TH_END = "</th>";
|
||||
|
||||
public static final String MARKDOWN_QUOTE = ">";
|
||||
|
||||
public static final String MARKDOWN_ENTER = "\n";
|
||||
|
||||
public static final String HTML_HEADER_PREFIX = new StringBuilder("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>")
|
||||
.append("<html>")
|
||||
.append("<head>")
|
||||
.append("<title>dolphinscheduler</title>")
|
||||
.append("<meta name='Keywords' content=''>")
|
||||
.append("<meta name='Description' content=''>")
|
||||
.append("<style type=\"text/css\">")
|
||||
.append("table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}")
|
||||
.append("table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: left;}")
|
||||
.append("table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: left;}")
|
||||
.append("</style>")
|
||||
.append("</head>")
|
||||
.append("<body style=\"margin:0;padding:0\"><table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\"> ")
|
||||
.toString();
|
||||
public static final String HTML_HEADER_PREFIX = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>"
|
||||
+ "<html>"
|
||||
+ "<head>"
|
||||
+ "<title>dolphinscheduler</title>"
|
||||
+ "<meta name='Keywords' content=''>"
|
||||
+ "<meta name='Description' content=''>"
|
||||
+ "<style type=\"text/css\">"
|
||||
+ "table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}"
|
||||
+ "table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: left;}"
|
||||
+ "table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: left;}"
|
||||
+ "</style>"
|
||||
+ "</head>"
|
||||
+ "<body style=\"margin:0;padding:0\"><table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\"> ";
|
||||
|
||||
public static final String TABLE_BODY_HTML_TAIL = "</table></body></html>";
|
||||
|
||||
|
|
@ -76,4 +59,8 @@ public class EmailConstants {
|
|||
public static final String EXCEL_SUFFIX_XLSX = ".xlsx";
|
||||
|
||||
public static final String SINGLE_SLASH = "/";
|
||||
|
||||
private EmailConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -36,21 +36,15 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* excel utils
|
||||
*/
|
||||
public class ExcelUtils {
|
||||
public final class ExcelUtils {
|
||||
private static final int XLSX_WINDOW_ROW = 10000;
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(ExcelUtils.class);
|
||||
|
||||
private ExcelUtils() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ExcelUtils.class);
|
||||
|
||||
private static final int XLSX_WINDOW_ROW = 10000;
|
||||
|
||||
/**
|
||||
* generate excel file
|
||||
*
|
||||
|
|
@ -61,14 +55,14 @@ public class ExcelUtils {
|
|||
public static void genExcelFile(String content, String title, String xlsFilePath) {
|
||||
File file = new File(xlsFilePath);
|
||||
if (!file.exists() && !file.mkdirs()) {
|
||||
logger.error("Create xlsx directory error, path:{}", xlsFilePath);
|
||||
log.error("Create xlsx directory error, path:{}", xlsFilePath);
|
||||
throw new AlertEmailException("Create xlsx directory error");
|
||||
}
|
||||
|
||||
List<LinkedHashMap> itemsList = JSONUtils.toList(content, LinkedHashMap.class);
|
||||
|
||||
if (CollectionUtils.isEmpty(itemsList)) {
|
||||
logger.error("itemsList is null");
|
||||
log.error("itemsList is null");
|
||||
throw new AlertEmailException("itemsList is null");
|
||||
}
|
||||
|
||||
|
|
@ -17,22 +17,13 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.email;
|
||||
|
||||
/**
|
||||
* mail plugin params json use
|
||||
*/
|
||||
public class MailParamsConstants {
|
||||
|
||||
private MailParamsConstants() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
public final class MailParamsConstants {
|
||||
public static final String PLUGIN_DEFAULT_EMAIL_RECEIVERS = "$t('receivers')";
|
||||
public static final String NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS = "receivers";
|
||||
|
||||
public static final String PLUGIN_DEFAULT_EMAIL_RECEIVERCCS = "$t('receiverCcs')";
|
||||
public static final String NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERCCS = "receiverCcs";
|
||||
|
||||
public static final String MAIL_PROTOCOL = "$t('transportProtocol')";
|
||||
public static final String NAME_MAIL_PROTOCOL = "mail.protocol";
|
||||
|
||||
public static final String MAIL_SMTP_HOST = "$t('mailSmtpHost')";
|
||||
|
|
@ -62,4 +53,7 @@ public class MailParamsConstants {
|
|||
public static final String MAIL_SMTP_SSL_TRUST = "$t('mailSmtpSslTrust')";
|
||||
public static final String NAME_MAIL_SMTP_SSL_TRUST = "smtpSslTrust";
|
||||
|
||||
private MailParamsConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -19,12 +19,12 @@ package org.apache.dolphinscheduler.plugin.alert.email;
|
|||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.api.AlertConstants;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.plugin.alert.email.exception.AlertEmailException;
|
||||
import org.apache.dolphinscheduler.plugin.alert.email.template.AlertTemplate;
|
||||
import org.apache.dolphinscheduler.plugin.alert.email.template.DefaultHTMLTemplate;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.utils.StringUtils;
|
||||
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
|
|
@ -54,36 +54,30 @@ import javax.mail.internet.MimeMultipart;
|
|||
import javax.mail.internet.MimeUtility;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.sun.mail.smtp.SMTPProvider;
|
||||
|
||||
/**
|
||||
* mail utils
|
||||
*/
|
||||
public class MailSender {
|
||||
public final class MailSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(MailSender.class);
|
||||
|
||||
public static final Logger logger = LoggerFactory.getLogger(MailSender.class);
|
||||
|
||||
private List<String> receivers;
|
||||
private List<String> receiverCcs;
|
||||
private String mailProtocol = "SMTP";
|
||||
private String mailSmtpHost;
|
||||
private String mailSmtpPort;
|
||||
private String mailSenderEmail;
|
||||
private String enableSmtpAuth;
|
||||
private String mailUser;
|
||||
private String mailPasswd;
|
||||
private String mailUseStartTLS;
|
||||
private String mailUseSSL;
|
||||
private final List<String> receivers;
|
||||
private final List<String> receiverCcs;
|
||||
private final String mailProtocol = "SMTP";
|
||||
private final String mailSmtpHost;
|
||||
private final String mailSmtpPort;
|
||||
private final String mailSenderEmail;
|
||||
private final String enableSmtpAuth;
|
||||
private final String mailUser;
|
||||
private final String mailPasswd;
|
||||
private final String mailUseStartTLS;
|
||||
private final String mailUseSSL;
|
||||
private final String sslTrust;
|
||||
private final String showType;
|
||||
private final AlertTemplate alertTemplate;
|
||||
private final String mustNotNull = " must not be null";
|
||||
private String xlsFilePath;
|
||||
private String sslTrust;
|
||||
private String showType;
|
||||
private AlertTemplate alertTemplate;
|
||||
private String mustNotNull = " must not be null";
|
||||
|
||||
public MailSender(Map<String, String> config) {
|
||||
|
||||
String receiversConfig = config.get(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS);
|
||||
if (receiversConfig == null || "".equals(receiversConfig)) {
|
||||
throw new AlertEmailException(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS + mustNotNull);
|
||||
|
|
@ -95,7 +89,7 @@ public class MailSender {
|
|||
|
||||
receiverCcs = new ArrayList<>();
|
||||
if (receiverCcsConfig != null && !"".equals(receiverCcsConfig)) {
|
||||
receiverCcs = Arrays.asList(receiverCcsConfig.split(","));
|
||||
receiverCcs.addAll(Arrays.asList(receiverCcsConfig.split(",")));
|
||||
}
|
||||
|
||||
mailSmtpHost = config.get(MailParamsConstants.NAME_MAIL_SMTP_HOST);
|
||||
|
|
@ -145,16 +139,6 @@ public class MailSender {
|
|||
return sendMails(this.receivers, this.receiverCcs, title, content);
|
||||
}
|
||||
|
||||
/**
|
||||
* send mail to receivers
|
||||
*
|
||||
* @param title email title
|
||||
* @param content email content
|
||||
*/
|
||||
public AlertResult sendMailsToReceiverOnly(String title, String content) {
|
||||
return sendMails(this.receivers, null, title, content);
|
||||
}
|
||||
|
||||
/**
|
||||
* send mail
|
||||
*
|
||||
|
|
@ -206,8 +190,8 @@ public class MailSender {
|
|||
try {
|
||||
|
||||
String partContent = (showType.equals(ShowType.ATTACHMENT.getDescp())
|
||||
? "Please see the attachment " + title + EmailConstants.EXCEL_SUFFIX_XLSX
|
||||
: htmlTable(content, false));
|
||||
? "Please see the attachment " + title + EmailConstants.EXCEL_SUFFIX_XLSX
|
||||
: htmlTable(content, false));
|
||||
|
||||
attachment(title, content, partContent);
|
||||
|
||||
|
|
@ -396,12 +380,12 @@ public class MailSender {
|
|||
public void deleteFile(File file) {
|
||||
if (file.exists()) {
|
||||
if (file.delete()) {
|
||||
logger.info("delete success: {}", file.getAbsolutePath());
|
||||
log.info("delete success: {}", file.getAbsolutePath());
|
||||
} else {
|
||||
logger.info("delete fail: {}", file.getAbsolutePath());
|
||||
log.info("delete fail: {}", file.getAbsolutePath());
|
||||
}
|
||||
} else {
|
||||
logger.info("file not exists: {}", file.getAbsolutePath());
|
||||
log.info("file not exists: {}", file.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -409,7 +393,7 @@ public class MailSender {
|
|||
* handle exception
|
||||
*/
|
||||
private void handleException(AlertResult alertResult, Exception e) {
|
||||
logger.error("Send email to {} failed", receivers, e);
|
||||
log.error("Send email to {} failed", receivers, e);
|
||||
alertResult.setMessage("Send email to {" + String.join(",", receivers) + "} failed," + e.toString());
|
||||
}
|
||||
|
||||
|
|
@ -18,22 +18,10 @@
|
|||
package org.apache.dolphinscheduler.plugin.alert.email.exception;
|
||||
|
||||
public class AlertEmailException extends RuntimeException {
|
||||
|
||||
/**
|
||||
* Create Runtime exception
|
||||
*
|
||||
* @param errMsg - Error message
|
||||
*/
|
||||
public AlertEmailException(String errMsg) {
|
||||
super(errMsg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Runtime exception
|
||||
*
|
||||
* @param errMsg - Error message
|
||||
* @param cause - cause
|
||||
*/
|
||||
public AlertEmailException(String errMsg, Throwable cause) {
|
||||
super(errMsg, cause);
|
||||
}
|
||||
|
|
@ -17,19 +17,16 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.email.template;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
|
||||
/**
|
||||
* alert message template
|
||||
*/
|
||||
public interface AlertTemplate {
|
||||
|
||||
/**
|
||||
* get a message from a specified alert template
|
||||
*
|
||||
* @param content alert message content
|
||||
* @param content alert message content
|
||||
* @param showType show type
|
||||
* @param showAll whether to show all
|
||||
* @param showAll whether to show all
|
||||
* @return a message from a specified alert template
|
||||
*/
|
||||
String getMessageFromTemplate(String content, ShowType showType, boolean showAll);
|
||||
|
|
@ -37,7 +34,7 @@ public interface AlertTemplate {
|
|||
/**
|
||||
* default showAll is true
|
||||
*
|
||||
* @param content alert message content
|
||||
* @param content alert message content
|
||||
* @param showType show type
|
||||
* @return a message from a specified alert template
|
||||
*/
|
||||
|
|
@ -19,8 +19,8 @@ package org.apache.dolphinscheduler.plugin.alert.email.template;
|
|||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.plugin.alert.email.EmailConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.spi.utils.StringUtils;
|
||||
|
||||
|
|
@ -36,9 +36,6 @@ import org.slf4j.LoggerFactory;
|
|||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
|
||||
/**
|
||||
* the default html alert message template
|
||||
*/
|
||||
public class DefaultHTMLTemplate implements AlertTemplate {
|
||||
|
||||
public static final Logger logger = LoggerFactory.getLogger(DefaultHTMLTemplate.class);
|
||||
|
|
@ -89,7 +86,7 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
|||
|
||||
Map.Entry<String, Object> entry = iterator.next();
|
||||
t.append(EmailConstants.TH).append(entry.getKey()).append(EmailConstants.TH_END);
|
||||
cs.append(EmailConstants.TD).append(String.valueOf(entry.getValue())).append(EmailConstants.TD_END);
|
||||
cs.append(EmailConstants.TD).append(entry.getValue()).append(EmailConstants.TD_END);
|
||||
|
||||
}
|
||||
t.append(EmailConstants.TR_END);
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.email;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -25,27 +25,14 @@ import java.util.List;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* EmailAlertChannelFactory Tester.
|
||||
*
|
||||
* @version 1.0
|
||||
* @since <pre>Aug 20, 2020</pre>
|
||||
*/
|
||||
public class EmailAlertChannelFactoryTest {
|
||||
|
||||
/**
|
||||
* Method: getParams()
|
||||
*/
|
||||
@Test
|
||||
public void testGetParams() {
|
||||
EmailAlertChannelFactory emailAlertChannelFactory = new EmailAlertChannelFactory();
|
||||
List<PluginParams> params = emailAlertChannelFactory.getParams();
|
||||
List<PluginParams> params = emailAlertChannelFactory.params();
|
||||
Assert.assertEquals(12, params.size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Method: create()
|
||||
*/
|
||||
@Test
|
||||
public void testCreate() {
|
||||
EmailAlertChannelFactory emailAlertChannelFactory = new EmailAlertChannelFactory();
|
||||
|
|
@ -17,18 +17,18 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.email;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertData;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertInfo;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertConstants;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.params.PasswordParam;
|
||||
import org.apache.dolphinscheduler.spi.params.PluginParamsTransfer;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -39,14 +39,7 @@ import java.util.Map;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* EmailAlertChannel Tester.
|
||||
*/
|
||||
public class EmailAlertChannelTest {
|
||||
|
||||
/**
|
||||
* Method: process(AlertInfo info)
|
||||
*/
|
||||
@Test
|
||||
public void testProcess() {
|
||||
EmailAlertChannel emailAlertChannel = new EmailAlertChannel();
|
||||
|
|
@ -62,9 +55,9 @@ public class EmailAlertChannelTest {
|
|||
String mapjson = JSONUtils.toJsonString(maps);
|
||||
|
||||
alertData.setId(10)
|
||||
.setContent(mapjson)
|
||||
.setLog("10")
|
||||
.setTitle("test");
|
||||
.setContent(mapjson)
|
||||
.setLog("10")
|
||||
.setTitle("test");
|
||||
AlertInfo alertInfo = new AlertInfo();
|
||||
alertInfo.setAlertData(alertData);
|
||||
Map<String, String> paramsMap = PluginParamsTransfer.getPluginParamsMap(getEmailAlertParams());
|
||||
|
|
@ -78,62 +71,62 @@ public class EmailAlertChannelTest {
|
|||
public String getEmailAlertParams() {
|
||||
List<PluginParams> paramsList = new ArrayList<>();
|
||||
InputParam receivesParam = InputParam.newBuilder(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS, "receivers")
|
||||
.setValue("540957506@qq.com")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
.setValue("540957506@qq.com")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam mailSmtpHost = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_HOST, "smtp.host")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("smtp.126.com")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("smtp.126.com")
|
||||
.build();
|
||||
|
||||
InputParam mailSmtpPort = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_PORT, "smtp.port")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.setValue("25")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.setValue("25")
|
||||
.build();
|
||||
|
||||
InputParam mailSender = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SENDER, "sender")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("dolphinscheduler@126.com")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("dolphinscheduler@126.com")
|
||||
.build();
|
||||
|
||||
RadioParam enableSmtpAuth = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_AUTH, "smtp.auth")
|
||||
.addParamsOptions(new ParamsOptions("YES", "true", false))
|
||||
.addParamsOptions(new ParamsOptions("NO", "false", false))
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("false")
|
||||
.build();
|
||||
.addParamsOptions(new ParamsOptions("YES", "true", false))
|
||||
.addParamsOptions(new ParamsOptions("NO", "false", false))
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("false")
|
||||
.build();
|
||||
|
||||
InputParam mailUser = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_USER, "user")
|
||||
.setPlaceholder("if enable use authentication, you need input user")
|
||||
.setValue("dolphinscheduler@126.com")
|
||||
.build();
|
||||
.setPlaceholder("if enable use authentication, you need input user")
|
||||
.setValue("dolphinscheduler@126.com")
|
||||
.build();
|
||||
|
||||
PasswordParam mailPassword = PasswordParam.newBuilder(MailParamsConstants.NAME_MAIL_PASSWD, "passwd")
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.setValue("escheduler123")
|
||||
.build();
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.setValue("escheduler123")
|
||||
.build();
|
||||
|
||||
RadioParam enableTls = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_STARTTLS_ENABLE, "starttls.enable")
|
||||
.addParamsOptions(new ParamsOptions("YES", "true", false))
|
||||
.addParamsOptions(new ParamsOptions("NO", "false", false))
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("true")
|
||||
.build();
|
||||
.addParamsOptions(new ParamsOptions("YES", "true", false))
|
||||
.addParamsOptions(new ParamsOptions("NO", "false", false))
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("true")
|
||||
.build();
|
||||
|
||||
RadioParam enableSsl = RadioParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_SSL_ENABLE, "smtp.ssl.enable")
|
||||
.addParamsOptions(new ParamsOptions("YES", "true", false))
|
||||
.addParamsOptions(new ParamsOptions("NO", "false", false))
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("true")
|
||||
.build();
|
||||
.addParamsOptions(new ParamsOptions("YES", "true", false))
|
||||
.addParamsOptions(new ParamsOptions("NO", "false", false))
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("true")
|
||||
.build();
|
||||
|
||||
InputParam sslTrust = InputParam.newBuilder(MailParamsConstants.NAME_MAIL_SMTP_SSL_TRUST, "smtp.ssl.trust")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("smtp.126.com")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("smtp.126.com")
|
||||
.build();
|
||||
|
||||
List<ParamsOptions> emailShowTypeList = new ArrayList<>();
|
||||
emailShowTypeList.add(new ParamsOptions(ShowType.TABLE.getDescp(), ShowType.TABLE.getDescp(), false));
|
||||
|
|
@ -141,10 +134,10 @@ public class EmailAlertChannelTest {
|
|||
emailShowTypeList.add(new ParamsOptions(ShowType.ATTACHMENT.getDescp(), ShowType.ATTACHMENT.getDescp(), false));
|
||||
emailShowTypeList.add(new ParamsOptions(ShowType.TABLEATTACHMENT.getDescp(), ShowType.TABLEATTACHMENT.getDescp(), false));
|
||||
RadioParam showType = RadioParam.newBuilder(AlertConstants.NAME_SHOW_TYPE, "showType")
|
||||
.setOptions(emailShowTypeList)
|
||||
.setValue(ShowType.TABLE.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
.setOptions(emailShowTypeList)
|
||||
.setValue(ShowType.TABLE.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
paramsList.add(receivesParam);
|
||||
paramsList.add(mailSmtpHost);
|
||||
|
|
@ -17,10 +17,10 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.email;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.api.AlertConstants;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.plugin.alert.email.template.AlertTemplate;
|
||||
import org.apache.dolphinscheduler.plugin.alert.email.template.DefaultHTMLTemplate;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -34,16 +34,11 @@ import org.junit.Test;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
*/
|
||||
public class MailUtilsTest {
|
||||
private static final Logger logger = LoggerFactory.getLogger(MailUtilsTest.class);
|
||||
|
||||
private static Map<String, String> emailConfig = new HashMap<>();
|
||||
|
||||
private static AlertTemplate alertTemplate;
|
||||
|
||||
static MailSender mailSender;
|
||||
private static Map<String, String> emailConfig = new HashMap<>();
|
||||
private static AlertTemplate alertTemplate;
|
||||
|
||||
@BeforeClass
|
||||
public static void initEmailConfig() {
|
||||
|
|
@ -68,19 +63,19 @@ public class MailUtilsTest {
|
|||
public void testSendMails() {
|
||||
|
||||
String content = "[\"id:69\","
|
||||
+ "\"name:UserBehavior-0--1193959466\","
|
||||
+ "\"Job name: Start workflow\","
|
||||
+ "\"State: SUCCESS\","
|
||||
+ "\"Recovery:NO\","
|
||||
+ "\"Run time: 1\","
|
||||
+ "\"Start time: 2018-08-06 10:31:34.0\","
|
||||
+ "\"End time: 2018-08-06 10:31:49.0\","
|
||||
+ "\"Host: 192.168.xx.xx\","
|
||||
+ "\"Notify group :4\"]";
|
||||
+ "\"name:UserBehavior-0--1193959466\","
|
||||
+ "\"Job name: Start workflow\","
|
||||
+ "\"State: SUCCESS\","
|
||||
+ "\"Recovery:NO\","
|
||||
+ "\"Run time: 1\","
|
||||
+ "\"Start time: 2018-08-06 10:31:34.0\","
|
||||
+ "\"End time: 2018-08-06 10:31:49.0\","
|
||||
+ "\"Host: 192.168.xx.xx\","
|
||||
+ "\"Notify group :4\"]";
|
||||
|
||||
mailSender.sendMails(
|
||||
"Mysql Exception",
|
||||
content);
|
||||
"Mysql Exception",
|
||||
content);
|
||||
}
|
||||
|
||||
public String list2String() {
|
||||
|
|
@ -19,8 +19,8 @@ package org.apache.dolphinscheduler.plugin.alert.email.template;
|
|||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.plugin.alert.email.EmailConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -31,19 +31,12 @@ import org.junit.Test;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* test class for DefaultHTMLTemplate
|
||||
*/
|
||||
public class DefaultHTMLTemplateTest {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(DefaultHTMLTemplateTest.class);
|
||||
|
||||
/**
|
||||
* only need test method GetMessageFromTemplate
|
||||
*/
|
||||
@Test
|
||||
public void testGetMessageFromTemplate() {
|
||||
|
||||
DefaultHTMLTemplate template = new DefaultHTMLTemplate();
|
||||
|
||||
String tableTypeMessage = template.getMessageFromTemplate(list2String(), ShowType.TABLE, true);
|
||||
|
|
@ -55,11 +48,7 @@ public class DefaultHTMLTemplateTest {
|
|||
assertEquals(textTypeMessage, generateMockTextTypeResultByHand());
|
||||
}
|
||||
|
||||
/**
|
||||
* generate some simulation data
|
||||
*/
|
||||
private String list2String() {
|
||||
|
||||
LinkedHashMap<String, Object> map1 = new LinkedHashMap<>();
|
||||
map1.put("mysql service name", "mysql200");
|
||||
map1.put("mysql address", "192.168.xx.xx");
|
||||
|
|
@ -84,22 +73,20 @@ public class DefaultHTMLTemplateTest {
|
|||
}
|
||||
|
||||
private String generateMockTableTypeResultByHand() {
|
||||
|
||||
return EmailConstants.HTML_HEADER_PREFIX
|
||||
+ "<thead>"
|
||||
+ "<tr><th>mysql service name</th><th>mysql address</th><th>database client connections</th><th>port</th><th>no index of number</th></tr>"
|
||||
+ "</thead>\n"
|
||||
+ "<tr><td>mysql200</td><td>192.168.xx.xx</td><td>190</td><td>3306</td><td>80</td></tr>"
|
||||
+ "<tr><td>mysql210</td><td>192.168.xx.xx</td><td>90</td><td>3306</td><td>10</td></tr>"
|
||||
+ EmailConstants.TABLE_BODY_HTML_TAIL;
|
||||
+ "<thead>"
|
||||
+ "<tr><th>mysql service name</th><th>mysql address</th><th>database client connections</th><th>port</th><th>no index of number</th></tr>"
|
||||
+ "</thead>\n"
|
||||
+ "<tr><td>mysql200</td><td>192.168.xx.xx</td><td>190</td><td>3306</td><td>80</td></tr>"
|
||||
+ "<tr><td>mysql210</td><td>192.168.xx.xx</td><td>90</td><td>3306</td><td>10</td></tr>"
|
||||
+ EmailConstants.TABLE_BODY_HTML_TAIL;
|
||||
|
||||
}
|
||||
|
||||
private String generateMockTextTypeResultByHand() {
|
||||
|
||||
return EmailConstants.HTML_HEADER_PREFIX
|
||||
+ "<tr><td>{\"mysql service name\":\"mysql200\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"190\",\"port\":\"3306\",\"no index of number\":\"80\"}</td></tr>"
|
||||
+ "<tr><td>{\"mysql service name\":\"mysql210\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"90\",\"port\":\"3306\",\"no index of number\":\"10\"}</td></tr>"
|
||||
+ EmailConstants.TABLE_BODY_HTML_TAIL;
|
||||
+ "<tr><td>{\"mysql service name\":\"mysql200\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"190\",\"port\":\"3306\",\"no index of number\":\"80\"}</td></tr>"
|
||||
+ "<tr><td>{\"mysql service name\":\"mysql210\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"90\",\"port\":\"3306\",\"no index of number\":\"10\"}</td></tr>"
|
||||
+ EmailConstants.TABLE_BODY_HTML_TAIL;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,22 +15,19 @@
|
|||
~ 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"
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
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>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-feishu</artifactId>
|
||||
<packaging>dolphinscheduler-plugin</packaging>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
|
|
@ -39,46 +36,5 @@
|
|||
<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>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
<classifier>runtime</classifier>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>dolphinscheduler-alert-feishu-${project.version}</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
|
@ -17,17 +17,16 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.feishu;
|
||||
|
||||
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 org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class FeiShuAlertChannel implements AlertChannel {
|
||||
public final class FeiShuAlertChannel implements AlertChannel {
|
||||
@Override
|
||||
public AlertResult process(AlertInfo alertInfo) {
|
||||
|
||||
AlertData alertData = alertInfo.getAlertData();
|
||||
Map<String, String> paramsMap = alertInfo.getAlertParams();
|
||||
if (null == paramsMap) {
|
||||
|
|
@ -22,59 +22,62 @@ import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_NO;
|
|||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_TRUE;
|
||||
import static org.apache.dolphinscheduler.spi.utils.Constants.STRING_YES;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.PasswordParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class FeiShuAlertChannelFactory implements AlertChannelFactory {
|
||||
import com.google.auto.service.AutoService;
|
||||
|
||||
@AutoService(AlertChannelFactory.class)
|
||||
public final class FeiShuAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String getName() {
|
||||
public String name() {
|
||||
return "Feishu";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> getParams() {
|
||||
public List<PluginParams> params() {
|
||||
InputParam webHookParam = InputParam.newBuilder(FeiShuParamsConstants.NAME_WEB_HOOK, FeiShuParamsConstants.WEB_HOOK)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
RadioParam isEnableProxy =
|
||||
RadioParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_PROXY_ENABLE, FeiShuParamsConstants.FEI_SHU_PROXY_ENABLE)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_TRUE)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false)
|
||||
.build())
|
||||
.build();
|
||||
RadioParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_PROXY_ENABLE, FeiShuParamsConstants.FEI_SHU_PROXY_ENABLE)
|
||||
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false))
|
||||
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false))
|
||||
.setValue(STRING_TRUE)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false)
|
||||
.build())
|
||||
.build();
|
||||
InputParam proxyParam =
|
||||
InputParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_PROXY, FeiShuParamsConstants.FEI_SHU_PROXY)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
InputParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_PROXY, FeiShuParamsConstants.FEI_SHU_PROXY)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
|
||||
InputParam portParam = InputParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_PORT, FeiShuParamsConstants.FEI_SHU_PORT)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
|
||||
InputParam userParam =
|
||||
InputParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_USER, FeiShuParamsConstants.FEI_SHU_USER)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
InputParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_USER, FeiShuParamsConstants.FEI_SHU_USER)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false).build())
|
||||
.build();
|
||||
PasswordParam passwordParam = PasswordParam.newBuilder(FeiShuParamsConstants.NAME_FEI_SHU_PASSWORD, FeiShuParamsConstants.FEI_SHU_PASSWORD)
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.build();
|
||||
.setPlaceholder("if enable use authentication, you need input password")
|
||||
.build();
|
||||
|
||||
return Arrays.asList(webHookParam, isEnableProxy, proxyParam, portParam, userParam, passwordParam);
|
||||
|
||||
|
|
@ -17,18 +17,10 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.feishu;
|
||||
|
||||
public class FeiShuParamsConstants {
|
||||
|
||||
private FeiShuParamsConstants() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
static final String WEB_HOOK = "$t('webhook')";
|
||||
|
||||
static final String NAME_WEB_HOOK = "WebHook";
|
||||
|
||||
public final class FeiShuParamsConstants {
|
||||
public static final String FEI_SHU_PROXY_ENABLE = "$t('isEnableProxy')";
|
||||
|
||||
static final String WEB_HOOK = "$t('webhook')";
|
||||
static final String NAME_WEB_HOOK = "WebHook";
|
||||
static final String NAME_FEI_SHU_PROXY_ENABLE = "IsEnableProxy";
|
||||
|
||||
static final String FEI_SHU_PROXY = "$t('proxy')";
|
||||
|
|
@ -46,4 +38,8 @@ public class FeiShuParamsConstants {
|
|||
static final String FEI_SHU_PASSWORD = "$t('password')";
|
||||
|
||||
static final String NAME_FEI_SHU_PASSWORD = "Password";
|
||||
|
||||
private FeiShuParamsConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -17,8 +17,8 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.feishu;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertData;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
import org.apache.commons.codec.binary.StringUtils;
|
||||
|
|
@ -31,23 +31,18 @@ import org.apache.http.util.EntityUtils;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class FeiShuSender {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(FeiShuSender.class);
|
||||
|
||||
private String url;
|
||||
|
||||
private Boolean enableProxy;
|
||||
public final class FeiShuSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(FeiShuSender.class);
|
||||
private final String url;
|
||||
private final Boolean enableProxy;
|
||||
|
||||
private String proxy;
|
||||
|
||||
|
|
@ -70,7 +65,6 @@ public class FeiShuSender {
|
|||
}
|
||||
|
||||
private static String textToJsonString(AlertData alertData) {
|
||||
|
||||
Map<String, Object> items = new HashMap<>(2);
|
||||
items.put("msg_type", "text");
|
||||
Map<String, String> textContent = new HashMap<>();
|
||||
|
|
@ -87,14 +81,14 @@ public class FeiShuSender {
|
|||
|
||||
if (org.apache.dolphinscheduler.spi.utils.StringUtils.isBlank(result)) {
|
||||
alertResult.setMessage("send fei shu msg error");
|
||||
logger.info("send fei shu msg error,fei shu server resp is null");
|
||||
log.info("send fei shu msg error,fei shu server resp is null");
|
||||
return alertResult;
|
||||
}
|
||||
FeiShuSendMsgResponse sendMsgResponse = JSONUtils.parseObject(result, FeiShuSendMsgResponse.class);
|
||||
|
||||
if (null == sendMsgResponse) {
|
||||
alertResult.setMessage("send fei shu msg fail");
|
||||
logger.info("send fei shu msg error,resp error");
|
||||
log.info("send fei shu msg error,resp error");
|
||||
return alertResult;
|
||||
}
|
||||
if (sendMsgResponse.statusCode == 0) {
|
||||
|
|
@ -103,7 +97,7 @@ public class FeiShuSender {
|
|||
return alertResult;
|
||||
}
|
||||
alertResult.setMessage(String.format("alert send fei shu msg error : %s", sendMsgResponse.getStatusMessage()));
|
||||
logger.info("alert send fei shu msg error : {} ,Extra : {} ", sendMsgResponse.getStatusMessage(), sendMsgResponse.getExtra());
|
||||
log.info("alert send fei shu msg error : {} ,Extra : {} ", sendMsgResponse.getStatusMessage(), sendMsgResponse.getExtra());
|
||||
return alertResult;
|
||||
}
|
||||
|
||||
|
|
@ -118,9 +112,7 @@ public class FeiShuSender {
|
|||
StringBuilder contents = new StringBuilder(100);
|
||||
contents.append(String.format("`%s`%n", alertData.getTitle()));
|
||||
for (Map map : list) {
|
||||
Iterator<Entry<String, Object>> entries = map.entrySet().iterator();
|
||||
while (entries.hasNext()) {
|
||||
Entry<String, Object> entry = entries.next();
|
||||
for (Entry<String, Object> entry : (Iterable<Entry<String, Object>>) map.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
String value = entry.getValue().toString();
|
||||
contents.append(key + ":" + value);
|
||||
|
|
@ -138,7 +130,7 @@ public class FeiShuSender {
|
|||
String resp = sendMsg(alertData);
|
||||
return checkSendFeiShuSendMsgResult(resp);
|
||||
} catch (Exception e) {
|
||||
logger.info("send fei shu alert msg exception : {}", e.getMessage());
|
||||
log.info("send fei shu alert msg exception : {}", e.getMessage());
|
||||
alertResult = new AlertResult();
|
||||
alertResult.setStatus("false");
|
||||
alertResult.setMessage("send fei shu alert fail.");
|
||||
|
|
@ -161,7 +153,7 @@ public class FeiShuSender {
|
|||
|
||||
int statusCode = response.getStatusLine().getStatusCode();
|
||||
if (statusCode != HttpStatus.SC_OK) {
|
||||
logger.error("send feishu message error, return http status code: {} ", statusCode);
|
||||
log.error("send feishu message error, return http status code: {} ", statusCode);
|
||||
}
|
||||
String resp;
|
||||
try {
|
||||
|
|
@ -171,14 +163,14 @@ public class FeiShuSender {
|
|||
} finally {
|
||||
response.close();
|
||||
}
|
||||
logger.info("Fei Shu send title :{} ,content :{}, resp: {}", alertData.getTitle(), alertData.getContent(), resp);
|
||||
log.info("Fei Shu send title :{} ,content :{}, resp: {}", alertData.getTitle(), alertData.getContent(), resp);
|
||||
return resp;
|
||||
} finally {
|
||||
httpClient.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static class FeiShuSendMsgResponse {
|
||||
static final class FeiShuSendMsgResponse {
|
||||
@JsonProperty("Extra")
|
||||
private String extra;
|
||||
@JsonProperty("StatusCode")
|
||||
|
|
@ -186,29 +178,76 @@ public class FeiShuSender {
|
|||
@JsonProperty("StatusMessage")
|
||||
private String statusMessage;
|
||||
|
||||
public String getExtra() {
|
||||
return extra;
|
||||
public FeiShuSendMsgResponse() {
|
||||
}
|
||||
|
||||
public String getExtra() {
|
||||
return this.extra;
|
||||
}
|
||||
|
||||
@JsonProperty("Extra")
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public Integer getStatusCode() {
|
||||
return statusCode;
|
||||
return this.statusCode;
|
||||
}
|
||||
|
||||
@JsonProperty("StatusCode")
|
||||
public void setStatusCode(Integer statusCode) {
|
||||
this.statusCode = statusCode;
|
||||
}
|
||||
|
||||
public String getStatusMessage() {
|
||||
return statusMessage;
|
||||
return this.statusMessage;
|
||||
}
|
||||
|
||||
@JsonProperty("StatusMessage")
|
||||
public void setStatusMessage(String statusMessage) {
|
||||
this.statusMessage = statusMessage;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof FeiShuSendMsgResponse)) {
|
||||
return false;
|
||||
}
|
||||
final FeiShuSendMsgResponse other = (FeiShuSendMsgResponse) o;
|
||||
final Object this$extra = this.getExtra();
|
||||
final Object other$extra = other.getExtra();
|
||||
if (this$extra == null ? other$extra != null : !this$extra.equals(other$extra)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$statusCode = this.getStatusCode();
|
||||
final Object other$statusCode = other.getStatusCode();
|
||||
if (this$statusCode == null ? other$statusCode != null : !this$statusCode.equals(other$statusCode)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$statusMessage = this.getStatusMessage();
|
||||
final Object other$statusMessage = other.getStatusMessage();
|
||||
if (this$statusMessage == null ? other$statusMessage != null : !this$statusMessage.equals(other$statusMessage)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final Object $extra = this.getExtra();
|
||||
result = result * PRIME + ($extra == null ? 43 : $extra.hashCode());
|
||||
final Object $statusCode = this.getStatusCode();
|
||||
result = result * PRIME + ($statusCode == null ? 43 : $statusCode.hashCode());
|
||||
final Object $statusMessage = this.getStatusMessage();
|
||||
result = result * PRIME + ($statusMessage == null ? 43 : $statusMessage.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "FeiShuSender.FeiShuSendMsgResponse(extra=" + this.getExtra() + ", statusCode=" + this.getStatusCode() + ", statusMessage=" + this.getStatusMessage() + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -28,7 +28,10 @@ import org.apache.http.impl.client.BasicCredentialsProvider;
|
|||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
|
||||
public class HttpRequestUtil {
|
||||
public final class HttpRequestUtil {
|
||||
private HttpRequestUtil() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
public static CloseableHttpClient getHttpClient(boolean enableProxy, String proxy, Integer port, String user, String password) {
|
||||
if (enableProxy) {
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.feishu;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
|
|
@ -31,7 +31,7 @@ public class FeiShuAlertChannelFactoryTest {
|
|||
@Test
|
||||
public void testGetParams() {
|
||||
FeiShuAlertChannelFactory feiShuAlertChannelFactory = new FeiShuAlertChannelFactory();
|
||||
List<PluginParams> params = feiShuAlertChannelFactory.getParams();
|
||||
List<PluginParams> params = feiShuAlertChannelFactory.params();
|
||||
JSONUtils.toJsonString(params);
|
||||
Assert.assertEquals(6, params.size());
|
||||
}
|
||||
|
|
@ -17,8 +17,8 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.feishu;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertData;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -50,23 +50,23 @@ public class FeiShuSenderTest {
|
|||
@Test
|
||||
public void testFormatContent() {
|
||||
String alertMsg = "[\n"
|
||||
+ " {\n"
|
||||
+ " \"owner\": \"dolphinscheduler\",\n"
|
||||
+ " \"processEndTime\": \"2021-01-29 19:01:11\",\n"
|
||||
+ " \"processHost\": \"10.81.129.4:5678\",\n"
|
||||
+ " \"processId\": 2926,\n"
|
||||
+ " \"processName\": \"3-20210129190038108\",\n"
|
||||
+ " \"processStartTime\": \"2021-01-29 19:00:38\",\n"
|
||||
+ " \"processState\": \"SUCCESS\",\n"
|
||||
+ " \"processType\": \"START_PROCESS\",\n"
|
||||
+ " \"projectId\": 2,\n"
|
||||
+ " \"projectName\": \"testdelproject\",\n"
|
||||
+ " \"recovery\": \"NO\",\n"
|
||||
+ " \"retryTimes\": 0,\n"
|
||||
+ " \"runTimes\": 1,\n"
|
||||
+ " \"taskId\": 0\n"
|
||||
+ " }\n"
|
||||
+ "]";
|
||||
+ " {\n"
|
||||
+ " \"owner\": \"dolphinscheduler\",\n"
|
||||
+ " \"processEndTime\": \"2021-01-29 19:01:11\",\n"
|
||||
+ " \"processHost\": \"10.81.129.4:5678\",\n"
|
||||
+ " \"processId\": 2926,\n"
|
||||
+ " \"processName\": \"3-20210129190038108\",\n"
|
||||
+ " \"processStartTime\": \"2021-01-29 19:00:38\",\n"
|
||||
+ " \"processState\": \"SUCCESS\",\n"
|
||||
+ " \"processType\": \"START_PROCESS\",\n"
|
||||
+ " \"projectId\": 2,\n"
|
||||
+ " \"projectName\": \"testdelproject\",\n"
|
||||
+ " \"recovery\": \"NO\",\n"
|
||||
+ " \"retryTimes\": 0,\n"
|
||||
+ " \"runTimes\": 1,\n"
|
||||
+ " \"taskId\": 0\n"
|
||||
+ " }\n"
|
||||
+ "]";
|
||||
AlertData alertData = new AlertData();
|
||||
alertData.setTitle("");
|
||||
alertData.setContent(alertMsg);
|
||||
|
|
@ -90,7 +90,7 @@ public class FeiShuSenderTest {
|
|||
AlertResult alertResult = feiShuSender.checkSendFeiShuSendMsgResult("");
|
||||
Assert.assertFalse(Boolean.valueOf(alertResult.getStatus()));
|
||||
AlertResult alertResult2 = feiShuSender.checkSendFeiShuSendMsgResult("123");
|
||||
Assert.assertEquals("send fei shu msg fail",alertResult2.getMessage());
|
||||
Assert.assertEquals("send fei shu msg fail", alertResult2.getMessage());
|
||||
|
||||
String response = "{\"StatusCode\":\"0\",\"extra\":\"extra\",\"StatusMessage\":\"StatusMessage\"}";
|
||||
AlertResult alertResult3 = feiShuSender.checkSendFeiShuSendMsgResult(response);
|
||||
|
|
@ -15,71 +15,33 @@
|
|||
~ 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"
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
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>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-slack</artifactId>
|
||||
<packaging>dolphinscheduler-plugin</packaging>
|
||||
<artifactId>dolphinscheduler-alert-http</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</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>
|
||||
<artifactId>jackson-databind</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>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
<classifier>runtime</classifier>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>dolphinscheduler-alert-slack-${project.version}</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
|
@ -17,20 +17,16 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.http;
|
||||
|
||||
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 org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* http alert channel,use sms message to seed the alertInfo
|
||||
*/
|
||||
public class HttpAlertChannel implements AlertChannel {
|
||||
public final class HttpAlertChannel implements AlertChannel {
|
||||
@Override
|
||||
public AlertResult process(AlertInfo alertInfo) {
|
||||
|
||||
AlertData alertData = alertInfo.getAlertData();
|
||||
Map<String, String> paramsMap = alertInfo.getAlertParams();
|
||||
if (null == paramsMap) {
|
||||
|
|
@ -17,56 +17,56 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.http;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* http alert factory
|
||||
*/
|
||||
public class HttpAlertChannelFactory implements AlertChannelFactory {
|
||||
import com.google.auto.service.AutoService;
|
||||
|
||||
@AutoService(AlertChannelFactory.class)
|
||||
public final class HttpAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String getName() {
|
||||
public String name() {
|
||||
return "Http";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> getParams() {
|
||||
public List<PluginParams> params() {
|
||||
|
||||
InputParam url = InputParam.newBuilder(HttpAlertConstants.NAME_URL, HttpAlertConstants.URL)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam headerParams = InputParam.newBuilder(HttpAlertConstants.NAME_HEADER_PARAMS, HttpAlertConstants.HEADER_PARAMS)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam bodyParams = InputParam.newBuilder(HttpAlertConstants.NAME_BODY_PARAMS, HttpAlertConstants.BODY_PARAMS)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam contentField = InputParam.newBuilder(HttpAlertConstants.NAME_CONTENT_FIELD, HttpAlertConstants.CONTENT_FIELD)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam requestType = InputParam.newBuilder(HttpAlertConstants.NAME_REQUEST_TYPE, HttpAlertConstants.REQUEST_TYPE)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
return Arrays.asList(url, requestType, headerParams, bodyParams, contentField);
|
||||
}
|
||||
|
|
@ -17,11 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.http;
|
||||
|
||||
public class HttpAlertConstants {
|
||||
|
||||
private HttpAlertConstants() {
|
||||
}
|
||||
|
||||
public final class HttpAlertConstants {
|
||||
public static final String URL = "$t('url')";
|
||||
|
||||
public static final String NAME_URL = "url";
|
||||
|
|
@ -42,4 +38,7 @@ public class HttpAlertConstants {
|
|||
|
||||
public static final String NAME_REQUEST_TYPE = "requestType";
|
||||
|
||||
private HttpAlertConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.http;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.spi.utils.StringUtils;
|
||||
|
||||
|
|
@ -35,43 +35,27 @@ import java.util.HashMap;
|
|||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
|
||||
/**
|
||||
* http send message
|
||||
*/
|
||||
public class HttpSender {
|
||||
|
||||
public static final Logger logger = LoggerFactory.getLogger(HttpSender.class);
|
||||
|
||||
private String url;
|
||||
|
||||
private final String headerParams;
|
||||
|
||||
private final String bodyParams;
|
||||
|
||||
private final String contentField;
|
||||
|
||||
private final String requestType;
|
||||
|
||||
private HttpRequestBase httpRequest;
|
||||
|
||||
|
||||
public final class HttpSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(HttpSender.class);
|
||||
private static final String URL_SPLICE_CHAR = "?";
|
||||
|
||||
/**
|
||||
* request type post
|
||||
*/
|
||||
private static final String REQUEST_TYPE_POST = "POST";
|
||||
|
||||
/**
|
||||
* request type get
|
||||
*/
|
||||
private static final String REQUEST_TYPE_GET = "GET";
|
||||
|
||||
private static final String DEFAULT_CHARSET = "utf-8";
|
||||
private final String headerParams;
|
||||
private final String bodyParams;
|
||||
private final String contentField;
|
||||
private final String requestType;
|
||||
private String url;
|
||||
private HttpRequestBase httpRequest;
|
||||
|
||||
public HttpSender(Map<String, String> paramsMap) {
|
||||
|
||||
|
|
@ -102,7 +86,7 @@ public class HttpSender {
|
|||
alertResult.setStatus("true");
|
||||
alertResult.setMessage(resp);
|
||||
} catch (Exception e) {
|
||||
logger.error("send http alert msg exception : {}", e.getMessage());
|
||||
log.error("send http alert msg exception : {}", e.getMessage());
|
||||
alertResult.setStatus("false");
|
||||
alertResult.setMessage("send http request alert fail.");
|
||||
}
|
||||
|
|
@ -157,16 +141,15 @@ public class HttpSender {
|
|||
/**
|
||||
* set body params
|
||||
*/
|
||||
private void setMsgInRequestBody(String msg) {
|
||||
private void setMsgInRequestBody(String msg) {
|
||||
ObjectNode objectNode = JSONUtils.parseObject(bodyParams);
|
||||
//set msg content field
|
||||
objectNode.put(contentField, msg);
|
||||
try {
|
||||
StringEntity entity = new StringEntity(bodyParams, DEFAULT_CHARSET);
|
||||
((HttpPost)httpRequest).setEntity(entity);
|
||||
((HttpPost) httpRequest).setEntity(entity);
|
||||
} catch (Exception e) {
|
||||
logger.error("send http alert msg exception : {}", e.getMessage());
|
||||
log.error("send http alert msg exception : {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.http;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -26,9 +26,6 @@ import org.junit.Assert;
|
|||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* HttpAlertChannelFactory UT
|
||||
*/
|
||||
public class HttpAlertChannelFactoryTest {
|
||||
|
||||
private HttpAlertChannelFactory httpAlertChannelFactory;
|
||||
|
|
@ -41,7 +38,7 @@ public class HttpAlertChannelFactoryTest {
|
|||
@Test
|
||||
public void getParamsTest() {
|
||||
|
||||
List<PluginParams> pluginParamsList = httpAlertChannelFactory.getParams();
|
||||
List<PluginParams> pluginParamsList = httpAlertChannelFactory.params();
|
||||
Assert.assertEquals(5, pluginParamsList.size());
|
||||
}
|
||||
|
||||
|
|
@ -17,13 +17,13 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.http;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertData;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertInfo;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.params.PluginParamsTransfer;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -33,9 +33,6 @@ import java.util.Map;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* HttpAlertChannel UT
|
||||
*/
|
||||
public class HttpAlertChannelTest {
|
||||
|
||||
@Test
|
||||
|
|
@ -71,29 +68,29 @@ public class HttpAlertChannelTest {
|
|||
|
||||
List<PluginParams> paramsList = new ArrayList<>();
|
||||
InputParam urlParam = InputParam.newBuilder("url", "url")
|
||||
.setValue("http://www.baidu.com")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
.setValue("http://www.baidu.com")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam headerParams = InputParam.newBuilder("headerParams", "headerParams")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("{\"Content-Type\":\"application/json\"}")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("{\"Content-Type\":\"application/json\"}")
|
||||
.build();
|
||||
|
||||
InputParam bodyParams = InputParam.newBuilder("bodyParams", "bodyParams")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("{\"number\":\"13457654323\"}")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.setValue("{\"number\":\"13457654323\"}")
|
||||
.build();
|
||||
|
||||
InputParam content = InputParam.newBuilder("contentField", "contentField")
|
||||
.setValue("content")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
.setValue("content")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
InputParam requestType = InputParam.newBuilder("requestType", "requestType")
|
||||
.setValue("POST")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
.setValue("POST")
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
paramsList.add(urlParam);
|
||||
paramsList.add(headerParams);
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.http;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -25,14 +25,10 @@ import java.util.Map;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* HttpSender UT
|
||||
*/
|
||||
public class HttpSenderTest {
|
||||
|
||||
@Test
|
||||
public void sendTest() {
|
||||
|
||||
Map<String, String> paramsMap = new HashMap<>();
|
||||
paramsMap.put(HttpAlertConstants.NAME_URL, "http://www.baidu.com");
|
||||
paramsMap.put(HttpAlertConstants.NAME_REQUEST_TYPE, "POST");
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?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:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>dolphinscheduler-alert-script</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
@ -17,13 +17,9 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
/**
|
||||
* OSUtils
|
||||
*/
|
||||
public class OSUtils {
|
||||
|
||||
public final class OSUtils {
|
||||
private OSUtils() {
|
||||
throw new UnsupportedOperationException("Construct OSUtils");
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
static Boolean isWindows() {
|
||||
|
|
@ -20,17 +20,12 @@ package org.apache.dolphinscheduler.plugin.alert.script;
|
|||
import java.io.IOException;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* ProcessUtils
|
||||
*/
|
||||
public class ProcessUtils {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ProcessUtils.class);
|
||||
public final class ProcessUtils {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(ProcessUtils.class);
|
||||
|
||||
private ProcessUtils() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -53,7 +48,7 @@ public class ProcessUtils {
|
|||
errorStreamGobbler.start();
|
||||
return process.waitFor();
|
||||
} catch (IOException | InterruptedException e) {
|
||||
logger.error("execute alert script error {}", e.getMessage());
|
||||
log.error("execute alert script error {}", e.getMessage());
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
|
||||
|
|
@ -17,18 +17,14 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
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 org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* ScriptAlertChannel
|
||||
*/
|
||||
public class ScriptAlertChannel implements AlertChannel {
|
||||
|
||||
public final class ScriptAlertChannel implements AlertChannel {
|
||||
@Override
|
||||
public AlertResult process(AlertInfo alertinfo) {
|
||||
AlertData alertData = alertinfo.getAlertData();
|
||||
|
|
@ -36,6 +32,6 @@ public class ScriptAlertChannel implements AlertChannel {
|
|||
if (null == paramsMap) {
|
||||
return new AlertResult("false", "script params is null");
|
||||
}
|
||||
return new ScriptSender(paramsMap).sendScriptAlert(alertData.getTitle(),alertData.getContent());
|
||||
return new ScriptSender(paramsMap).sendScriptAlert(alertData.getTitle(), alertData.getContent());
|
||||
}
|
||||
}
|
||||
|
|
@ -17,49 +17,49 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* ScriptAlertChannelFactory
|
||||
*/
|
||||
public class ScriptAlertChannelFactory implements AlertChannelFactory {
|
||||
import com.google.auto.service.AutoService;
|
||||
|
||||
@AutoService(AlertChannelFactory.class)
|
||||
public final class ScriptAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String getName() {
|
||||
public String name() {
|
||||
return "Script";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> getParams() {
|
||||
public List<PluginParams> params() {
|
||||
|
||||
InputParam scriptUserParam = InputParam.newBuilder(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS, ScriptParamsConstants.SCRIPT_USER_PARAMS)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false)
|
||||
.build())
|
||||
.setPlaceholder("please enter your custom parameters, which will be passed to you when calling your script")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(false)
|
||||
.build())
|
||||
.setPlaceholder("please enter your custom parameters, which will be passed to you when calling your script")
|
||||
.build();
|
||||
// need check file type and file exist
|
||||
InputParam scriptPathParam = InputParam.newBuilder(ScriptParamsConstants.NAME_SCRIPT_PATH, ScriptParamsConstants.SCRIPT_PATH)
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.setPlaceholder("please upload the file to the disk directory of the alert server, and ensure that the path is absolute and has the corresponding access rights")
|
||||
.build();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.setPlaceholder("please upload the file to the disk directory of the alert server,"
|
||||
+ " and ensure that the path is absolute and has the corresponding access rights")
|
||||
.build();
|
||||
|
||||
RadioParam scriptTypeParams = RadioParam.newBuilder(ScriptParamsConstants.NAME_SCRIPT_TYPE, ScriptParamsConstants.SCRIPT_TYPE)
|
||||
.addParamsOptions(new ParamsOptions(ScriptType.SHELL.getDescp(), ScriptType.SHELL.getDescp(), false))
|
||||
.setValue(ScriptType.SHELL.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
.addParamsOptions(new ParamsOptions(ScriptType.SHELL.getDescp(), ScriptType.SHELL.getDescp(), false))
|
||||
.setValue(ScriptType.SHELL.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
return Arrays.asList(scriptUserParam, scriptPathParam, scriptTypeParams);
|
||||
}
|
||||
|
|
@ -17,15 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
/**
|
||||
* ScriptParamsConstants
|
||||
*/
|
||||
public class ScriptParamsConstants {
|
||||
|
||||
private ScriptParamsConstants() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
public final class ScriptParamsConstants {
|
||||
static final String SCRIPT_TYPE = "$t('scriptType')";
|
||||
|
||||
static final String NAME_SCRIPT_TYPE = "type";
|
||||
|
|
@ -37,4 +29,8 @@ public class ScriptParamsConstants {
|
|||
static final String SCRIPT_USER_PARAMS = "$t('userParams')";
|
||||
|
||||
static final String NAME_SCRIPT_USER_PARAMS = "userParams";
|
||||
|
||||
private ScriptParamsConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -17,31 +17,20 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* ScriptSender
|
||||
*/
|
||||
public class ScriptSender {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ScriptSender.class);
|
||||
|
||||
private String scriptPath;
|
||||
|
||||
private String scriptType;
|
||||
|
||||
private String userParams;
|
||||
|
||||
public final class ScriptSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(ScriptSender.class);
|
||||
private static final String ALERT_TITLE_OPTION = " -t ";
|
||||
|
||||
private static final String ALERT_CONTENT_OPTION = " -c ";
|
||||
|
||||
private static final String ALERT_USER_PARAMS_OPTION = " -p ";
|
||||
private final String scriptPath;
|
||||
private final String scriptType;
|
||||
private final String userParams;
|
||||
|
||||
ScriptSender(Map<String, String> config) {
|
||||
scriptPath = config.get(ScriptParamsConstants.NAME_SCRIPT_PATH);
|
||||
|
|
@ -73,7 +62,7 @@ public class ScriptSender {
|
|||
return alertResult;
|
||||
}
|
||||
alertResult.setMessage("send script alert msg error,exitCode is " + exitCode);
|
||||
logger.info("send script alert msg error,exitCode is {}", exitCode);
|
||||
log.info("send script alert msg error,exitCode is {}", exitCode);
|
||||
return alertResult;
|
||||
}
|
||||
|
||||
|
|
@ -17,26 +17,17 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* ScriptType
|
||||
*/
|
||||
public enum ScriptType {
|
||||
|
||||
|
||||
SHELL(0, "SHELL"),
|
||||
;
|
||||
|
||||
private final int code;
|
||||
private final String descp;
|
||||
ScriptType(int code, String descp) {
|
||||
this.code = code;
|
||||
this.descp = descp;
|
||||
}
|
||||
|
||||
private final int code;
|
||||
private final String descp;
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
|
@ -23,16 +23,11 @@ import java.io.InputStream;
|
|||
import java.io.InputStreamReader;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* StreamGobbler
|
||||
*/
|
||||
public class StreamGobbler extends Thread {
|
||||
public final class StreamGobbler extends Thread {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(StreamGobbler.class);
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(StreamGobbler.class);
|
||||
|
||||
private InputStream inputStream;
|
||||
private final InputStream inputStream;
|
||||
|
||||
StreamGobbler(InputStream inputStream) {
|
||||
this.inputStream = inputStream;
|
||||
|
|
@ -51,16 +46,16 @@ public class StreamGobbler extends Thread {
|
|||
output.append(System.getProperty("line.separator"));
|
||||
}
|
||||
if (output.length() > 0) {
|
||||
logger.info("out put msg is{}", output);
|
||||
log.info("out put msg is{}", output);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.error("I/O error occurs {}", e.getMessage());
|
||||
log.error("I/O error occurs {}", e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
inputBufferReader.close();
|
||||
inputStreamReader.close();
|
||||
} catch (IOException e) {
|
||||
logger.error("I/O error occurs {}", e.getMessage());
|
||||
log.error("I/O error occurs {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -26,7 +26,7 @@ public class ProcessUtilsTest {
|
|||
|
||||
private static final String rootPath = System.getProperty("user.dir");
|
||||
|
||||
private static final String shellFilPath = rootPath + "/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/test.sh";
|
||||
private static final String shellFilPath = rootPath + "/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/test/script/shell/test.sh";
|
||||
|
||||
private String[] cmd = {"/bin/sh", "-c", shellFilPath + " -t 1"};
|
||||
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -33,7 +33,7 @@ public class ScriptAlertChannelFactoryTest {
|
|||
@Test
|
||||
public void testGetParams() {
|
||||
ScriptAlertChannelFactory scriptAlertChannelFactory = new ScriptAlertChannelFactory();
|
||||
List<PluginParams> params = scriptAlertChannelFactory.getParams();
|
||||
List<PluginParams> params = scriptAlertChannelFactory.params();
|
||||
Assert.assertEquals(3, params.size());
|
||||
}
|
||||
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.script;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -31,11 +31,9 @@ import org.junit.Test;
|
|||
*/
|
||||
public class ScriptSenderTest {
|
||||
|
||||
private static Map<String, String> scriptConfig = new HashMap<>();
|
||||
|
||||
private static final String rootPath = System.getProperty("user.dir");
|
||||
|
||||
private static final String shellFilPath = rootPath + "/src/test/script/shell/scriptExample.sh";
|
||||
private static Map<String, String> scriptConfig = new HashMap<>();
|
||||
|
||||
@Before
|
||||
public void initScriptConfig() {
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
<?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:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>dolphinscheduler-alert-slack</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
@ -17,18 +17,14 @@
|
|||
|
||||
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 org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* SlackAlertChannel
|
||||
*/
|
||||
public class SlackAlertChannel implements AlertChannel {
|
||||
|
||||
public final class SlackAlertChannel implements AlertChannel {
|
||||
@Override
|
||||
public AlertResult process(AlertInfo alertInfo) {
|
||||
AlertData alertData = alertInfo.getAlertData();
|
||||
|
|
@ -17,42 +17,41 @@
|
|||
|
||||
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.input.InputParam;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Slack alert factory, see {@link AlertChannelFactory}
|
||||
*/
|
||||
public class SlackAlertChannelFactory implements AlertChannelFactory {
|
||||
import com.google.auto.service.AutoService;
|
||||
|
||||
@AutoService(AlertChannelFactory.class)
|
||||
public final class SlackAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String getName() {
|
||||
public String name() {
|
||||
return "Slack";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> getParams() {
|
||||
public List<PluginParams> params() {
|
||||
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();
|
||||
.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();
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.setPlaceholder("Input the bot username")
|
||||
.build();
|
||||
|
||||
paramsList.add(webHookParam);
|
||||
paramsList.add(botName);
|
||||
|
|
@ -17,12 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.slack;
|
||||
|
||||
public class SlackParamsConstants {
|
||||
|
||||
private SlackParamsConstants() {
|
||||
|
||||
}
|
||||
|
||||
public final class SlackParamsConstants {
|
||||
public static final String SLACK_WEB_HOOK_URL = "$t('webhook')";
|
||||
public static final String SLACK_WEN_HOOK_URL_NAME = "webHook";
|
||||
public static final String SLACK_BOT = "$t('Username')";
|
||||
|
|
@ -31,4 +26,8 @@ public class SlackParamsConstants {
|
|||
public static final String ATTACHMENT = "attachments";
|
||||
|
||||
public static final Integer MAX_SHOW_NUMBER = 100;
|
||||
|
||||
private SlackParamsConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -39,17 +39,14 @@ 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 {
|
||||
public final class SlackSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(SlackSender.class);
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(SlackSender.class);
|
||||
|
||||
private String webHookUrl;
|
||||
|
||||
private String botName;
|
||||
private final String webHookUrl;
|
||||
private final String botName;
|
||||
|
||||
public SlackSender(Map<String, String> slackAlertParam) {
|
||||
webHookUrl = slackAlertParam.get(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME);
|
||||
|
|
@ -86,7 +83,7 @@ public class SlackSender {
|
|||
HttpEntity entity = response.getEntity();
|
||||
return EntityUtils.toString(entity, "UTF-8");
|
||||
} catch (Exception e) {
|
||||
logger.error("Send message to slack error.", e);
|
||||
log.error("Send message to slack error.", e);
|
||||
return "System Exception";
|
||||
}
|
||||
}
|
||||
|
|
@ -122,17 +119,17 @@ public class SlackSender {
|
|||
final int elementLen = maxLen;
|
||||
StringBuilder stringBuilder = new StringBuilder(200);
|
||||
stringBuilder.append(headers.stream()
|
||||
.map(header -> generateString(header, elementLen, " "))
|
||||
.collect(Collectors.joining("|")));
|
||||
.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("|")));
|
||||
.map(lement -> generateString("", elementLen, "-"))
|
||||
.collect(Collectors.joining("|")));
|
||||
stringBuilder.append("\n");
|
||||
stringBuilder.append(element.stream()
|
||||
.map(e -> generateString(e, elementLen, " "))
|
||||
.collect(Collectors.joining("|")));
|
||||
.map(e -> generateString(e, elementLen, " "))
|
||||
.collect(Collectors.joining("|")));
|
||||
stringBuilder.append("\n");
|
||||
}
|
||||
return String.format("```%s```", stringBuilder);
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.slack;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -31,12 +31,12 @@ public class SlackAlertChannelFactoryTest {
|
|||
|
||||
@Test
|
||||
public void testTestGetName() {
|
||||
Assert.assertEquals("Slack", slackAlertChannelFactory.getName());
|
||||
Assert.assertEquals("Slack", slackAlertChannelFactory.name());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetParams() {
|
||||
List<PluginParams> params = slackAlertChannelFactory.getParams();
|
||||
List<PluginParams> params = slackAlertChannelFactory.params();
|
||||
Assert.assertEquals(2, params.size());
|
||||
}
|
||||
|
||||
|
|
@ -45,4 +45,4 @@ public class SlackAlertChannelFactoryTest {
|
|||
AlertChannel alertChannel = slackAlertChannelFactory.create();
|
||||
Assert.assertTrue(alertChannel instanceof SlackAlertChannel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -29,11 +29,11 @@ public class SlackSenderTest {
|
|||
public void testSendMessage() {
|
||||
Map<String, String> alertparam = new HashMap<>();
|
||||
alertparam.put(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME,
|
||||
"https://hooks.slack.com/services/123456");
|
||||
"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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -15,20 +15,19 @@
|
|||
~ 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"
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
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>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>dolphinscheduler-alert-wechat</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<artifactId>dolphinscheduler-alert-http</artifactId>
|
||||
<packaging>dolphinscheduler-plugin</packaging>
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
|
|
@ -49,30 +48,5 @@
|
|||
<artifactId>jackson-databind</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>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
<classifier>runtime</classifier>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>dolphinscheduler-alert-http-${project.version}</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
|
@ -17,18 +17,14 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.wechat;
|
||||
|
||||
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 org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* WeChatAlertChannel
|
||||
*/
|
||||
public class WeChatAlertChannel implements AlertChannel {
|
||||
|
||||
public final class WeChatAlertChannel implements AlertChannel {
|
||||
@Override
|
||||
public AlertResult process(AlertInfo info) {
|
||||
AlertData alertData = info.getAlertData();
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* 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.wechat;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertConstants;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.params.base.Validate;
|
||||
import org.apache.dolphinscheduler.spi.params.input.InputParam;
|
||||
import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.auto.service.AutoService;
|
||||
|
||||
@AutoService(AlertChannelFactory.class)
|
||||
public final class WeChatAlertChannelFactory implements AlertChannelFactory {
|
||||
@Override
|
||||
public String name() {
|
||||
return "WeChat";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PluginParams> params() {
|
||||
InputParam corpIdParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_CORP_ID, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_CORP_ID)
|
||||
.setPlaceholder("please input corp id ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam secretParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_SECRET, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_SECRET)
|
||||
.setPlaceholder("please input secret ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam usersParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USERS, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_USERS)
|
||||
.setPlaceholder("please input users ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam userSendMsgParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USER_SEND_MSG, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_USER_SEND_MSG)
|
||||
.setPlaceholder("please input corp id ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
InputParam agentIdParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_AGENT_ID)
|
||||
.setPlaceholder("please input agent id ")
|
||||
.addValidate(Validate.newBuilder()
|
||||
.setRequired(true)
|
||||
.build())
|
||||
.build();
|
||||
|
||||
RadioParam showType = RadioParam.newBuilder(AlertConstants.NAME_SHOW_TYPE, AlertConstants.SHOW_TYPE)
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TABLE.getDescp(), ShowType.TABLE.getDescp(), false))
|
||||
.addParamsOptions(new ParamsOptions(ShowType.TEXT.getDescp(), ShowType.TEXT.getDescp(), false))
|
||||
.setValue(ShowType.TABLE.getDescp())
|
||||
.addValidate(Validate.newBuilder().setRequired(true).build())
|
||||
.build();
|
||||
|
||||
return Arrays.asList(corpIdParam, secretParam, usersParam, userSendMsgParam, agentIdParam, showType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertChannel create() {
|
||||
return new WeChatAlertChannel();
|
||||
}
|
||||
}
|
||||
|
|
@ -17,15 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.wechat;
|
||||
|
||||
/**
|
||||
* WeChatAlertConstants
|
||||
*/
|
||||
public class WeChatAlertConstants {
|
||||
|
||||
private WeChatAlertConstants() {
|
||||
throw new IllegalStateException(WeChatAlertConstants.class.getName());
|
||||
}
|
||||
|
||||
public final class WeChatAlertConstants {
|
||||
static final String MARKDOWN_QUOTE = ">";
|
||||
|
||||
static final String MARKDOWN_ENTER = "\n";
|
||||
|
|
@ -35,4 +27,8 @@ public class WeChatAlertConstants {
|
|||
static final String WE_CHAT_PUSH_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={token}";
|
||||
|
||||
static final String WE_CHAT_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={secret}";
|
||||
|
||||
private WeChatAlertConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -17,43 +17,21 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.wechat;
|
||||
|
||||
/**
|
||||
* WeChatAlertParamsConstants
|
||||
*/
|
||||
public class WeChatAlertParamsConstants {
|
||||
|
||||
private WeChatAlertParamsConstants() {
|
||||
throw new IllegalStateException(WeChatAlertParamsConstants.class.getName());
|
||||
}
|
||||
|
||||
public final class WeChatAlertParamsConstants {
|
||||
static final String ENTERPRISE_WE_CHAT_CORP_ID = "$t('corpId')";
|
||||
|
||||
static final String NAME_ENTERPRISE_WE_CHAT_CORP_ID = "corpId";
|
||||
|
||||
|
||||
static final String ENTERPRISE_WE_CHAT_SECRET = "$t('secret')";
|
||||
|
||||
static final String NAME_ENTERPRISE_WE_CHAT_SECRET = "secret";
|
||||
|
||||
static final String ENTERPRISE_WE_CHAT_TEAM_SEND_MSG = "$t('teamSendMsg')";
|
||||
|
||||
static final String NAME_ENTERPRISE_WE_CHAT_TEAM_SEND_MSG = "teamSendMsg";
|
||||
|
||||
|
||||
static final String ENTERPRISE_WE_CHAT_USER_SEND_MSG = "$t('userSendMsg')";
|
||||
|
||||
static final String NAME_ENTERPRISE_WE_CHAT_USER_SEND_MSG = "userSendMsg";
|
||||
|
||||
|
||||
static final String ENTERPRISE_WE_CHAT_AGENT_ID = "$t('agentId')";
|
||||
|
||||
static final String NAME_ENTERPRISE_WE_CHAT_AGENT_ID = "agentId";
|
||||
|
||||
|
||||
static final String ENTERPRISE_WE_CHAT_USERS = "$t('users')";
|
||||
|
||||
|
||||
static final String NAME_ENTERPRISE_WE_CHAT_USERS = "users";
|
||||
|
||||
|
||||
private WeChatAlertParamsConstants() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
|
|
@ -19,10 +19,9 @@ package org.apache.dolphinscheduler.plugin.alert.wechat;
|
|||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import org.apache.dolphinscheduler.plugin.alert.wechat.exception.WeChatAlertException;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertConstants;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.spi.utils.StringUtils;
|
||||
|
||||
|
|
@ -47,28 +46,9 @@ import java.util.Map.Entry;
|
|||
import java.util.Set;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* WeChatSender
|
||||
*/
|
||||
public class WeChatSender {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(WeChatSender.class);
|
||||
|
||||
private String weChatAgentId;
|
||||
|
||||
private String weChatUsers;
|
||||
|
||||
private String weChatUserSendMsg;
|
||||
|
||||
private String weChatTokenUrlReplace;
|
||||
|
||||
private String weChatToken;
|
||||
|
||||
private String showType;
|
||||
|
||||
|
||||
public final class WeChatSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(WeChatSender.class);
|
||||
private static final String MUST_NOT_NULL = " must not null";
|
||||
private static final String ALERT_STATUS = "false";
|
||||
private static final String AGENT_ID_REG_EXP = "{agentId}";
|
||||
|
|
@ -77,6 +57,12 @@ public class WeChatSender {
|
|||
private static final String CORP_ID_REGEX = "{corpId}";
|
||||
private static final String SECRET_REGEX = "{secret}";
|
||||
private static final String TOKEN_REGEX = "{token}";
|
||||
private final String weChatAgentId;
|
||||
private final String weChatUsers;
|
||||
private final String weChatUserSendMsg;
|
||||
private final String weChatTokenUrlReplace;
|
||||
private final String weChatToken;
|
||||
private final String showType;
|
||||
|
||||
WeChatSender(Map<String, String> config) {
|
||||
weChatAgentId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID);
|
||||
|
|
@ -93,50 +79,6 @@ public class WeChatSender {
|
|||
weChatToken = getToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* make user multi user message
|
||||
*
|
||||
* @param toUser the toUser
|
||||
* @param agentId the agentId
|
||||
* @param msg the msg
|
||||
* @return Enterprise WeChat send message
|
||||
*/
|
||||
private String makeUserSendMsg(Collection<String> toUser, String agentId, String msg) {
|
||||
String listUser = mkString(toUser);
|
||||
return weChatUserSendMsg.replace(USER_REG_EXP, listUser)
|
||||
.replace(AGENT_ID_REG_EXP, agentId)
|
||||
.replace(MSG_REG_EXP, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* send Enterprise WeChat
|
||||
*
|
||||
* @return Enterprise WeChat resp, demo: {"errcode":0,"errmsg":"ok","invaliduser":""}
|
||||
*/
|
||||
public AlertResult sendEnterpriseWeChat(String title, String content) {
|
||||
AlertResult alertResult;
|
||||
List<String> userList = Arrays.asList(weChatUsers.split(","));
|
||||
String data = markdownByAlert(title, content);
|
||||
String msg = makeUserSendMsg(userList, weChatAgentId, data);
|
||||
if (null == weChatToken) {
|
||||
alertResult = new AlertResult();
|
||||
alertResult.setMessage("send we chat alert fail,get weChat token error");
|
||||
alertResult.setStatus(ALERT_STATUS);
|
||||
return alertResult;
|
||||
}
|
||||
String enterpriseWeChatPushUrlReplace = WeChatAlertConstants.WE_CHAT_PUSH_URL.replace(TOKEN_REGEX, weChatToken);
|
||||
|
||||
try {
|
||||
return checkWeChatSendMsgResult(post(enterpriseWeChatPushUrlReplace, msg));
|
||||
} catch (Exception e) {
|
||||
logger.info("send we chat alert msg exception : {}", e.getMessage());
|
||||
alertResult = new AlertResult();
|
||||
alertResult.setMessage("send we chat alert fail");
|
||||
alertResult.setStatus(ALERT_STATUS);
|
||||
}
|
||||
return alertResult;
|
||||
}
|
||||
|
||||
private static String post(String url, String data) throws IOException {
|
||||
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
|
||||
HttpPost httpPost = new HttpPost(url);
|
||||
|
|
@ -150,7 +92,7 @@ public class WeChatSender {
|
|||
} finally {
|
||||
response.close();
|
||||
}
|
||||
logger.info("Enterprise WeChat send [{}], param:{}, resp:{}",
|
||||
log.info("Enterprise WeChat send [{}], param:{}, resp:{}",
|
||||
url, data, resp);
|
||||
return resp;
|
||||
}
|
||||
|
|
@ -166,8 +108,8 @@ public class WeChatSender {
|
|||
private static String markdownTable(String title, String content) {
|
||||
List<LinkedHashMap> mapItemsList = JSONUtils.toList(content, LinkedHashMap.class);
|
||||
if (null == mapItemsList || mapItemsList.isEmpty()) {
|
||||
logger.error("itemsList is null");
|
||||
throw new WeChatAlertException("itemsList is null");
|
||||
log.error("itemsList is null");
|
||||
throw new RuntimeException("itemsList is null");
|
||||
}
|
||||
StringBuilder contents = new StringBuilder(200);
|
||||
for (LinkedHashMap mapItems : mapItemsList) {
|
||||
|
|
@ -199,7 +141,7 @@ public class WeChatSender {
|
|||
if (StringUtils.isNotEmpty(content)) {
|
||||
List<LinkedHashMap> mapItemsList = JSONUtils.toList(content, LinkedHashMap.class);
|
||||
if (null == mapItemsList || mapItemsList.isEmpty()) {
|
||||
logger.error("itemsList is null");
|
||||
log.error("itemsList is null");
|
||||
throw new RuntimeException("itemsList is null");
|
||||
}
|
||||
|
||||
|
|
@ -220,31 +162,6 @@ public class WeChatSender {
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the mardown style based on the show type of the alert
|
||||
*
|
||||
* @return the markdown alert table/text
|
||||
*/
|
||||
private String markdownByAlert(String title, String content) {
|
||||
String result = "";
|
||||
if (showType.equals(ShowType.TABLE.getDescp())) {
|
||||
result = markdownTable(title, content);
|
||||
} else if (showType.equals(ShowType.TEXT.getDescp())) {
|
||||
result = markdownText(title, content);
|
||||
}
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
private String getToken() {
|
||||
try {
|
||||
return get(weChatTokenUrlReplace);
|
||||
} catch (IOException e) {
|
||||
logger.info("we chat alert get token error{}", e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static String get(String url) throws IOException {
|
||||
String resp;
|
||||
|
||||
|
|
@ -266,7 +183,6 @@ public class WeChatSender {
|
|||
}
|
||||
|
||||
private static String mkString(Iterable<String> list) {
|
||||
|
||||
if (null == list || StringUtils.isEmpty("|")) {
|
||||
return null;
|
||||
}
|
||||
|
|
@ -284,40 +200,19 @@ public class WeChatSender {
|
|||
return sb.toString();
|
||||
}
|
||||
|
||||
public static class WeChatSendMsgResponse {
|
||||
private Integer errcode;
|
||||
private String errmsg;
|
||||
|
||||
public Integer getErrcode() {
|
||||
return errcode;
|
||||
}
|
||||
|
||||
public void setErrcode(Integer errcode) {
|
||||
this.errcode = errcode;
|
||||
}
|
||||
|
||||
public String getErrmsg() {
|
||||
return errmsg;
|
||||
}
|
||||
|
||||
public void setErrmsg(String errmsg) {
|
||||
this.errmsg = errmsg;
|
||||
}
|
||||
}
|
||||
|
||||
private static AlertResult checkWeChatSendMsgResult(String result) {
|
||||
AlertResult alertResult = new AlertResult();
|
||||
alertResult.setStatus(ALERT_STATUS);
|
||||
|
||||
if (null == result) {
|
||||
alertResult.setMessage("we chat send fail");
|
||||
logger.info("send we chat msg error,resp is null");
|
||||
log.info("send we chat msg error,resp is null");
|
||||
return alertResult;
|
||||
}
|
||||
WeChatSendMsgResponse sendMsgResponse = JSONUtils.parseObject(result, WeChatSendMsgResponse.class);
|
||||
if (null == sendMsgResponse) {
|
||||
alertResult.setMessage("we chat send fail");
|
||||
logger.info("send we chat msg error,resp error");
|
||||
log.info("send we chat msg error,resp error");
|
||||
return alertResult;
|
||||
}
|
||||
if (sendMsgResponse.errcode == 0) {
|
||||
|
|
@ -329,4 +224,132 @@ public class WeChatSender {
|
|||
alertResult.setMessage(sendMsgResponse.getErrmsg());
|
||||
return alertResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* make user multi user message
|
||||
*
|
||||
* @param toUser the toUser
|
||||
* @param agentId the agentId
|
||||
* @param msg the msg
|
||||
* @return Enterprise WeChat send message
|
||||
*/
|
||||
private String makeUserSendMsg(Collection<String> toUser, String agentId, String msg) {
|
||||
String listUser = mkString(toUser);
|
||||
return weChatUserSendMsg.replace(USER_REG_EXP, listUser)
|
||||
.replace(AGENT_ID_REG_EXP, agentId)
|
||||
.replace(MSG_REG_EXP, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* send Enterprise WeChat
|
||||
*
|
||||
* @return Enterprise WeChat resp, demo: {"errcode":0,"errmsg":"ok","invaliduser":""}
|
||||
*/
|
||||
public AlertResult sendEnterpriseWeChat(String title, String content) {
|
||||
AlertResult alertResult;
|
||||
List<String> userList = Arrays.asList(weChatUsers.split(","));
|
||||
String data = markdownByAlert(title, content);
|
||||
String msg = makeUserSendMsg(userList, weChatAgentId, data);
|
||||
if (null == weChatToken) {
|
||||
alertResult = new AlertResult();
|
||||
alertResult.setMessage("send we chat alert fail,get weChat token error");
|
||||
alertResult.setStatus(ALERT_STATUS);
|
||||
return alertResult;
|
||||
}
|
||||
String enterpriseWeChatPushUrlReplace = WeChatAlertConstants.WE_CHAT_PUSH_URL.replace(TOKEN_REGEX, weChatToken);
|
||||
|
||||
try {
|
||||
return checkWeChatSendMsgResult(post(enterpriseWeChatPushUrlReplace, msg));
|
||||
} catch (Exception e) {
|
||||
log.info("send we chat alert msg exception : {}", e.getMessage());
|
||||
alertResult = new AlertResult();
|
||||
alertResult.setMessage("send we chat alert fail");
|
||||
alertResult.setStatus(ALERT_STATUS);
|
||||
}
|
||||
return alertResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the mardown style based on the show type of the alert
|
||||
*
|
||||
* @return the markdown alert table/text
|
||||
*/
|
||||
private String markdownByAlert(String title, String content) {
|
||||
String result = "";
|
||||
if (showType.equals(ShowType.TABLE.getDescp())) {
|
||||
result = markdownTable(title, content);
|
||||
} else if (showType.equals(ShowType.TEXT.getDescp())) {
|
||||
result = markdownText(title, content);
|
||||
}
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
private String getToken() {
|
||||
try {
|
||||
return get(weChatTokenUrlReplace);
|
||||
} catch (IOException e) {
|
||||
log.info("we chat alert get token error{}", e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static final class WeChatSendMsgResponse {
|
||||
private Integer errcode;
|
||||
private String errmsg;
|
||||
|
||||
public WeChatSendMsgResponse() {
|
||||
}
|
||||
|
||||
public Integer getErrcode() {
|
||||
return this.errcode;
|
||||
}
|
||||
|
||||
public void setErrcode(Integer errcode) {
|
||||
this.errcode = errcode;
|
||||
}
|
||||
|
||||
public String getErrmsg() {
|
||||
return this.errmsg;
|
||||
}
|
||||
|
||||
public void setErrmsg(String errmsg) {
|
||||
this.errmsg = errmsg;
|
||||
}
|
||||
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof WeChatSendMsgResponse)) {
|
||||
return false;
|
||||
}
|
||||
final WeChatSendMsgResponse other = (WeChatSendMsgResponse) o;
|
||||
final Object this$errcode = this.getErrcode();
|
||||
final Object other$errcode = other.getErrcode();
|
||||
if (this$errcode == null ? other$errcode != null : !this$errcode.equals(other$errcode)) {
|
||||
return false;
|
||||
}
|
||||
final Object this$errmsg = this.getErrmsg();
|
||||
final Object other$errmsg = other.getErrmsg();
|
||||
if (this$errmsg == null ? other$errmsg != null : !this$errmsg.equals(other$errmsg)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final Object $errcode = this.getErrcode();
|
||||
result = result * PRIME + ($errcode == null ? 43 : $errcode.hashCode());
|
||||
final Object $errmsg = this.getErrmsg();
|
||||
result = result * PRIME + ($errmsg == null ? 43 : $errmsg.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "WeChatSender.WeChatSendMsgResponse(errcode=" + this.getErrcode() + ", errmsg=" + this.getErrmsg() + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.wechat;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils;
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ public class WeChatAlertChannelFactoryTest {
|
|||
@Test
|
||||
public void testGetParams() {
|
||||
WeChatAlertChannelFactory weChatAlertChannelFactory = new WeChatAlertChannelFactory();
|
||||
List<PluginParams> params = weChatAlertChannelFactory.getParams();
|
||||
List<PluginParams> params = weChatAlertChannelFactory.params();
|
||||
JSONUtils.toJsonString(params);
|
||||
Assert.assertEquals(6, params.size());
|
||||
}
|
||||
|
|
@ -17,9 +17,9 @@
|
|||
|
||||
package org.apache.dolphinscheduler.plugin.alert.wechat;
|
||||
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertConstants;
|
||||
import org.apache.dolphinscheduler.spi.alert.AlertResult;
|
||||
import org.apache.dolphinscheduler.spi.alert.ShowType;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertConstants;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.alert.api.ShowType;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -36,24 +36,24 @@ public class WeChatSenderTest {
|
|||
private static Map<String, String> weChatConfig = new HashMap<>();
|
||||
|
||||
private String content = "[{\"id\":\"69\","
|
||||
+
|
||||
"\"name\":\"UserBehavior-0--1193959466\","
|
||||
+
|
||||
"\"Job name\":\"Start workflow\","
|
||||
+
|
||||
"\"State\":\"SUCCESS\","
|
||||
+
|
||||
"\"Recovery\":\"NO\","
|
||||
+
|
||||
"\"Run time\":\"1\","
|
||||
+
|
||||
"\"Start time\": \"2018-08-06 10:31:34.0\","
|
||||
+
|
||||
"\"End time\": \"2018-08-06 10:31:49.0\","
|
||||
+
|
||||
"\"Host\": \"192.168.xx.xx\","
|
||||
+
|
||||
"\"Notify group\" :\"4\"}]";
|
||||
+
|
||||
"\"name\":\"UserBehavior-0--1193959466\","
|
||||
+
|
||||
"\"Job name\":\"Start workflow\","
|
||||
+
|
||||
"\"State\":\"SUCCESS\","
|
||||
+
|
||||
"\"Recovery\":\"NO\","
|
||||
+
|
||||
"\"Run time\":\"1\","
|
||||
+
|
||||
"\"Start time\": \"2018-08-06 10:31:34.0\","
|
||||
+
|
||||
"\"End time\": \"2018-08-06 10:31:49.0\","
|
||||
+
|
||||
"\"Host\": \"192.168.xx.xx\","
|
||||
+
|
||||
"\"Notify group\" :\"4\"}]";
|
||||
|
||||
@Before
|
||||
public void initDingTalkConfig() {
|
||||
|
|
@ -62,8 +62,8 @@ public class WeChatSenderTest {
|
|||
weChatConfig.put(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_CORP_ID, "NAME_ENTERPRISE_WE_CHAT_CORP_ID");
|
||||
weChatConfig.put(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_SECRET, "NAME_ENTERPRISE_WE_CHAT_SECRET");
|
||||
weChatConfig.put(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USER_SEND_MSG, "{\"touser\":\"{toUser}\",\"agentid\":{agentId}"
|
||||
+
|
||||
",\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"{msg}\"}}"
|
||||
+
|
||||
",\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"{msg}\"}}"
|
||||
);
|
||||
weChatConfig.put(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USERS, "Kris");
|
||||
weChatConfig.put(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_TEAM_SEND_MSG, "msg");
|
||||
|
|
@ -15,18 +15,16 @@
|
|||
~ 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"
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>dolphinscheduler</artifactId>
|
||||
<artifactId>dolphinscheduler-alert</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-plugin</artifactId>
|
||||
<artifactId>dolphinscheduler-alert-plugins</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<modules>
|
||||
|
|
@ -40,12 +38,10 @@
|
|||
</modules>
|
||||
|
||||
<dependencies>
|
||||
<!-- dolphinscheduler -->
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-spi</artifactId>
|
||||
<scope>provided</scope>
|
||||
<artifactId>dolphinscheduler-alert-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
|
@ -15,103 +15,107 @@
|
|||
~ 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"
|
||||
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>dolphinscheduler-alert-plugin</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert</artifactId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-email</artifactId>
|
||||
<!-- can be load as a Alert Plugin when development and run server in IDE -->
|
||||
<packaging>dolphinscheduler-plugin</packaging>
|
||||
<artifactId>dolphinscheduler-alert-server</artifactId>
|
||||
<name>${project.artifactId}</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
<!-- dolphinscheduler -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-collections4</artifactId>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-remote</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-dingtalk</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-email</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-feishu</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-http</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-script</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-slack</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-alert-wechat</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</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>org.apache.commons</groupId>
|
||||
<artifactId>commons-email</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>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.powermock</groupId>
|
||||
<artifactId>powermock-module-junit4</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.powermock</groupId>
|
||||
<artifactId>powermock-api-mockito2</artifactId>
|
||||
<scope>test</scope>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-dao</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<artifactId>log4j-api</artifactId>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
<classifier>runtime</classifier>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>jsr305</artifactId>
|
||||
<groupId>com.google.code.findbugs</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--excel poi-->
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-inline</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>dolphinscheduler-alert-email-${project.version}</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* 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.alert;
|
||||
|
||||
import static java.lang.String.format;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
|
||||
import org.apache.dolphinscheduler.common.enums.PluginType;
|
||||
import org.apache.dolphinscheduler.dao.PluginDao;
|
||||
import org.apache.dolphinscheduler.dao.entity.PluginDefine;
|
||||
import org.apache.dolphinscheduler.spi.params.PluginParamsTransfer;
|
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public final class AlertPluginManager {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(AlertPluginManager.class);
|
||||
|
||||
private final PluginDao pluginDao;
|
||||
|
||||
private final Map<Integer, AlertChannel> channelKeyedById = new HashMap<>();
|
||||
|
||||
public AlertPluginManager(PluginDao pluginDao) {
|
||||
this.pluginDao = pluginDao;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void installPlugin() {
|
||||
final Set<String> names = new HashSet<>();
|
||||
|
||||
ServiceLoader.load(AlertChannelFactory.class).forEach(factory -> {
|
||||
final String name = factory.name();
|
||||
|
||||
log.info("Registering alert plugin: {}", name);
|
||||
|
||||
if (!names.add(name)) {
|
||||
throw new IllegalStateException(format("Duplicate alert plugins named '%s'", name));
|
||||
}
|
||||
|
||||
final AlertChannel alertChannel = factory.create();
|
||||
|
||||
log.info("Registered alert plugin: {}", name);
|
||||
|
||||
final List<PluginParams> params = factory.params();
|
||||
final String paramsJson = PluginParamsTransfer.transferParamsToJson(params);
|
||||
|
||||
final PluginDefine pluginDefine = new PluginDefine(name, PluginType.ALERT.getDesc(), paramsJson);
|
||||
final int id = pluginDao.addOrUpdatePluginDefine(pluginDefine);
|
||||
|
||||
channelKeyedById.put(id, alertChannel);
|
||||
});
|
||||
}
|
||||
|
||||
public Optional<AlertChannel> getAlertChannel(int id) {
|
||||
return Optional.ofNullable(channelKeyedById.get(id));
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return channelKeyedById.size();
|
||||
}
|
||||
}
|
||||
|
|
@ -15,11 +15,10 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.processor;
|
||||
package org.apache.dolphinscheduler.alert;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.plugin.AlertPluginManager;
|
||||
import org.apache.dolphinscheduler.alert.runner.AlertSender;
|
||||
import org.apache.dolphinscheduler.dao.AlertDao;
|
||||
import org.apache.dolphinscheduler.remote.command.Command;
|
||||
import org.apache.dolphinscheduler.remote.command.CommandType;
|
||||
import org.apache.dolphinscheduler.remote.command.alert.AlertSendRequestCommand;
|
||||
|
|
@ -28,35 +27,33 @@ import org.apache.dolphinscheduler.remote.processor.NettyRequestProcessor;
|
|||
import org.apache.dolphinscheduler.remote.utils.JsonSerializer;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import io.netty.channel.Channel;
|
||||
|
||||
public class AlertRequestProcessor implements NettyRequestProcessor {
|
||||
@Component
|
||||
public final class AlertRequestProcessor implements NettyRequestProcessor {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(AlertRequestProcessor.class);
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(AlertRequestProcessor.class);
|
||||
private final AlertDao alertDao;
|
||||
private final AlertPluginManager alertPluginManager;
|
||||
private final AlertSender alertSender;
|
||||
|
||||
public AlertRequestProcessor(AlertDao alertDao, AlertPluginManager alertPluginManager) {
|
||||
this.alertDao = alertDao;
|
||||
this.alertPluginManager = alertPluginManager;
|
||||
public AlertRequestProcessor(AlertSender alertSender) {
|
||||
this.alertSender = alertSender;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Channel channel, Command command) {
|
||||
Preconditions.checkArgument(CommandType.ALERT_SEND_REQUEST == command.getType(),
|
||||
String.format("invalid command type : %s", command.getType()));
|
||||
checkArgument(CommandType.ALERT_SEND_REQUEST == command.getType(), "invalid command type: %s", command.getType());
|
||||
|
||||
AlertSendRequestCommand alertSendRequestCommand = JsonSerializer.deserialize(
|
||||
command.getBody(), AlertSendRequestCommand.class);
|
||||
logger.info("received command : {}", alertSendRequestCommand);
|
||||
command.getBody(), AlertSendRequestCommand.class);
|
||||
|
||||
AlertSender alertSender = new AlertSender(alertDao, alertPluginManager);
|
||||
AlertSendResponseCommand alertSendResponseCommand = alertSender.syncHandler(alertSendRequestCommand.getGroupId(), alertSendRequestCommand.getTitle(), alertSendRequestCommand.getContent());
|
||||
log.info("Received command : {}", alertSendRequestCommand);
|
||||
|
||||
AlertSendResponseCommand alertSendResponseCommand = alertSender.syncHandler(
|
||||
alertSendRequestCommand.getGroupId(),
|
||||
alertSendRequestCommand.getTitle(),
|
||||
alertSendRequestCommand.getContent());
|
||||
channel.writeAndFlush(alertSendResponseCommand.convert2Command(command.getOpaque()));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -15,9 +15,12 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.runner;
|
||||
package org.apache.dolphinscheduler.alert;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.plugin.AlertPluginManager;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertChannel;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertData;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
||||
import org.apache.dolphinscheduler.alert.api.AlertResult;
|
||||
import org.apache.dolphinscheduler.common.enums.AlertStatus;
|
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.dao.AlertDao;
|
||||
|
|
@ -25,67 +28,50 @@ import org.apache.dolphinscheduler.dao.entity.Alert;
|
|||
import org.apache.dolphinscheduler.dao.entity.AlertPluginInstance;
|
||||
import org.apache.dolphinscheduler.remote.command.alert.AlertSendResponseCommand;
|
||||
import org.apache.dolphinscheduler.remote.command.alert.AlertSendResponseResult;
|
||||
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 org.apache.commons.collections.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
public class AlertSender {
|
||||
@Component
|
||||
public final class AlertSender {
|
||||
private static final Logger log = org.slf4j.LoggerFactory.getLogger(AlertSender.class);
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(AlertSender.class);
|
||||
|
||||
private List<Alert> alertList;
|
||||
private AlertDao alertDao;
|
||||
private final AlertDao alertDao;
|
||||
private final AlertPluginManager alertPluginManager;
|
||||
|
||||
public AlertSender(AlertPluginManager alertPluginManager) {
|
||||
this.alertPluginManager = alertPluginManager;
|
||||
}
|
||||
|
||||
public AlertSender(AlertDao alertDao, AlertPluginManager alertPluginManager) {
|
||||
super();
|
||||
this.alertDao = alertDao;
|
||||
this.alertPluginManager = alertPluginManager;
|
||||
}
|
||||
|
||||
public AlertSender(List<Alert> alertList, AlertDao alertDao, AlertPluginManager alertPluginManager) {
|
||||
super();
|
||||
this.alertList = alertList;
|
||||
this.alertDao = alertDao;
|
||||
this.alertPluginManager = alertPluginManager;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
for (Alert alert : alertList) {
|
||||
public void send(List<Alert> alerts) {
|
||||
for (Alert alert : alerts) {
|
||||
//get alert group from alert
|
||||
int alertGroupId = alert.getAlertGroupId();
|
||||
List<AlertPluginInstance> alertInstanceList = alertDao.listInstanceByAlertGroupId(alertGroupId);
|
||||
if (CollectionUtils.isEmpty(alertInstanceList)) {
|
||||
logger.error("send alert msg fail,no bind plugin instance.");
|
||||
log.error("send alert msg fail,no bind plugin instance.");
|
||||
alertDao.updateAlert(AlertStatus.EXECUTION_FAILURE, "no bind plugin instance", alert.getId());
|
||||
continue;
|
||||
}
|
||||
AlertData alertData = new AlertData();
|
||||
alertData.setId(alert.getId())
|
||||
.setContent(alert.getContent())
|
||||
.setLog(alert.getLog())
|
||||
.setTitle(alert.getTitle());
|
||||
.setContent(alert.getContent())
|
||||
.setLog(alert.getLog())
|
||||
.setTitle(alert.getTitle());
|
||||
|
||||
for (AlertPluginInstance instance : alertInstanceList) {
|
||||
|
||||
AlertResult alertResult = this.alertResultHandler(instance, alertData);
|
||||
AlertStatus alertStatus = Boolean.parseBoolean(String.valueOf(alertResult.getStatus())) ? AlertStatus.EXECUTION_SUCCESS : AlertStatus.EXECUTION_FAILURE;
|
||||
alertDao.updateAlert(alertStatus, alertResult.getMessage(), alert.getId());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -100,30 +86,28 @@ public class AlertSender {
|
|||
* @return AlertSendResponseCommand
|
||||
*/
|
||||
public AlertSendResponseCommand syncHandler(int alertGroupId, String title, String content) {
|
||||
|
||||
List<AlertPluginInstance> alertInstanceList = alertDao.listInstanceByAlertGroupId(alertGroupId);
|
||||
AlertData alertData = new AlertData();
|
||||
alertData.setContent(content)
|
||||
.setTitle(title);
|
||||
.setTitle(title);
|
||||
|
||||
boolean sendResponseStatus = true;
|
||||
List<AlertSendResponseResult> sendResponseResults = new ArrayList<>();
|
||||
|
||||
if (CollectionUtils.isEmpty(alertInstanceList)) {
|
||||
sendResponseStatus = false;
|
||||
AlertSendResponseResult alertSendResponseResult = new AlertSendResponseResult();
|
||||
String message = String.format("Alert GroupId %s send error : not found alert instance", alertGroupId);
|
||||
alertSendResponseResult.setStatus(sendResponseStatus);
|
||||
alertSendResponseResult.setStatus(false);
|
||||
alertSendResponseResult.setMessage(message);
|
||||
sendResponseResults.add(alertSendResponseResult);
|
||||
logger.error("Alert GroupId {} send error : not found alert instance", alertGroupId);
|
||||
return new AlertSendResponseCommand(sendResponseStatus, sendResponseResults);
|
||||
log.error("Alert GroupId {} send error : not found alert instance", alertGroupId);
|
||||
return new AlertSendResponseCommand(false, sendResponseResults);
|
||||
}
|
||||
|
||||
for (AlertPluginInstance instance : alertInstanceList) {
|
||||
AlertResult alertResult = this.alertResultHandler(instance, alertData);
|
||||
AlertSendResponseResult alertSendResponseResult = new AlertSendResponseResult(
|
||||
Boolean.parseBoolean(String.valueOf(alertResult.getStatus())), alertResult.getMessage());
|
||||
Boolean.parseBoolean(String.valueOf(alertResult.getStatus())), alertResult.getMessage());
|
||||
sendResponseStatus = sendResponseStatus && alertSendResponseResult.getStatus();
|
||||
sendResponseResults.add(alertSendResponseResult);
|
||||
}
|
||||
|
|
@ -139,15 +123,14 @@ public class AlertSender {
|
|||
* @return AlertResult
|
||||
*/
|
||||
private AlertResult alertResultHandler(AlertPluginInstance instance, AlertData alertData) {
|
||||
String pluginName = alertPluginManager.getPluginNameById(instance.getPluginDefineId());
|
||||
AlertChannel alertChannel = alertPluginManager.getAlertChannelMap().get(pluginName);
|
||||
Optional<AlertChannel> alertChannel = alertPluginManager.getAlertChannel(instance.getPluginDefineId());
|
||||
AlertResult alertResultExtend = new AlertResult();
|
||||
String pluginInstanceName = instance.getInstanceName();
|
||||
if (alertChannel == null) {
|
||||
if (!alertChannel.isPresent()) {
|
||||
String message = String.format("Alert Plugin %s send error : return value is null", pluginInstanceName);
|
||||
alertResultExtend.setStatus(String.valueOf(false));
|
||||
alertResultExtend.setMessage(message);
|
||||
logger.error("Alert Plugin {} send error : not found plugin {}", pluginInstanceName, pluginName);
|
||||
log.error("Alert Plugin {} send error : not found plugin {}", pluginInstanceName, instance.getPluginDefineId());
|
||||
return alertResultExtend;
|
||||
}
|
||||
|
||||
|
|
@ -157,29 +140,27 @@ public class AlertSender {
|
|||
alertInfo.setAlertParams(paramsMap);
|
||||
AlertResult alertResult;
|
||||
try {
|
||||
alertResult = alertChannel.process(alertInfo);
|
||||
alertResult = alertChannel.get().process(alertInfo);
|
||||
} catch (Exception e) {
|
||||
alertResult = new AlertResult("false", e.getMessage());
|
||||
logger.error("send alert error alert data id :{},", alertData.getId(), e);
|
||||
log.error("send alert error alert data id :{},", alertData.getId(), e);
|
||||
}
|
||||
|
||||
|
||||
if (alertResult == null) {
|
||||
String message = String.format("Alert Plugin %s send error : return alertResult value is null", pluginInstanceName);
|
||||
alertResultExtend.setStatus(String.valueOf(false));
|
||||
alertResultExtend.setMessage(message);
|
||||
logger.info("Alert Plugin {} send error : return alertResult value is null", pluginInstanceName);
|
||||
log.info("Alert Plugin {} send error : return alertResult value is null", pluginInstanceName);
|
||||
} else if (!Boolean.parseBoolean(String.valueOf(alertResult.getStatus()))) {
|
||||
alertResultExtend.setStatus(String.valueOf(false));
|
||||
alertResultExtend.setMessage(alertResult.getMessage());
|
||||
logger.info("Alert Plugin {} send error : {}", pluginInstanceName, alertResult.getMessage());
|
||||
log.info("Alert Plugin {} send error : {}", pluginInstanceName, alertResult.getMessage());
|
||||
} else {
|
||||
String message = String.format("Alert Plugin %s send success", pluginInstanceName);
|
||||
alertResultExtend.setStatus(String.valueOf(true));
|
||||
alertResultExtend.setMessage(message);
|
||||
logger.info("Alert Plugin {} send success", pluginInstanceName);
|
||||
log.info("Alert Plugin {} send success", pluginInstanceName);
|
||||
}
|
||||
return alertResultExtend;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* 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.alert;
|
||||
|
||||
import static org.apache.dolphinscheduler.common.Constants.ALERT_RPC_PORT;
|
||||
|
||||
import org.apache.dolphinscheduler.common.thread.Stopper;
|
||||
import org.apache.dolphinscheduler.dao.AlertDao;
|
||||
import org.apache.dolphinscheduler.dao.PluginDao;
|
||||
import org.apache.dolphinscheduler.dao.entity.Alert;
|
||||
import org.apache.dolphinscheduler.remote.NettyRemotingServer;
|
||||
import org.apache.dolphinscheduler.remote.command.CommandType;
|
||||
import org.apache.dolphinscheduler.remote.config.NettyServerConfig;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
||||
@SpringBootApplication
|
||||
@ComponentScan(value = {
|
||||
"org.apache.dolphinscheduler.alert",
|
||||
"org.apache.dolphinscheduler.dao"
|
||||
})
|
||||
public class AlertServer implements Closeable {
|
||||
private static final Logger log = LoggerFactory.getLogger(AlertServer.class);
|
||||
|
||||
private final PluginDao pluginDao;
|
||||
private final AlertDao alertDao;
|
||||
private final AlertPluginManager alertPluginManager;
|
||||
private final AlertSender alertSender;
|
||||
private final AlertRequestProcessor alertRequestProcessor;
|
||||
|
||||
private NettyRemotingServer server;
|
||||
|
||||
public AlertServer(PluginDao pluginDao, AlertDao alertDao, AlertPluginManager alertPluginManager, AlertSender alertSender, AlertRequestProcessor alertRequestProcessor) {
|
||||
this.pluginDao = pluginDao;
|
||||
this.alertDao = alertDao;
|
||||
this.alertPluginManager = alertPluginManager;
|
||||
this.alertSender = alertSender;
|
||||
this.alertRequestProcessor = alertRequestProcessor;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(AlertServer.class, args);
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void start() {
|
||||
log.info("Starting Alert server");
|
||||
|
||||
checkTable();
|
||||
startServer();
|
||||
|
||||
if (alertPluginManager.size() == 0) {
|
||||
log.warn("No alert plugin, alert sender will exit.");
|
||||
return;
|
||||
}
|
||||
|
||||
Executors.newScheduledThreadPool(1)
|
||||
.scheduleAtFixedRate(new Sender(), 5, 5, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
@PreDestroy
|
||||
public void close() {
|
||||
server.close();
|
||||
}
|
||||
|
||||
private void checkTable() {
|
||||
if (!pluginDao.checkPluginDefineTableExist()) {
|
||||
log.error("Plugin Define Table t_ds_plugin_define Not Exist . Please Create it First !");
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
private void startServer() {
|
||||
NettyServerConfig serverConfig = new NettyServerConfig();
|
||||
serverConfig.setListenPort(ALERT_RPC_PORT);
|
||||
|
||||
server = new NettyRemotingServer(serverConfig);
|
||||
server.registerProcessor(CommandType.ALERT_SEND_REQUEST, alertRequestProcessor);
|
||||
server.start();
|
||||
}
|
||||
|
||||
final class Sender implements Runnable {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!Stopper.isRunning()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
final List<Alert> alerts = alertDao.listPendingAlerts();
|
||||
alertSender.send(alerts);
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to send alert", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
-->
|
||||
|
||||
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
|
||||
<configuration scan="true" scanPeriod="120 seconds"> <!--debug="true" -->
|
||||
<configuration scan="true" scanPeriod="120 seconds">
|
||||
|
||||
<property name="log.base" value="logs"/>
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
|
|
@ -49,4 +49,4 @@
|
|||
<appender-ref ref="ALERTLOGFILE"/>
|
||||
</root>
|
||||
|
||||
</configuration>
|
||||
</configuration>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue