This is an automated email from the ASF dual-hosted git repository.
caishunfeng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 66548a2ef2 [DSIP-62][Http Alert Plugin] Refactor http alert plugin
(#16484)
66548a2ef2 is described below
commit 66548a2ef22ae0dd3d5a562da927e2f005c47320
Author: xiangzihao <[email protected]>
AuthorDate: Mon Aug 19 19:09:05 2024 +0800
[DSIP-62][Http Alert Plugin] Refactor http alert plugin (#16484)
* add dsip_62
* fix sonar
* fix spotless
---
docs/docs/en/guide/alert/http.md | 21 +-
docs/docs/zh/guide/alert/http.md | 39 +---
docs/img/alert/http-alert-example.png | Bin 0 -> 133634 bytes
docs/img/alert/http-get-example.png | Bin 15623 -> 0 bytes
docs/img/alert/http-post-example.png | Bin 17889 -> 0 bytes
.../dolphinscheduler-alert-http/pom.xml | 12 +
.../plugin/alert/http/HttpAlertChannelFactory.java | 42 ++--
.../plugin/alert/http/HttpAlertConstants.java | 11 +-
.../plugin/alert/http/HttpRequestMethod.java | 23 +-
.../plugin/alert/http/HttpSender.java | 246 +++++++++++----------
.../plugin/alert/http/HttpSenderTest.java | 134 +++++++++--
.../alert/plugin/AlertPluginManager.java | 6 +-
.../api/interceptor/LocaleChangeInterceptor.java | 4 +-
.../dolphinscheduler/spi/params/base/DataType.java | 7 +-
.../dolphinscheduler/spi/params/base/Validate.java | 29 +--
dolphinscheduler-ui/src/locales/en_US/security.ts | 2 +-
dolphinscheduler-ui/src/locales/zh_CN/security.ts | 2 +-
.../security/alarm-instance-manage/detail.tsx | 1 +
18 files changed, 326 insertions(+), 253 deletions(-)
diff --git a/docs/docs/en/guide/alert/http.md b/docs/docs/en/guide/alert/http.md
index ba5c009211..f765b9db0c 100644
--- a/docs/docs/en/guide/alert/http.md
+++ b/docs/docs/en/guide/alert/http.md
@@ -7,25 +7,16 @@ If you need to use `Http script` for alerting, create an
alert instance in the a
| **Parameter** | **Description**
|
|---------------|-----------------------------------------------------------------------------------------------------|
| URL | The `Http` request URL needs to contain protocol, host, path
and parameters if the method is `GET`. |
-| Request Type | Select the request type from `POST` or `GET`.
|
-| Headers | The headers of the `Http` request in JSON format.
|
-| Body | The request body of the `Http` request in JSON format, when
using `POST` method to alert. |
-| Content Field | The field name to place the alert information.
|
+| Request Type | Select the request type from `POST` or `GET` or `PUT`.
|
+| Headers | The headers of the `Http` request in JSON format. Not
including content-type. |
+| Body | The request body of the `Http` request in JSON format, when
using `POST` or `PUT` method to alert. |
+| Content Type | The content-type of header.
|
-## Send Type
-
-Using `POST` and `GET` method to send `Http` request in the `Request Type`.
+> Alarm message supports variables `$msg`, which can be used in `URL`,
`Headers`, and `Body`.
### GET HTTP
Send alert information by `Http` GET method.
The following shows the `GET` configuration example:
-
-
-### POST HTTP
-
-Send alert information inside `Http` body by `Http` POST method.
-The following shows the `POST` configuration example:
-
-
+
diff --git a/docs/docs/zh/guide/alert/http.md b/docs/docs/zh/guide/alert/http.md
index 9f72723d6c..51524ac786 100644
--- a/docs/docs/zh/guide/alert/http.md
+++ b/docs/docs/zh/guide/alert/http.md
@@ -4,40 +4,19 @@
## 参数配置
-* URL
+| **参数** | **描述** |
+|--------------|------------------------------------------------|
+| URL | 访问的`Http`连接URL,需要包含协议、Host、路径,如果是GET方法可以添加参数 |
+| 请求方式 | 当前支持`GET`和`POST`以及`PUT`三种请求方式 |
+| 请求头(Headers) | `Http`请求的完整请求头,以JSON为格式(注意不包含Content-Type),非必填 |
+| 请求体(Body) | Http`请求的完整请求体,以JSON为格式,非必填 |
+| Content-Type | 请求体的`Content-Type`,默认为`application/json` |
- > 访问的`Http`连接URL,需要包含协议、Host、路径,如果是GET方法可以添加参数
-
-* 请求方式
-
- > 选择该请求为POST或GET方法
-
-* 请求头
-
- > `Http`请求的完整请求头,以JSON为格式
-
-* 请求体
-
- > `Http`请求的完整请求体,以JSON为格式,GET方法不需要写该参数
-
-* 内容字段
-
- > 放置本次告警告警信息的字段名称
-
-## 发送类型
-
-其中`Request Type`分别对应使用`POST`方法和`GET`方法进行`Http`告警。
+> 告警消息,支持变量`$msg`,可在`URL`,`请求头`,`请求体`中使用,非必填。
### GET Http告警
GET `Http`告警指将告警结果作为参数通过`Http` GET方法进行请求。
下图是GET告警配置的示例:
-
-
-### POST Http告警
-
-POST `Http`告警指将告警结果作为`BODY`参数通过`Http`POST方法进行请求。
-下图是POST告警配置的示例:
-
-
+
diff --git a/docs/img/alert/http-alert-example.png
b/docs/img/alert/http-alert-example.png
new file mode 100644
index 0000000000..b2fd5e4576
Binary files /dev/null and b/docs/img/alert/http-alert-example.png differ
diff --git a/docs/img/alert/http-get-example.png
b/docs/img/alert/http-get-example.png
deleted file mode 100644
index a6c29b48c9..0000000000
Binary files a/docs/img/alert/http-get-example.png and /dev/null differ
diff --git a/docs/img/alert/http-post-example.png
b/docs/img/alert/http-post-example.png
deleted file mode 100644
index 5cf0d3e64d..0000000000
Binary files a/docs/img/alert/http-post-example.png and /dev/null differ
diff --git
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/pom.xml
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/pom.xml
index 3ce4dfd186..274ec7f1d9 100644
---
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/pom.xml
+++
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/pom.xml
@@ -41,5 +41,17 @@
<artifactId>jackson-databind</artifactId>
<scope>provided</scope>
</dependency>
+
+ <dependency>
+ <groupId>com.squareup.okhttp3</groupId>
+ <artifactId>mockwebserver</artifactId>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
</dependencies>
</project>
diff --git
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertChannelFactory.java
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertChannelFactory.java
index 0e117b0f20..3b7dc84d4b 100644
---
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertChannelFactory.java
+++
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertChannelFactory.java
@@ -20,11 +20,14 @@ package org.apache.dolphinscheduler.plugin.alert.http;
import org.apache.dolphinscheduler.alert.api.AlertChannel;
import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
import org.apache.dolphinscheduler.alert.api.AlertInputTips;
+import org.apache.dolphinscheduler.common.model.OkHttpRequestHeaderContentType;
import org.apache.dolphinscheduler.spi.params.base.DataType;
+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.input.number.InputNumberParam;
+import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
import java.util.Arrays;
import java.util.List;
@@ -52,35 +55,42 @@ public final class HttpAlertChannelFactory implements
AlertChannelFactory {
InputParam headerParams =
InputParam.newBuilder(HttpAlertConstants.NAME_HEADER_PARAMS,
HttpAlertConstants.HEADER_PARAMS)
.setPlaceholder(AlertInputTips.HEADER.getMsg())
- .addValidate(Validate.newBuilder()
- .setRequired(true)
- .build())
- .build();
-
- InputParam bodyParams =
- InputParam.newBuilder(HttpAlertConstants.NAME_BODY_PARAMS,
HttpAlertConstants.BODY_PARAMS)
- .setPlaceholder(AlertInputTips.JSON_BODY.getMsg())
.addValidate(Validate.newBuilder()
.setRequired(false)
.build())
.build();
- InputParam contentField =
- InputParam.newBuilder(HttpAlertConstants.NAME_CONTENT_FIELD,
HttpAlertConstants.CONTENT_FIELD)
- .setPlaceholder(AlertInputTips.FIELD_NAME.getMsg())
+ RadioParam contentType =
+ RadioParam.newBuilder(HttpAlertConstants.NAME_CONTENT_TYPE,
HttpAlertConstants.CONTENT_TYPE)
+ .addParamsOptions(new
ParamsOptions(OkHttpRequestHeaderContentType.APPLICATION_JSON.getValue(),
+
OkHttpRequestHeaderContentType.APPLICATION_JSON.getValue(), false))
+ .addParamsOptions(
+ new
ParamsOptions(OkHttpRequestHeaderContentType.APPLICATION_FORM_URLENCODED.getValue(),
+
OkHttpRequestHeaderContentType.APPLICATION_FORM_URLENCODED.getValue(), false))
+
.setValue(OkHttpRequestHeaderContentType.APPLICATION_JSON.getValue())
.addValidate(Validate.newBuilder()
.setRequired(true)
.build())
.build();
- InputParam requestType =
- InputParam.newBuilder(HttpAlertConstants.NAME_REQUEST_TYPE,
HttpAlertConstants.REQUEST_TYPE)
- .setPlaceholder(AlertInputTips.HTTP_METHOD.getMsg())
+ InputParam bodyParams =
+ InputParam.newBuilder(HttpAlertConstants.NAME_BODY_PARAMS,
HttpAlertConstants.BODY_PARAMS)
+ .setPlaceholder(AlertInputTips.JSON_BODY.getMsg())
.addValidate(Validate.newBuilder()
- .setRequired(true)
+ .setRequired(false)
.build())
.build();
+ RadioParam requestType = RadioParam
+ .newBuilder(HttpAlertConstants.NAME_REQUEST_TYPE,
HttpAlertConstants.REQUEST_TYPE)
+ .addParamsOptions(new
ParamsOptions(HttpRequestMethod.GET.name(), HttpRequestMethod.GET.name(),
false))
+ .addParamsOptions(
+ new ParamsOptions(HttpRequestMethod.POST.name(),
HttpRequestMethod.POST.name(), false))
+ .addParamsOptions(new
ParamsOptions(HttpRequestMethod.PUT.name(), HttpRequestMethod.PUT.name(),
false))
+ .setValue(HttpRequestMethod.GET.name())
+ .addValidate(Validate.newBuilder().setRequired(true).build())
+ .build();
+
InputNumberParam timeout =
InputNumberParam.newBuilder(HttpAlertConstants.NAME_TIMEOUT,
HttpAlertConstants.TIMEOUT)
.setValue(HttpAlertConstants.DEFAULT_TIMEOUT)
@@ -90,7 +100,7 @@ public final class HttpAlertChannelFactory implements
AlertChannelFactory {
.build())
.build();
- return Arrays.asList(url, requestType, headerParams, bodyParams,
contentField, timeout);
+ return Arrays.asList(url, requestType, headerParams, bodyParams,
contentType, timeout);
}
@Override
diff --git
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertConstants.java
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertConstants.java
index ab4e6dd1c1..775bc03860 100644
---
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertConstants.java
+++
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpAlertConstants.java
@@ -17,6 +17,9 @@
package org.apache.dolphinscheduler.plugin.alert.http;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
public final class HttpAlertConstants {
public static final String URL = "$t('url')";
@@ -27,6 +30,10 @@ public final class HttpAlertConstants {
public static final String NAME_HEADER_PARAMS = "headerParams";
+ public static final String CONTENT_TYPE = "$t('contentType')";
+
+ public static final String NAME_CONTENT_TYPE = "contentType";
+
public static final String BODY_PARAMS = "$t('bodyParams')";
public static final String NAME_BODY_PARAMS = "bodyParams";
@@ -45,7 +52,5 @@ public final class HttpAlertConstants {
public static final int DEFAULT_TIMEOUT = 120;
- private HttpAlertConstants() {
- throw new UnsupportedOperationException("This is a utility class and
cannot be instantiated");
- }
+ public static final String MSG_PARAMS = "${msg}";
}
diff --git
a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/DataType.java
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpRequestMethod.java
similarity index 71%
copy from
dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/DataType.java
copy to
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpRequestMethod.java
index 2b94ac1a73..1f8b3a27b5 100644
---
a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/DataType.java
+++
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpRequestMethod.java
@@ -15,25 +15,8 @@
* limitations under the License.
*/
-package org.apache.dolphinscheduler.spi.params.base;
-
-/**
- * param datetype
- */
-public enum DataType {
-
- STRING("string"),
-
- NUMBER("number");
-
- private String dataType;
-
- DataType(String dataType) {
- this.dataType = dataType;
- }
-
- public String getDataType() {
- return this.dataType;
- }
+package org.apache.dolphinscheduler.plugin.alert.http;
+public enum HttpRequestMethod {
+ GET, POST, PUT
}
diff --git
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
index e2a6606a39..42f1474de4 100644
---
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
+++
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
@@ -18,146 +18,172 @@
package org.apache.dolphinscheduler.plugin.alert.http;
import org.apache.dolphinscheduler.alert.api.AlertResult;
-import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
+import org.apache.dolphinscheduler.common.model.OkHttpRequestHeaderContentType;
+import org.apache.dolphinscheduler.common.model.OkHttpRequestHeaders;
+import org.apache.dolphinscheduler.common.model.OkHttpResponse;
import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.common.utils.OkHttpUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
+import org.apache.http.HttpStatus;
import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
@Slf4j
public final class HttpSender {
- 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 final String headerParams;
- private final String bodyParams;
- private final String contentField;
- private final String requestType;
- private final int timeout;
+ private Map<String, String> headerParams;
+ private OkHttpRequestHeaderContentType contentType;
+ private Map<String, String> bodyParams;
+ private HttpRequestMethod requestType;
+ private int timeout;
private String url;
- private HttpRequestBase httpRequest;
public HttpSender(Map<String, String> paramsMap) {
+ paramsValidator(paramsMap);
+ }
+ private void paramsValidator(Map<String, String> paramsMap) {
url = paramsMap.get(HttpAlertConstants.NAME_URL);
- headerParams = paramsMap.get(HttpAlertConstants.NAME_HEADER_PARAMS);
- bodyParams = paramsMap.get(HttpAlertConstants.NAME_BODY_PARAMS);
- contentField = paramsMap.get(HttpAlertConstants.NAME_CONTENT_FIELD);
- requestType = paramsMap.get(HttpAlertConstants.NAME_REQUEST_TYPE);
+ if (StringUtils.isBlank(url)) {
+ throw new IllegalArgumentException("url can not be null");
+ }
+
+ String headerParamsString =
paramsMap.get(HttpAlertConstants.NAME_HEADER_PARAMS);
+ if (StringUtils.isNotBlank(headerParamsString)) {
+ headerParams = JSONUtils.toMap(headerParamsString);
+ if (headerParams == null) {
+ throw new IllegalArgumentException("headerParams is not a
valid json");
+ }
+ } else {
+ headerParams = new HashMap<>();
+ }
+
+ String bodyParamsString =
paramsMap.get(HttpAlertConstants.NAME_BODY_PARAMS);
+ if (StringUtils.isNotBlank(bodyParamsString)) {
+ bodyParams = JSONUtils.toMap(bodyParamsString);
+ if (bodyParams == null) {
+ throw new IllegalArgumentException("bodyParams is not a valid
json");
+ }
+ } else {
+ bodyParams = new HashMap<>();
+ }
+
+ try {
+ requestType =
HttpRequestMethod.valueOf(paramsMap.get(HttpAlertConstants.NAME_REQUEST_TYPE));
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("requestType is not a valid
value");
+ }
+
+ contentType =
OkHttpRequestHeaderContentType.fromValue(paramsMap.get(HttpAlertConstants.NAME_CONTENT_TYPE));
+ if (contentType == null) {
+ throw new IllegalArgumentException("contentType is not a valid
value");
+ }
+
timeout =
StringUtils.isNotBlank(paramsMap.get(HttpAlertConstants.NAME_TIMEOUT))
?
Integer.parseInt(paramsMap.get(HttpAlertConstants.NAME_TIMEOUT))
- : HttpAlertConstants.DEFAULT_TIMEOUT;
+ : HttpAlertConstants.DEFAULT_TIMEOUT * 1000;
}
public AlertResult send(String msg) {
AlertResult alertResult = new AlertResult();
+ OkHttpResponse okHttpResponse;
try {
- createHttpRequest(msg);
- } catch (MalformedURLException e) {
- throw new RuntimeException(e);
- } catch (URISyntaxException e) {
+ okHttpResponse = sendHttpRequest(msg);
+ } catch (RuntimeException e) {
throw new RuntimeException(e);
}
- if (httpRequest == null) {
- alertResult.setSuccess(false);
- alertResult.setMessage("Request types are not supported");
- return alertResult;
- }
+ validateResponse(okHttpResponse, alertResult);
- try {
- String resp = this.getResponseString(httpRequest);
- alertResult.setSuccess(true);
- alertResult.setMessage(resp);
- } catch (Exception e) {
- log.error("send http alert msg exception : {}", e.getMessage());
+ return alertResult;
+ }
+
+ private void validateResponse(OkHttpResponse okHttpResponse, AlertResult
alertResult) {
+ if (okHttpResponse.getStatusCode() != HttpStatus.SC_OK) {
alertResult.setSuccess(false);
- alertResult.setMessage(
- String.format("Send http request alert failed: %s",
e.getMessage()));
+ alertResult
+ .setMessage(String.format("send http alert failed,
response body: %s", okHttpResponse.getBody()));
+ } else {
+ alertResult.setSuccess(true);
+ alertResult
+ .setMessage(String.format("send http alert success,
response body: %s", okHttpResponse.getBody()));
}
-
- return alertResult;
}
- public String getResponseString(HttpRequestBase httpRequest) throws
Exception {
+ private OkHttpResponse sendHttpRequest(String msg) throws RuntimeException
{
+ switch (requestType) {
+ case POST:
+ setMsgInHeader(msg);
+ setMsgInRequestBody(msg);
+ return sendPostRequest();
+ case GET:
+ setMsgInUrl(msg);
+ setMsgInHeader(msg);
+ return sendGetRequest();
+ case PUT:
+ setMsgInHeader(msg);
+ setMsgInRequestBody(msg);
+ return sendPutRequest();
+ default:
+ throw new RuntimeException(String.format("http request method
%s not supported",
+ requestType));
+ }
+ }
- RequestConfig requestConfig = RequestConfig.custom()
- .setConnectTimeout(timeout * 1000)
- .setConnectionRequestTimeout(timeout * 1000)
- .setSocketTimeout(timeout * 1000)
- .build();
- CloseableHttpClient httpClient = HttpClients.custom()
- .setDefaultRequestConfig(requestConfig)
-
.setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();
+ @SneakyThrows
+ private OkHttpResponse sendGetRequest() {
+ OkHttpRequestHeaders okHttpRequestHeaders = new OkHttpRequestHeaders();
+ okHttpRequestHeaders.setHeaders(headerParams);
+ okHttpRequestHeaders.setOkHttpRequestHeaderContentType(contentType);
+ Map<String, Object> requestParams = new HashMap<>();
+ log.info("sending http alert get request, url: {}, header: {},
requestParams: {}, contentType: {}",
+ url, headerParams, requestParams, contentType.getValue());
+ return OkHttpUtils.get(url, okHttpRequestHeaders,
+ requestParams, timeout, timeout, timeout);
+ }
- CloseableHttpResponse response = httpClient.execute(httpRequest);
- HttpEntity entity = response.getEntity();
- return EntityUtils.toString(entity, StandardCharsets.UTF_8);
+ @SneakyThrows
+ private OkHttpResponse sendPostRequest() {
+ OkHttpRequestHeaders okHttpRequestHeaders = new OkHttpRequestHeaders();
+ okHttpRequestHeaders.setHeaders(headerParams);
+ okHttpRequestHeaders.setOkHttpRequestHeaderContentType(contentType);
+ Map<String, Object> requestBody =
Collections.unmodifiableMap(bodyParams);
+ log.info("sending http alert post request, url: {}, header: {},
requestBody: {}, contentType: {}",
+ url, headerParams, requestBody, contentType.getValue());
+ return OkHttpUtils.post(url, okHttpRequestHeaders, null,
+ requestBody, timeout, timeout, timeout);
}
- private void createHttpRequest(String msg) throws MalformedURLException,
URISyntaxException {
- if (REQUEST_TYPE_POST.equalsIgnoreCase(requestType)) {
- httpRequest = new HttpPost(url);
- setHeader();
- // POST request add param in request body
- setMsgInRequestBody(msg);
- } else if (REQUEST_TYPE_GET.equalsIgnoreCase(requestType)) {
- // GET request add param in url
- setMsgInUrl(msg);
- URL unencodeUrl = new URL(url);
- URI uri = new URI(unencodeUrl.getProtocol(),
unencodeUrl.getAuthority(), unencodeUrl.getPath(),
- unencodeUrl.getQuery(), null);
-
- httpRequest = new HttpGet(uri);
- setHeader();
- }
+ @SneakyThrows
+ private OkHttpResponse sendPutRequest() {
+ OkHttpRequestHeaders okHttpRequestHeaders = new OkHttpRequestHeaders();
+ okHttpRequestHeaders.setHeaders(headerParams);
+ okHttpRequestHeaders.setOkHttpRequestHeaderContentType(contentType);
+ Map<String, Object> requestBody =
Collections.unmodifiableMap(bodyParams);
+ log.info("sending http alert put request, url: {}, header: {},
requestBody: {}, contentType: {}",
+ url, headerParams, requestBody, contentType.getValue());
+ return OkHttpUtils.put(url, okHttpRequestHeaders,
+ requestBody, timeout, timeout, timeout);
}
/**
* add msg param in url
*/
private void setMsgInUrl(String msg) {
-
- if (StringUtils.isNotBlank(contentField)) {
- String type = "&";
- // check splice char is & or ?
- if (!url.contains(URL_SPLICE_CHAR)) {
- type = URL_SPLICE_CHAR;
- }
+ if (url.contains(HttpAlertConstants.MSG_PARAMS)) {
try {
- url = String.format("%s%s%s=%s", url, type, contentField,
+ url = url.replace(HttpAlertConstants.MSG_PARAMS,
URLEncoder.encode(msg, StandardCharsets.UTF_8.name()));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
@@ -168,37 +194,31 @@ public final class HttpSender {
/**
* set header params
*/
- private void setHeader() {
-
- if (httpRequest == null) {
+ private void setMsgInHeader(String msg) {
+ if (msg == null) {
return;
}
- HashMap<String, Object> map = JSONUtils.parseObject(headerParams,
HashMap.class);
- for (Map.Entry<String, Object> entry : map.entrySet()) {
- httpRequest.setHeader(entry.getKey(),
String.valueOf(entry.getValue()));
- }
+ headerParams.forEach((key, value) -> {
+ if (value.contains(HttpAlertConstants.MSG_PARAMS)) {
+ headerParams.put(key,
value.replace(HttpAlertConstants.MSG_PARAMS, msg));
+ }
+ });
}
/**
* set body params
*/
private void setMsgInRequestBody(String msg) {
- try {
- ObjectNode objectNode = JSONUtils.createObjectNode();
- if (StringUtils.isNotBlank(bodyParams)) {
- objectNode = JSONUtils.parseObject(bodyParams);
- }
- // set msg content field
- objectNode.put(contentField, msg);
- StringEntity entity = new
StringEntity(JSONUtils.toJsonString(objectNode), StandardCharsets.UTF_8);
- ((HttpPost) httpRequest).setEntity(entity);
- } catch (Exception e) {
- log.error("send http alert msg exception : {}", e.getMessage());
+ if (bodyParams == null) {
+ return;
}
- }
- public String getRequestUrl() {
- return httpRequest.getURI().toString();
+ bodyParams.forEach((key, value) -> {
+ if (value.contains(HttpAlertConstants.MSG_PARAMS)) {
+ bodyParams.put(key,
value.replace(HttpAlertConstants.MSG_PARAMS, msg));
+ }
+ });
}
+
}
diff --git
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/test/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSenderTest.java
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/test/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSenderTest.java
index 40f589a10b..e833a70f9e 100644
---
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/test/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSenderTest.java
+++
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/test/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSenderTest.java
@@ -17,37 +17,131 @@
package org.apache.dolphinscheduler.plugin.alert.http;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.common.model.OkHttpRequestHeaderContentType;
+import org.apache.dolphinscheduler.common.utils.JSONUtils;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpStatus;
+import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import okhttp3.mockwebserver.Dispatcher;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+
+import org.jetbrains.annotations.NotNull;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+@ExtendWith(MockitoExtension.class)
public class HttpSenderTest {
+ private final List<MockWebServer> mockWebServers = new ArrayList<>();
+
+ private Map<String, String> paramsMap = new HashMap<>();
+
+ @AfterEach
+ public void after() {
+ mockWebServers.forEach(IOUtils::closeQuietly);
+ mockWebServers.clear();
+ }
+
@Test
- public void sendTest() throws Exception {
- Map<String, String> paramsMap = new HashMap<>();
- String url = "https://www.dolphinscheduler-not-exists-web.com:12345";
- String contentField = "content";
- paramsMap.put(HttpAlertConstants.NAME_URL, url);
- paramsMap.put(HttpAlertConstants.NAME_REQUEST_TYPE, "GET");
- paramsMap.put(HttpAlertConstants.NAME_HEADER_PARAMS,
"{\"Content-Type\":\"application/json\"}");
- paramsMap.put(HttpAlertConstants.NAME_BODY_PARAMS,
"{\"number\":\"123456\"}");
- paramsMap.put(HttpAlertConstants.NAME_CONTENT_FIELD, contentField);
- paramsMap.put(HttpAlertConstants.NAME_TIMEOUT,
String.valueOf(HttpAlertConstants.DEFAULT_TIMEOUT));
-
- HttpSender httpSender = spy(new HttpSender(paramsMap));
- doReturn("success").when(httpSender).getResponseString(any());
- AlertResult alertResult = httpSender.send("Fault tolerance warning");
+ void testHttpSenderGet() throws Exception {
+ String msg = "msg_test";
+ Map<String, String> headerParams = new HashMap<>();
+ headerParams.put("msg", msg);
+ paramsMap.put(HttpAlertConstants.NAME_HEADER_PARAMS,
JSONUtils.toJsonString(headerParams));
+ paramsMap.put(HttpAlertConstants.NAME_CONTENT_TYPE,
OkHttpRequestHeaderContentType.APPLICATION_JSON.getValue());
+
+ String mockGetUrl = createMockWebServer(String.format("/get/%s", msg),
HttpStatus.SC_OK);
+ String actualGetUrl = mockGetUrl.replace(msg,
HttpAlertConstants.MSG_PARAMS);
+ paramsMap.put(HttpAlertConstants.NAME_URL, actualGetUrl);
+
+ paramsMap.put(HttpAlertConstants.NAME_REQUEST_TYPE,
HttpRequestMethod.GET.name());
+
+ HttpSender httpSender = new HttpSender(paramsMap);
+
+ AlertResult alertResult = httpSender.send(msg);
+
Assertions.assertTrue(alertResult.isSuccess());
- Assertions.assertTrue(httpSender.getRequestUrl().contains(url));
-
Assertions.assertTrue(httpSender.getRequestUrl().contains(contentField));
+ Assertions.assertTrue(alertResult.getMessage().contains(msg));
+ }
+
+ @Test
+ void testHttpSenderPost() throws Exception {
+ String msg = "msg_test";
+ Map<String, String> bodyParams = new HashMap<>();
+ bodyParams.put("msg", msg);
+ paramsMap.put(HttpAlertConstants.NAME_BODY_PARAMS,
JSONUtils.toJsonString(bodyParams));
+ paramsMap.put(HttpAlertConstants.NAME_CONTENT_TYPE,
OkHttpRequestHeaderContentType.APPLICATION_JSON.getValue());
+
+ String mockPostUrl = createMockWebServer("/post", HttpStatus.SC_OK);
+ paramsMap.put(HttpAlertConstants.NAME_URL, mockPostUrl);
+
+ paramsMap.put(HttpAlertConstants.NAME_REQUEST_TYPE,
HttpRequestMethod.POST.name());
+
+ HttpSender httpSender = new HttpSender(paramsMap);
+
+ AlertResult alertResult = httpSender.send(msg);
+
+ Assertions.assertTrue(alertResult.isSuccess());
+ Assertions.assertTrue(alertResult.getMessage().contains(msg));
+ }
+
+ @Test
+ void testHttpSenderPut() throws Exception {
+ String msg = "msg_test";
+ Map<String, String> bodyParams = new HashMap<>();
+ bodyParams.put("msg", msg);
+ paramsMap.put(HttpAlertConstants.NAME_BODY_PARAMS,
JSONUtils.toJsonString(bodyParams));
+ paramsMap.put(HttpAlertConstants.NAME_CONTENT_TYPE,
OkHttpRequestHeaderContentType.APPLICATION_JSON.getValue());
+
+ String mockPostUrl = createMockWebServer("/post", HttpStatus.SC_OK);
+ paramsMap.put(HttpAlertConstants.NAME_URL, mockPostUrl);
+
+ paramsMap.put(HttpAlertConstants.NAME_REQUEST_TYPE,
HttpRequestMethod.PUT.name());
+
+ HttpSender httpSender = new HttpSender(paramsMap);
+
+ AlertResult alertResult = httpSender.send(msg);
+
+ Assertions.assertTrue(alertResult.isSuccess());
+ Assertions.assertTrue(alertResult.getMessage().contains(msg));
+ }
+
+ private String createMockWebServer(String path, int actualResponseCode)
throws IOException {
+ MockWebServer server = new MockWebServer();
+ mockWebServers.add(server);
+ server.start();
+ server.setDispatcher(generateMockDispatcher(actualResponseCode));
+ return server.url(path).toString();
+ }
+
+ private Dispatcher generateMockDispatcher(int actualResponseCode) {
+ return new Dispatcher() {
+
+ @NotNull
+ @Override
+ public MockResponse dispatch(@NotNull RecordedRequest request) {
+ Map<String, String> responseMap = new HashMap<>();
+ responseMap.put("url", request.getRequestUrl().toString());
+ responseMap.put("headers", request.getHeaders().toString());
+ responseMap.put("body", request.getBody().toString());
+ String responseBody = JSONUtils.toJsonString(responseMap);
+ return new MockResponse()
+ .setResponseCode(actualResponseCode)
+ .setBody(responseBody);
+ }
+ };
}
}
diff --git
a/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/plugin/AlertPluginManager.java
b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/plugin/AlertPluginManager.java
index 35d75297a3..2a701ab143 100644
---
a/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/plugin/AlertPluginManager.java
+++
b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/plugin/AlertPluginManager.java
@@ -54,10 +54,10 @@ public final class AlertPluginManager {
private final Map<Integer, AlertChannel> alertPluginMap = new HashMap<>();
public void start() {
- log.info("AlertPluginManager start ...");
+ log.info("AlertPluginManager start...");
checkAlertPluginExist();
installAlertPlugin();
- log.info("AlertPluginManager started ...");
+ log.info("AlertPluginManager started...");
}
public Optional<AlertChannel> getAlertChannel(int id) {
@@ -70,7 +70,7 @@ public final class AlertPluginManager {
private void checkAlertPluginExist() {
if (!pluginDao.checkPluginDefineTableExist()) {
- log.error("Plugin Define Table t_ds_plugin_define Not Exist .
Please Create it First !");
+ log.error("Plugin Define Table t_ds_plugin_define Not Exist.
Please Create it First!");
System.exit(1);
}
}
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LocaleChangeInterceptor.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LocaleChangeInterceptor.java
index 69c358dc28..27b7fb8c74 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LocaleChangeInterceptor.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LocaleChangeInterceptor.java
@@ -28,10 +28,10 @@ import javax.servlet.http.HttpServletResponse;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
-import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.util.WebUtils;
-public class LocaleChangeInterceptor extends HandlerInterceptorAdapter {
+public class LocaleChangeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) {
diff --git
a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/DataType.java
b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/DataType.java
index 2b94ac1a73..0b33e56127 100644
---
a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/DataType.java
+++
b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/DataType.java
@@ -17,9 +17,12 @@
package org.apache.dolphinscheduler.spi.params.base;
+import lombok.Getter;
+
/**
* param datetype
*/
+@Getter
public enum DataType {
STRING("string"),
@@ -32,8 +35,4 @@ public enum DataType {
this.dataType = dataType;
}
- public String getDataType() {
- return this.dataType;
- }
-
}
diff --git
a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/Validate.java
b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/Validate.java
index cc02e9581f..17cccb12f8 100644
---
a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/Validate.java
+++
b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params/base/Validate.java
@@ -17,6 +17,8 @@
package org.apache.dolphinscheduler.spi.params.base;
+import lombok.Data;
+
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
@@ -25,6 +27,7 @@ import
com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
* form validate
*/
@JsonDeserialize(builder = Validate.Builder.class)
+@Data
public class Validate {
@JsonProperty("required")
@@ -62,7 +65,7 @@ public class Validate {
return new Builder();
}
- @JsonPOJOBuilder(buildMethodName = "build", withPrefix = "set")
+ @JsonPOJOBuilder(withPrefix = "set")
public static class Builder {
private boolean required = false;
@@ -111,28 +114,4 @@ public class Validate {
return new Validate(this);
}
}
-
- public boolean isRequired() {
- return required;
- }
-
- public String getMessage() {
- return message;
- }
-
- public String getType() {
- return type;
- }
-
- public String getTrigger() {
- return trigger;
- }
-
- public Double getMin() {
- return min;
- }
-
- public Double getMax() {
- return max;
- }
}
diff --git a/dolphinscheduler-ui/src/locales/en_US/security.ts
b/dolphinscheduler-ui/src/locales/en_US/security.ts
index f43adb839e..a79211bec7 100644
--- a/dolphinscheduler-ui/src/locales/en_US/security.ts
+++ b/dolphinscheduler-ui/src/locales/en_US/security.ts
@@ -244,7 +244,7 @@ export default {
requestType: 'Request Type',
headerParams: 'Headers',
bodyParams: 'Body',
- contentField: 'Content Field',
+ contentType: 'Content Type',
timeout: 'Timeout(s)',
Keyword: 'Keyword',
userParams: 'User Params',
diff --git a/dolphinscheduler-ui/src/locales/zh_CN/security.ts
b/dolphinscheduler-ui/src/locales/zh_CN/security.ts
index 463b18f33f..03a4ce7051 100644
--- a/dolphinscheduler-ui/src/locales/zh_CN/security.ts
+++ b/dolphinscheduler-ui/src/locales/zh_CN/security.ts
@@ -240,7 +240,7 @@ export default {
requestType: '请求方式',
headerParams: '请求头',
bodyParams: '请求体',
- contentField: '内容字段',
+ contentType: 'Content Type',
timeout: '超时时间(秒)',
Keyword: '关键词',
userParams: '自定义参数',
diff --git
a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx
b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx
index da77305eff..4970a02b62 100644
--- a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx
+++ b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx
@@ -203,6 +203,7 @@ const DetailModal = defineComponent({
'security.alarm_instance.select_plugin_tips'
)}
on-update:value={onChangePlugin}
+ filterable
/>
)
},