|
|
|
@ -24,6 +24,7 @@ import org.apache.dolphinscheduler.alert.api.AlertInfo;
|
|
|
|
|
import org.apache.dolphinscheduler.alert.api.AlertResult; |
|
|
|
|
import org.apache.dolphinscheduler.common.Constants; |
|
|
|
|
import org.apache.dolphinscheduler.common.enums.AlertStatus; |
|
|
|
|
import org.apache.dolphinscheduler.common.enums.AlertType; |
|
|
|
|
import org.apache.dolphinscheduler.common.enums.WarningType; |
|
|
|
|
import org.apache.dolphinscheduler.common.thread.Stopper; |
|
|
|
|
import org.apache.dolphinscheduler.common.thread.ThreadUtils; |
|
|
|
@ -43,10 +44,14 @@ import java.util.Optional;
|
|
|
|
|
import java.util.concurrent.CompletableFuture; |
|
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
|
|
|
|
|
import javax.annotation.Nullable; |
|
|
|
|
|
|
|
|
|
import org.slf4j.Logger; |
|
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
import com.google.common.collect.Lists; |
|
|
|
|
|
|
|
|
|
@Service |
|
|
|
|
public final class AlertSenderService extends Thread { |
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(AlertSenderService.class); |
|
|
|
@ -89,7 +94,9 @@ public final class AlertSenderService extends Thread {
|
|
|
|
|
List<AlertPluginInstance> alertInstanceList = alertDao.listInstanceByAlertGroupId(alertGroupId); |
|
|
|
|
if (CollectionUtils.isEmpty(alertInstanceList)) { |
|
|
|
|
logger.error("send alert msg fail,no bind plugin instance."); |
|
|
|
|
alertDao.updateAlert(AlertStatus.EXECUTION_FAILURE, "no bind plugin instance", alertId); |
|
|
|
|
List<AlertResult> alertResults = Lists.newArrayList(new AlertResult("false", |
|
|
|
|
"no bind plugin instance")); |
|
|
|
|
alertDao.updateAlert(AlertStatus.EXECUTION_FAILURE, JSONUtils.toJsonString(alertResults), alertId); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
AlertData alertData = AlertData.builder() |
|
|
|
@ -98,17 +105,20 @@ public final class AlertSenderService extends Thread {
|
|
|
|
|
.log(alert.getLog()) |
|
|
|
|
.title(alert.getTitle()) |
|
|
|
|
.warnType(alert.getWarningType().getCode()) |
|
|
|
|
.alertType(alert.getAlertType().getCode()) |
|
|
|
|
.build(); |
|
|
|
|
|
|
|
|
|
int sendSuccessCount = 0; |
|
|
|
|
List<AlertResult> alertResults = new ArrayList<>(); |
|
|
|
|
for (AlertPluginInstance instance : alertInstanceList) { |
|
|
|
|
AlertResult alertResult = this.alertResultHandler(instance, alertData); |
|
|
|
|
if (alertResult != null) { |
|
|
|
|
AlertStatus sendStatus = Boolean.parseBoolean(String.valueOf(alertResult.getStatus())) ? AlertStatus.EXECUTION_SUCCESS : AlertStatus.EXECUTION_FAILURE; |
|
|
|
|
alertDao.addAlertSendStatus(sendStatus,alertResult.getMessage(),alertId,instance.getId()); |
|
|
|
|
alertDao.addAlertSendStatus(sendStatus, JSONUtils.toJsonString(alertResult), alertId, instance.getId()); |
|
|
|
|
if (sendStatus.equals(AlertStatus.EXECUTION_SUCCESS)) { |
|
|
|
|
sendSuccessCount++; |
|
|
|
|
} |
|
|
|
|
alertResults.add(alertResult); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
AlertStatus alertStatus = AlertStatus.EXECUTION_SUCCESS; |
|
|
|
@ -117,7 +127,7 @@ public final class AlertSenderService extends Thread {
|
|
|
|
|
} else if (sendSuccessCount < alertInstanceList.size()) { |
|
|
|
|
alertStatus = AlertStatus.EXECUTION_PARTIAL_SUCCESS; |
|
|
|
|
} |
|
|
|
|
alertDao.updateAlert(alertStatus, "", alertId); |
|
|
|
|
alertDao.updateAlert(alertStatus, JSONUtils.toJsonString(alertResults), alertId); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -170,17 +180,18 @@ public final class AlertSenderService extends Thread {
|
|
|
|
|
* @param alertData alertData |
|
|
|
|
* @return AlertResult |
|
|
|
|
*/ |
|
|
|
|
private AlertResult alertResultHandler(AlertPluginInstance instance, AlertData alertData) { |
|
|
|
|
Optional<AlertChannel> alertChannel = alertPluginManager.getAlertChannel(instance.getPluginDefineId()); |
|
|
|
|
AlertResult alertResultExtend = new AlertResult(); |
|
|
|
|
private @Nullable AlertResult alertResultHandler(AlertPluginInstance instance, AlertData alertData) { |
|
|
|
|
String pluginInstanceName = instance.getInstanceName(); |
|
|
|
|
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, instance.getPluginDefineId()); |
|
|
|
|
return alertResultExtend; |
|
|
|
|
int pluginDefineId = instance.getPluginDefineId(); |
|
|
|
|
Optional<AlertChannel> alertChannelOptional = alertPluginManager.getAlertChannel(instance.getPluginDefineId()); |
|
|
|
|
if (!alertChannelOptional.isPresent()) { |
|
|
|
|
String message = String.format("Alert Plugin %s send error: the channel doesn't exist, pluginDefineId: %s", |
|
|
|
|
pluginInstanceName, |
|
|
|
|
pluginDefineId); |
|
|
|
|
logger.error("Alert Plugin {} send error : not found plugin {}", pluginInstanceName, pluginDefineId); |
|
|
|
|
return new AlertResult("false", message); |
|
|
|
|
} |
|
|
|
|
AlertChannel alertChannel = alertChannelOptional.get(); |
|
|
|
|
|
|
|
|
|
Map<String, String> paramsMap = JSONUtils.toMap(instance.getPluginInstanceParams()); |
|
|
|
|
String instanceWarnType = WarningType.ALL.getDescp(); |
|
|
|
@ -193,10 +204,8 @@ public final class AlertSenderService extends Thread {
|
|
|
|
|
|
|
|
|
|
if (warningType == null) { |
|
|
|
|
String message = String.format("Alert Plugin %s send error : plugin warnType is null", pluginInstanceName); |
|
|
|
|
alertResultExtend.setStatus(String.valueOf(false)); |
|
|
|
|
alertResultExtend.setMessage(message); |
|
|
|
|
logger.error("Alert Plugin {} send error : plugin warnType is null", pluginInstanceName); |
|
|
|
|
return alertResultExtend; |
|
|
|
|
return new AlertResult("false", message); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
boolean sendWarning = false; |
|
|
|
@ -231,10 +240,18 @@ public final class AlertSenderService extends Thread {
|
|
|
|
|
AlertResult alertResult; |
|
|
|
|
try { |
|
|
|
|
if (waitTimeout <= 0) { |
|
|
|
|
alertResult = alertChannel.get().process(alertInfo); |
|
|
|
|
if (alertData.getAlertType() == AlertType.CLOSE_ALERT.getCode()) { |
|
|
|
|
alertResult = alertChannel.closeAlert(alertInfo); |
|
|
|
|
} else { |
|
|
|
|
alertResult = alertChannel.process(alertInfo); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
CompletableFuture<AlertResult> future = |
|
|
|
|
CompletableFuture.supplyAsync(() -> alertChannel.get().process(alertInfo)); |
|
|
|
|
CompletableFuture<AlertResult> future; |
|
|
|
|
if (alertData.getAlertType() == AlertType.CLOSE_ALERT.getCode()) { |
|
|
|
|
future = CompletableFuture.supplyAsync(() -> alertChannel.closeAlert(alertInfo)); |
|
|
|
|
} else { |
|
|
|
|
future = CompletableFuture.supplyAsync(() -> alertChannel.process(alertInfo)); |
|
|
|
|
} |
|
|
|
|
alertResult = future.get(waitTimeout, TimeUnit.MILLISECONDS); |
|
|
|
|
} |
|
|
|
|
} catch (InterruptedException e) { |
|
|
|
@ -246,18 +263,19 @@ public final class AlertSenderService extends Thread {
|
|
|
|
|
logger.error("send alert error alert data id :{},", alertData.getId(), e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
AlertResult alertResultExtend = new AlertResult(); |
|
|
|
|
if (alertResult == null) { |
|
|
|
|
String message = String.format("Alert Plugin %s send error : return alertResult value is null", pluginInstanceName); |
|
|
|
|
alertResultExtend.setStatus(String.valueOf(false)); |
|
|
|
|
alertResultExtend.setStatus("false"); |
|
|
|
|
alertResultExtend.setMessage(message); |
|
|
|
|
logger.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.setStatus("false"); |
|
|
|
|
alertResultExtend.setMessage(alertResult.getMessage()); |
|
|
|
|
logger.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.setStatus("true"); |
|
|
|
|
alertResultExtend.setMessage(message); |
|
|
|
|
logger.info("Alert Plugin {} send success", pluginInstanceName); |
|
|
|
|
} |
|
|
|
|