pinkhello
3 years ago
committed by
GitHub
18 changed files with 730 additions and 7 deletions
@ -1 +1 @@ |
|||||||
Subproject commit 2fc905b1875f2e6b91c4201a4dc6eaa21b86547e |
Subproject commit c2fa3e5a37b75a5819e2c8127caec1c2a0d088e8 |
@ -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.4-SNAPSHOT</version> |
||||||
|
</parent> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<artifactId>dolphinscheduler-alert-telegram</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> |
@ -0,0 +1,37 @@ |
|||||||
|
/* |
||||||
|
* 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.telegram; |
||||||
|
|
||||||
|
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 final class TelegramAlertChannel implements AlertChannel { |
||||||
|
@Override |
||||||
|
public AlertResult process(AlertInfo info) { |
||||||
|
Map<String, String> alertParams = info.getAlertParams(); |
||||||
|
if (alertParams == null || alertParams.isEmpty()) { |
||||||
|
return new AlertResult("false", "Telegram alert params is empty"); |
||||||
|
} |
||||||
|
AlertData data = info.getAlertData(); |
||||||
|
return new TelegramSender(alertParams).sendMessage(data); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,123 @@ |
|||||||
|
/* |
||||||
|
* 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.telegram; |
||||||
|
|
||||||
|
import com.google.auto.service.AutoService; |
||||||
|
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.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.params.select.SelectParam; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import static org.apache.dolphinscheduler.spi.utils.Constants.*; |
||||||
|
|
||||||
|
@AutoService(AlertChannelFactory.class) |
||||||
|
public final class TelegramAlertChannelFactory implements AlertChannelFactory { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String name() { |
||||||
|
return "Telegram"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public AlertChannel create() { |
||||||
|
return new TelegramAlertChannel(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<PluginParams> params() { |
||||||
|
|
||||||
|
|
||||||
|
InputParam webHookParam = InputParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_WEB_HOOK, TelegramParamsConstants.TELEGRAM_WEB_HOOK) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(true) |
||||||
|
.build()) |
||||||
|
.setPlaceholder("telegram web hook") |
||||||
|
.build(); |
||||||
|
|
||||||
|
InputParam botTokenParam = InputParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_BOT_TOKEN, TelegramParamsConstants.TELEGRAM_BOT_TOKEN) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(true) |
||||||
|
.build()) |
||||||
|
.setPlaceholder("telegram bot token") |
||||||
|
.build(); |
||||||
|
|
||||||
|
InputParam chatIdParam = InputParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_CHAT_ID, TelegramParamsConstants.TELEGRAM_CHAT_ID) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(true) |
||||||
|
.build()) |
||||||
|
.setPlaceholder("telegram channel chat id") |
||||||
|
.build(); |
||||||
|
|
||||||
|
SelectParam parseMode = SelectParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_PARSE_MODE, TelegramParamsConstants.TELEGRAM_PARSE_MODE) |
||||||
|
.addOptions(new ParamsOptions(TelegramAlertConstants.PARSE_MODE_TXT, TelegramAlertConstants.PARSE_MODE_TXT, false)) |
||||||
|
.addOptions(new ParamsOptions(TelegramAlertConstants.PARSE_MODE_MARKDOWN, TelegramAlertConstants.PARSE_MODE_MARKDOWN, false)) |
||||||
|
.addOptions(new ParamsOptions(TelegramAlertConstants.PARSE_MODE_MARKDOWN_V2, TelegramAlertConstants.PARSE_MODE_MARKDOWN_V2, false)) |
||||||
|
.addOptions(new ParamsOptions(TelegramAlertConstants.PARSE_MODE_HTML, TelegramAlertConstants.PARSE_MODE_HTML, false)) |
||||||
|
.setValue(TelegramAlertConstants.PARSE_MODE_TXT) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(true) |
||||||
|
.build()) |
||||||
|
.build(); |
||||||
|
|
||||||
|
RadioParam isEnableProxy = RadioParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_PROXY_ENABLE, TelegramParamsConstants.TELEGRAM_PROXY_ENABLE) |
||||||
|
.addParamsOptions(new ParamsOptions(STRING_YES, STRING_TRUE, false)) |
||||||
|
.addParamsOptions(new ParamsOptions(STRING_NO, STRING_FALSE, false)) |
||||||
|
.setValue(STRING_FALSE) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(false) |
||||||
|
.build()) |
||||||
|
.build(); |
||||||
|
|
||||||
|
InputParam proxyParam = InputParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_PROXY, TelegramParamsConstants.TELEGRAM_PROXY) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(false) |
||||||
|
.build()) |
||||||
|
.build(); |
||||||
|
|
||||||
|
InputParam portParam = InputParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_PORT, TelegramParamsConstants.TELEGRAM_PORT) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(false) |
||||||
|
.build()) |
||||||
|
.build(); |
||||||
|
|
||||||
|
InputParam userParam = InputParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_USER, TelegramParamsConstants.TELEGRAM_USER) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(false) |
||||||
|
.build()) |
||||||
|
.build(); |
||||||
|
|
||||||
|
PasswordParam passwordParam = PasswordParam.newBuilder(TelegramParamsConstants.NAME_TELEGRAM_PASSWORD, TelegramParamsConstants.TELEGRAM_PASSWORD) |
||||||
|
.addValidate(Validate.newBuilder() |
||||||
|
.setRequired(false) |
||||||
|
.build()) |
||||||
|
.setPlaceholder("if enable use authentication, you need input password") |
||||||
|
.build(); |
||||||
|
|
||||||
|
return Arrays.asList(webHookParam, botTokenParam, chatIdParam, parseMode, isEnableProxy, proxyParam, portParam, userParam, passwordParam); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/* |
||||||
|
* 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.telegram; |
||||||
|
|
||||||
|
public final class TelegramAlertConstants { |
||||||
|
|
||||||
|
static final String PARSE_MODE_TXT = "Txt"; |
||||||
|
|
||||||
|
static final String PARSE_MODE_MARKDOWN = "Markdown"; |
||||||
|
|
||||||
|
static final String PARSE_MODE_MARKDOWN_V2 = "MarkdownV2"; |
||||||
|
|
||||||
|
static final String PARSE_MODE_HTML = "Html"; |
||||||
|
|
||||||
|
/** |
||||||
|
* TELEGRAM_PUSH_URL |
||||||
|
* |
||||||
|
* <pre> |
||||||
|
* https://api.telegram.org/bot{botToken}/sendMessage
|
||||||
|
* </pre> |
||||||
|
*/ |
||||||
|
static final String TELEGRAM_PUSH_URL = "https://api.telegram.org/bot{botToken}/sendMessage"; |
||||||
|
|
||||||
|
private TelegramAlertConstants() { |
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
/* |
||||||
|
* 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.telegram; |
||||||
|
|
||||||
|
|
||||||
|
public final class TelegramParamsConstants { |
||||||
|
|
||||||
|
static final String TELEGRAM_WEB_HOOK = "$t('webHook')"; |
||||||
|
static final String NAME_TELEGRAM_WEB_HOOK = "webHook"; |
||||||
|
|
||||||
|
static final String TELEGRAM_BOT_TOKEN = "botToken"; |
||||||
|
static final String NAME_TELEGRAM_BOT_TOKEN = "botToken"; |
||||||
|
|
||||||
|
static final String TELEGRAM_CHAT_ID = "chatId"; |
||||||
|
static final String NAME_TELEGRAM_CHAT_ID = "chatId"; |
||||||
|
|
||||||
|
static final String TELEGRAM_PARSE_MODE = "parseMode"; |
||||||
|
static final String NAME_TELEGRAM_PARSE_MODE = "parseMode"; |
||||||
|
|
||||||
|
static final String TELEGRAM_PROXY_ENABLE = "$t('isEnableProxy')"; |
||||||
|
static final String NAME_TELEGRAM_PROXY_ENABLE = "IsEnableProxy"; |
||||||
|
|
||||||
|
static final String TELEGRAM_PROXY = "$t('proxy')"; |
||||||
|
static final String NAME_TELEGRAM_PROXY = "Proxy"; |
||||||
|
|
||||||
|
static final String TELEGRAM_PORT = "$t('port')"; |
||||||
|
static final String NAME_TELEGRAM_PORT = "Port"; |
||||||
|
|
||||||
|
static final String TELEGRAM_USER = "$t('user')"; |
||||||
|
static final String NAME_TELEGRAM_USER = "User"; |
||||||
|
|
||||||
|
static final String TELEGRAM_PASSWORD = "$t('password')"; |
||||||
|
static final String NAME_TELEGRAM_PASSWORD = "Password"; |
||||||
|
|
||||||
|
private TelegramParamsConstants() { |
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,251 @@ |
|||||||
|
/* |
||||||
|
* 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.telegram; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import org.apache.dolphinscheduler.alert.api.AlertData; |
||||||
|
import org.apache.dolphinscheduler.alert.api.AlertResult; |
||||||
|
import org.apache.dolphinscheduler.spi.utils.JSONUtils; |
||||||
|
import org.apache.http.HttpEntity; |
||||||
|
import org.apache.http.HttpHeaders; |
||||||
|
import org.apache.http.HttpHost; |
||||||
|
import org.apache.http.auth.AuthScope; |
||||||
|
import org.apache.http.auth.UsernamePasswordCredentials; |
||||||
|
import org.apache.http.client.CredentialsProvider; |
||||||
|
import org.apache.http.client.config.RequestConfig; |
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse; |
||||||
|
import org.apache.http.client.methods.HttpPost; |
||||||
|
import org.apache.http.entity.ContentType; |
||||||
|
import org.apache.http.entity.StringEntity; |
||||||
|
import org.apache.http.impl.client.BasicCredentialsProvider; |
||||||
|
import org.apache.http.impl.client.CloseableHttpClient; |
||||||
|
import org.apache.http.impl.client.HttpClients; |
||||||
|
import org.apache.http.util.EntityUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public final class TelegramSender { |
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(TelegramSender.class); |
||||||
|
|
||||||
|
private static final String BOT_TOKEN_REGEX = "{botToken}"; |
||||||
|
|
||||||
|
private final String chatId; |
||||||
|
|
||||||
|
private final String parseMode; |
||||||
|
|
||||||
|
private final Boolean enableProxy; |
||||||
|
|
||||||
|
private String botToken; |
||||||
|
|
||||||
|
private String url; |
||||||
|
|
||||||
|
private String proxy; |
||||||
|
|
||||||
|
private Integer port; |
||||||
|
|
||||||
|
private String user; |
||||||
|
|
||||||
|
private String password; |
||||||
|
|
||||||
|
|
||||||
|
TelegramSender(Map<String, String> config) { |
||||||
|
url = config.get(TelegramParamsConstants.NAME_TELEGRAM_WEB_HOOK); |
||||||
|
botToken = config.get(TelegramParamsConstants.NAME_TELEGRAM_BOT_TOKEN); |
||||||
|
chatId = config.get(TelegramParamsConstants.NAME_TELEGRAM_CHAT_ID); |
||||||
|
parseMode = config.get(TelegramParamsConstants.NAME_TELEGRAM_PARSE_MODE); |
||||||
|
if (url == null || url.isEmpty()) { |
||||||
|
url = TelegramAlertConstants.TELEGRAM_PUSH_URL.replace(BOT_TOKEN_REGEX, botToken); |
||||||
|
} else { |
||||||
|
url = url.replace(BOT_TOKEN_REGEX, botToken); |
||||||
|
} |
||||||
|
enableProxy = Boolean.valueOf(config.get(TelegramParamsConstants.NAME_TELEGRAM_PROXY_ENABLE)); |
||||||
|
if (Boolean.TRUE.equals(enableProxy)) { |
||||||
|
port = Integer.parseInt(config.get(TelegramParamsConstants.NAME_TELEGRAM_PORT)); |
||||||
|
proxy = config.get(TelegramParamsConstants.NAME_TELEGRAM_PROXY); |
||||||
|
user = config.get(TelegramParamsConstants.NAME_TELEGRAM_USER); |
||||||
|
password = config.get(TelegramParamsConstants.NAME_TELEGRAM_PASSWORD); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* sendMessage |
||||||
|
* |
||||||
|
* @param alertData alert data |
||||||
|
* @return alert result |
||||||
|
* @see <a href="https://core.telegram.org/bots/api#sendmessage">telegram bot api</a> |
||||||
|
*/ |
||||||
|
public AlertResult sendMessage(AlertData alertData) { |
||||||
|
AlertResult result; |
||||||
|
try { |
||||||
|
String resp = sendInvoke(alertData.getTitle(), alertData.getContent()); |
||||||
|
result = parseRespToResult(resp); |
||||||
|
} catch (Exception e) { |
||||||
|
logger.warn("send telegram alert msg exception : {}", e.getMessage()); |
||||||
|
result = new AlertResult(); |
||||||
|
result.setStatus("false"); |
||||||
|
result.setMessage(String.format("send telegram alert fail. %s", e.getMessage())); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
private AlertResult parseRespToResult(String resp) { |
||||||
|
AlertResult result = new AlertResult(); |
||||||
|
result.setStatus("false"); |
||||||
|
if (null == resp || resp.isEmpty()) { |
||||||
|
result.setMessage("send telegram msg error. telegram server resp is empty"); |
||||||
|
return result; |
||||||
|
} |
||||||
|
TelegramSendMsgResponse response = JSONUtils.parseObject(resp, TelegramSendMsgResponse.class); |
||||||
|
if (null == response) { |
||||||
|
result.setMessage("send telegram msg fail."); |
||||||
|
return result; |
||||||
|
} |
||||||
|
if (!response.isOk()) { |
||||||
|
result.setMessage(String.format("send telegram alert fail. telegram server error_code: %d, description: %s", |
||||||
|
response.errorCode, response.description)); |
||||||
|
} else { |
||||||
|
result.setStatus("true"); |
||||||
|
result.setMessage("send telegram msg success."); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private String sendInvoke(String title, String content) throws IOException { |
||||||
|
HttpPost httpPost = buildHttpPost(url, buildMsgJsonStr(content)); |
||||||
|
CloseableHttpClient httpClient; |
||||||
|
if (Boolean.TRUE.equals(enableProxy)) { |
||||||
|
httpClient = getProxyClient(proxy, port, user, password); |
||||||
|
RequestConfig rcf = getProxyConfig(proxy, port); |
||||||
|
httpPost.setConfig(rcf); |
||||||
|
} else { |
||||||
|
httpClient = getDefaultClient(); |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
CloseableHttpResponse response = httpClient.execute(httpPost); |
||||||
|
String resp; |
||||||
|
try { |
||||||
|
HttpEntity entity = response.getEntity(); |
||||||
|
resp = EntityUtils.toString(entity, "UTF-8"); |
||||||
|
EntityUtils.consume(entity); |
||||||
|
} finally { |
||||||
|
response.close(); |
||||||
|
} |
||||||
|
logger.info("Telegram send title :{},content : {}, resp: {}", title, content, resp); |
||||||
|
return resp; |
||||||
|
} finally { |
||||||
|
httpClient.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String buildMsgJsonStr(String content) { |
||||||
|
Map<String, Object> items = new HashMap<>(); |
||||||
|
items.put("chat_id", chatId); |
||||||
|
if (!isTextParseMode()) { |
||||||
|
items.put("parse_mode", parseMode); |
||||||
|
} |
||||||
|
items.put("text", content); |
||||||
|
return JSONUtils.toJsonString(items); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isTextParseMode() { |
||||||
|
return null == parseMode || TelegramAlertConstants.PARSE_MODE_TXT.equals(parseMode); |
||||||
|
} |
||||||
|
|
||||||
|
static class TelegramSendMsgResponse { |
||||||
|
@JsonProperty("ok") |
||||||
|
private Boolean ok; |
||||||
|
@JsonProperty("error_code") |
||||||
|
private Integer errorCode; |
||||||
|
@JsonProperty("description") |
||||||
|
private String description; |
||||||
|
@JsonProperty("result") |
||||||
|
private Object result; |
||||||
|
|
||||||
|
public boolean isOk() { |
||||||
|
return null != ok && ok; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getOk() { |
||||||
|
return ok; |
||||||
|
} |
||||||
|
|
||||||
|
@JsonProperty("ok") |
||||||
|
public void setOk(Boolean ok) { |
||||||
|
this.ok = ok; |
||||||
|
} |
||||||
|
|
||||||
|
@JsonProperty("error_code") |
||||||
|
public void setErrorCode(Integer errorCode) { |
||||||
|
this.errorCode = errorCode; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getErrorCode() { |
||||||
|
return errorCode; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDescription() { |
||||||
|
return description; |
||||||
|
} |
||||||
|
|
||||||
|
@JsonProperty("description") |
||||||
|
public void setDescription(String description) { |
||||||
|
this.description = description; |
||||||
|
} |
||||||
|
|
||||||
|
public Object getResult() { |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
@JsonProperty("result") |
||||||
|
public void setResult(Object result) { |
||||||
|
this.result = result; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static HttpPost buildHttpPost(String url, String msg) { |
||||||
|
HttpPost post = new HttpPost(url); |
||||||
|
StringEntity entity = new StringEntity(msg, StandardCharsets.UTF_8); |
||||||
|
post.setEntity(entity); |
||||||
|
post.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); |
||||||
|
return post; |
||||||
|
} |
||||||
|
|
||||||
|
private static CloseableHttpClient getDefaultClient() { |
||||||
|
return HttpClients.createDefault(); |
||||||
|
} |
||||||
|
|
||||||
|
private static CloseableHttpClient getProxyClient(String proxy, int port, String user, String password) { |
||||||
|
HttpHost httpProxy = new HttpHost(proxy, port); |
||||||
|
CredentialsProvider provider = new BasicCredentialsProvider(); |
||||||
|
provider.setCredentials(new AuthScope(httpProxy), new UsernamePasswordCredentials(user, password)); |
||||||
|
return HttpClients.custom().setDefaultCredentialsProvider(provider).build(); |
||||||
|
} |
||||||
|
|
||||||
|
private static RequestConfig getProxyConfig(String proxy, int port) { |
||||||
|
HttpHost httpProxy = new HttpHost(proxy, port); |
||||||
|
return RequestConfig.custom().setProxy(httpProxy).build(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
/* |
||||||
|
* 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.telegram; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.alert.api.AlertChannel; |
||||||
|
import org.apache.dolphinscheduler.spi.params.base.PluginParams; |
||||||
|
import org.junit.Assert; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class TelegramAlertChannelFactoryTest { |
||||||
|
|
||||||
|
private TelegramAlertChannelFactory telegramAlertChannelFactory = new TelegramAlertChannelFactory(); |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testTestGetName() { |
||||||
|
Assert.assertEquals("Telegram", telegramAlertChannelFactory.name()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testGetParams() { |
||||||
|
List<PluginParams> params = telegramAlertChannelFactory.params(); |
||||||
|
Assert.assertEquals(9, params.size()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testCreate() { |
||||||
|
AlertChannel alertChannel = telegramAlertChannelFactory.create(); |
||||||
|
Assert.assertTrue(alertChannel instanceof TelegramAlertChannel); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,111 @@ |
|||||||
|
/* |
||||||
|
* 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.telegram; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.alert.api.AlertData; |
||||||
|
import org.apache.dolphinscheduler.alert.api.AlertResult; |
||||||
|
import org.junit.Assert; |
||||||
|
import org.junit.Before; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public class TelegramSenderTest { |
||||||
|
|
||||||
|
private static Map<String, String> telegramConfig = new HashMap<>(); |
||||||
|
|
||||||
|
@Before |
||||||
|
public void initConfig() { |
||||||
|
telegramConfig.put(TelegramParamsConstants.NAME_TELEGRAM_WEB_HOOK, |
||||||
|
"https://api.telegram.org/bot{botToken}/sendMessage"); |
||||||
|
telegramConfig.put( |
||||||
|
TelegramParamsConstants.NAME_TELEGRAM_BOT_TOKEN, "BOT_TOKEN"); |
||||||
|
telegramConfig.put( |
||||||
|
TelegramParamsConstants.NAME_TELEGRAM_CHAT_ID, "CHAT_ID"); |
||||||
|
telegramConfig.put( |
||||||
|
TelegramParamsConstants.NAME_TELEGRAM_PARSE_MODE, TelegramAlertConstants.PARSE_MODE_TXT); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void testSendMessageFailByParamToken() { |
||||||
|
AlertData alertData = new AlertData(); |
||||||
|
alertData.setTitle("[telegram alert] test title"); |
||||||
|
alertData.setContent("telegram test content"); |
||||||
|
telegramConfig.put( |
||||||
|
TelegramParamsConstants.NAME_TELEGRAM_BOT_TOKEN, "XXXXXXX"); |
||||||
|
TelegramSender telegramSender = new TelegramSender(telegramConfig); |
||||||
|
AlertResult result = telegramSender.sendMessage(alertData); |
||||||
|
Assert.assertEquals("false", result.getStatus()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testSendMessageFailByChatId() { |
||||||
|
AlertData alertData = new AlertData(); |
||||||
|
alertData.setTitle("[telegram alert] test title"); |
||||||
|
alertData.setContent("telegram test content"); |
||||||
|
telegramConfig.put( |
||||||
|
TelegramParamsConstants.NAME_TELEGRAM_CHAT_ID, "-XXXXXXX"); |
||||||
|
TelegramSender telegramSender = new TelegramSender(telegramConfig); |
||||||
|
AlertResult result = telegramSender.sendMessage(alertData); |
||||||
|
Assert.assertEquals("false", result.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void testSendMessage() { |
||||||
|
AlertData alertData = new AlertData(); |
||||||
|
alertData.setTitle("[telegram alert] test title"); |
||||||
|
alertData.setContent("telegram test content"); |
||||||
|
TelegramSender telegramSender = new TelegramSender(telegramConfig); |
||||||
|
AlertResult result = telegramSender.sendMessage(alertData); |
||||||
|
Assert.assertEquals("false", result.getStatus()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testSendMessageByMarkdown() { |
||||||
|
AlertData alertData = new AlertData(); |
||||||
|
alertData.setTitle("[telegram alert]test markdown"); |
||||||
|
alertData.setContent("```python \npre-formatted fixed-width code block written in the Python programming language```"); |
||||||
|
telegramConfig.put( |
||||||
|
TelegramParamsConstants.NAME_TELEGRAM_PARSE_MODE, TelegramAlertConstants.PARSE_MODE_MARKDOWN); |
||||||
|
TelegramSender telegramSender = new TelegramSender(telegramConfig); |
||||||
|
AlertResult result = telegramSender.sendMessage(alertData); |
||||||
|
Assert.assertEquals("false", result.getStatus()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testSendMessageByHtml() { |
||||||
|
AlertData alertData = new AlertData(); |
||||||
|
alertData.setTitle("[telegram alert]test html"); |
||||||
|
alertData.setContent("<b>bold</b>"); |
||||||
|
telegramConfig.put( |
||||||
|
TelegramParamsConstants.NAME_TELEGRAM_PARSE_MODE, TelegramAlertConstants.PARSE_MODE_HTML); |
||||||
|
TelegramSender telegramSender = new TelegramSender(telegramConfig); |
||||||
|
AlertResult result = telegramSender.sendMessage(alertData); |
||||||
|
Assert.assertEquals("false", result.getStatus()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue