blob: 2686ed2e032df6bf70a4e89a32fba7eae70f5c00 [file] [log] [blame]
/*
* 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.streampark.console.core.service.alert.impl;
import org.apache.streampark.console.base.exception.AlertException;
import org.apache.streampark.console.base.util.FreemarkerUtils;
import org.apache.streampark.console.core.bean.AlertConfigParams;
import org.apache.streampark.console.core.bean.AlertHttpCallbackParams;
import org.apache.streampark.console.core.bean.AlertTemplate;
import org.apache.streampark.console.core.service.alert.AlertNotifyService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Nonnull;
import java.util.Map;
@Slf4j
@Service
@Lazy
public class HttpCallbackAlertNotifyServiceImpl implements AlertNotifyService {
@Autowired private RestTemplate alertRestTemplate;
@Autowired private ObjectMapper mapper;
@Override
public boolean doAlert(AlertConfigParams alertConfig, AlertTemplate alertTemplate)
throws AlertException {
AlertHttpCallbackParams alertHttpCallbackParams = alertConfig.getHttpCallbackParams();
String requestTemplate = alertHttpCallbackParams.getRequestTemplate();
if (!StringUtils.hasLength(requestTemplate)) {
return false;
}
try {
Template template = FreemarkerUtils.loadTemplateString(requestTemplate);
String format = FreemarkerUtils.format(template, alertTemplate);
Map<String, Object> body =
mapper.readValue(format, new TypeReference<Map<String, Object>>() {});
sendMessage(alertHttpCallbackParams, body);
return true;
} catch (AlertException alertException) {
throw alertException;
} catch (Exception e) {
throw new AlertException("Failed send httpCallback alert", e);
}
}
private void sendMessage(AlertHttpCallbackParams params, Map<String, Object> body)
throws AlertException {
String url = params.getUrl();
HttpHeaders headers = getHttpHeaders(params);
ResponseEntity<Object> response;
try {
HttpMethod httpMethod = HttpMethod.POST;
String method = params.getMethod();
if (!StringUtils.hasLength(method)) {
if (HttpMethod.PUT.name().equalsIgnoreCase(method)) {
httpMethod = HttpMethod.PUT;
}
}
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(body, headers);
RequestCallback requestCallback = alertRestTemplate.httpEntityCallback(entity, Object.class);
ResponseExtractor<ResponseEntity<Object>> responseExtractor =
alertRestTemplate.responseEntityExtractor(Object.class);
response = alertRestTemplate.execute(url, httpMethod, requestCallback, responseExtractor);
} catch (Exception e) {
log.error("Failed to request httpCallback alert,\nurl:{}", url, e);
throw new AlertException(
String.format("Failed to request httpCallback alert,%nurl:%s", url), e);
}
if (response == null) {
throw new AlertException(String.format("Failed to request httpCallback alert,%nurl:%s", url));
}
}
@Nonnull
private HttpHeaders getHttpHeaders(AlertHttpCallbackParams params) {
HttpHeaders headers = new HttpHeaders();
String contentType = params.getContentType();
MediaType mediaType = MediaType.APPLICATION_JSON;
if (StringUtils.hasLength(contentType)) {
switch (contentType.toLowerCase()) {
case MediaType.APPLICATION_FORM_URLENCODED_VALUE:
mediaType = MediaType.APPLICATION_FORM_URLENCODED;
break;
case MediaType.MULTIPART_FORM_DATA_VALUE:
mediaType = MediaType.MULTIPART_FORM_DATA;
break;
case MediaType.APPLICATION_JSON_VALUE:
default:
break;
}
}
headers.setContentType(mediaType);
return headers;
}
}