Unverified Commit 2f010258 authored by felix.wang's avatar felix.wang Committed by GitHub
Browse files

[Fix-3299][dao&server] Fix 3299,when Json string parsing problem caused by...


[Fix-3299][dao&server] Fix 3299,when Json string parsing problem caused by non-standard json format. (#3552)

* #3299  Json string parsing problem caused by non-standard json format.

* #3299  Json string parsing problem caused by non-standard json format.

* #3299  Json string parsing problem caused by non-standard json format. fix  code style

* #3299  Json string parsing problem caused by non-standard json format. fix  code style

Co-authored-by: default avatarwangjianda <Felix@thinkingdata.com>
parent d30bc7bc
Loading
Loading
Loading
Loading
+56 −25
Original line number Diff line number Diff line
@@ -14,15 +14,14 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.dolphinscheduler.dao;

package org.apache.dolphinscheduler.dao;

import org.apache.dolphinscheduler.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.apache.dolphinscheduler.common.enums.AlertStatus;
import org.apache.dolphinscheduler.common.enums.AlertType;
import org.apache.dolphinscheduler.common.enums.ShowType;
import org.apache.dolphinscheduler.common.utils.JSONUtils;
import org.apache.dolphinscheduler.common.utils.StringUtils;
import org.apache.dolphinscheduler.dao.datasource.ConnectionFactory;
import org.apache.dolphinscheduler.dao.entity.Alert;
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
@@ -30,13 +29,17 @@ import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.mapper.AlertMapper;
import org.apache.dolphinscheduler.dao.mapper.UserAlertGroupMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AlertDao extends AbstractBaseDao {

@@ -56,6 +59,7 @@ public class AlertDao extends AbstractBaseDao {

    /**
     * insert alert
     *
     * @param alert alert
     * @return add alert result
     */
@@ -65,6 +69,7 @@ public class AlertDao extends AbstractBaseDao {

    /**
     * update alert
     *
     * @param alertStatus alertStatus
     * @param log log
     * @param id id
@@ -80,6 +85,7 @@ public class AlertDao extends AbstractBaseDao {

    /**
     * query user list by alert group id
     *
     * @param alerGroupId alerGroupId
     * @return user list
     */
@@ -90,20 +96,28 @@ public class AlertDao extends AbstractBaseDao {

    /**
     * MasterServer or WorkerServer stoped
     *
     * @param alertgroupId alertgroupId
     * @param host host
     * @param serverType serverType
     */
    public void sendServerStopedAlert(int alertgroupId, String host, String serverType) {
        Alert alert = new Alert();
        String content = String.format("[{'type':'%s','host':'%s','event':'server down','warning level':'serious'}]",
                serverType, host);
        List<LinkedHashMap> serverStopList = new ArrayList<>(1);
        LinkedHashMap<String, String> serverStopedMap = new LinkedHashMap();
        serverStopedMap.put("type", serverType);
        serverStopedMap.put("host", host);
        serverStopedMap.put("event", "server down");
        serverStopedMap.put("warning level", "serious");
        serverStopList.add(serverStopedMap);
        String content = JSONUtils.toJsonString(serverStopList);
        alert.setTitle("Fault tolerance warning");
        saveTaskTimeoutAlert(alert, content, alertgroupId, null, null);
    }

    /**
     * process time out alert
     *
     * @param processInstance processInstance
     * @param processDefinition processDefinition
     */
@@ -112,8 +126,14 @@ public class AlertDao extends AbstractBaseDao {
        String receivers = processDefinition.getReceivers();
        String receiversCc = processDefinition.getReceiversCc();
        Alert alert = new Alert();
        String content = String.format("[{'id':'%d','name':'%s','event':'timeout','warnLevel':'middle'}]",
                processInstance.getId(), processInstance.getName());
        List<LinkedHashMap> processTimeoutList = new ArrayList<>(1);
        LinkedHashMap<String, String> processTimeoutMap = new LinkedHashMap();
        processTimeoutMap.put("id", String.valueOf(processInstance.getId()));
        processTimeoutMap.put("name", processInstance.getName());
        processTimeoutMap.put("event", "timeout");
        processTimeoutMap.put("warnLevel", "middle");
        processTimeoutList.add(processTimeoutMap);
        String content = JSONUtils.toJsonString(processTimeoutList);
        alert.setTitle("Process Timeout Warn");
        saveTaskTimeoutAlert(alert, content, alertgroupId, receivers, receiversCc);
    }
@@ -135,9 +155,9 @@ public class AlertDao extends AbstractBaseDao {
        alertMapper.insert(alert);
    }


    /**
     * task timeout warn
     *
     * @param alertgroupId alertgroupId
     * @param receivers receivers
     * @param receiversCc receiversCc
@@ -149,14 +169,23 @@ public class AlertDao extends AbstractBaseDao {
    public void sendTaskTimeoutAlert(int alertgroupId, String receivers, String receiversCc, int processInstanceId,
                                     String processInstanceName, int taskId, String taskName) {
        Alert alert = new Alert();
        String content = String.format("[{'process instance id':'%d','task name':'%s','task id':'%d','task name':'%s'," +
                        "'event':'timeout','warnLevel':'middle'}]", processInstanceId, processInstanceName, taskId, taskName);
        List<LinkedHashMap> taskTimeoutList = new ArrayList<>(1);
        LinkedHashMap<String, String> taskTimeoutMap = new LinkedHashMap();
        taskTimeoutMap.put("process instance id", String.valueOf(processInstanceId));
        taskTimeoutMap.put("process name", processInstanceName);
        taskTimeoutMap.put("task id", String.valueOf(taskId));
        taskTimeoutMap.put("task name", taskName);
        taskTimeoutMap.put("event", "timeout");
        taskTimeoutMap.put("warnLevel", "middle");
        taskTimeoutList.add(taskTimeoutMap);
        String content = JSONUtils.toJsonString(taskTimeoutList);
        alert.setTitle("Task Timeout Warn");
        saveTaskTimeoutAlert(alert, content, alertgroupId, receivers, receiversCc);
    }

    /**
     * list the alert information of waiting to be executed
     *
     * @return alert list
     */
    public List<Alert> listWaitExecutionAlert() {
@@ -165,6 +194,7 @@ public class AlertDao extends AbstractBaseDao {

    /**
     * list user information by alert group id
     *
     * @param alertgroupId alertgroupId
     * @return user list
     */
@@ -174,6 +204,7 @@ public class AlertDao extends AbstractBaseDao {

    /**
     * for test
     *
     * @return AlertMapper
     */
    public AlertMapper getAlertMapper() {
+48 −61
Original line number Diff line number Diff line
@@ -14,29 +14,30 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.dolphinscheduler.server.utils;

package org.apache.dolphinscheduler.server.utils;

import org.apache.dolphinscheduler.common.enums.AlertType;
import org.apache.dolphinscheduler.common.enums.CommandType;
import org.apache.dolphinscheduler.common.enums.ShowType;
import org.apache.dolphinscheduler.common.enums.WarningType;
import org.apache.dolphinscheduler.common.utils.DateUtils;
import org.apache.dolphinscheduler.common.utils.*;
import org.apache.dolphinscheduler.common.utils.JSONUtils;
import org.apache.dolphinscheduler.dao.AlertDao;
import org.apache.dolphinscheduler.dao.DaoFactory;
import org.apache.dolphinscheduler.dao.entity.Alert;
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
import org.apache.dolphinscheduler.dao.entity.TaskInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * alert manager
 */
@@ -50,8 +51,7 @@ public class AlertManager {
    /**
     * alert dao
     */
    private AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class);

    private final AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class);

    /**
     * command type convert chinese
@@ -86,22 +86,9 @@ public class AlertManager {
        }
    }

    /**
     * process instance format
     */
    private static final String PROCESS_INSTANCE_FORMAT =
            "\"id:%d\"," +
            "\"name:%s\"," +
            "\"job type: %s\"," +
            "\"state: %s\"," +
            "\"recovery:%s\"," +
            "\"run time: %d\"," +
            "\"start time: %s\"," +
            "\"end time: %s\"," +
            "\"host: %s\"" ;

    /**
     * get process instance content
     *
     * @param processInstance process instance
     * @param taskInstances task instance list
     * @return process instance format content
@@ -111,19 +98,19 @@ public class AlertManager {

        String res = "";
        if (processInstance.getState().typeIsSuccess()) {
            res = String.format(PROCESS_INSTANCE_FORMAT,
                    processInstance.getId(),
                    processInstance.getName(),
                    getCommandCnName(processInstance.getCommandType()),
                    processInstance.getState().toString(),
                    processInstance.getRecovery().toString(),
                    processInstance.getRunTimes(),
                    DateUtils.dateToString(processInstance.getStartTime()),
                    DateUtils.dateToString(processInstance.getEndTime()),
                    processInstance.getHost()

            );
            res = "[" + res + "]";
            List<LinkedHashMap> successTaskList = new ArrayList<>(1);
            LinkedHashMap<String, String> successTaskMap = new LinkedHashMap();
            successTaskMap.put("id", String.valueOf(processInstance.getId()));
            successTaskMap.put("name", processInstance.getName());
            successTaskMap.put("job type", getCommandCnName(processInstance.getCommandType()));
            successTaskMap.put("state", processInstance.getState().toString());
            successTaskMap.put("recovery", processInstance.getRecovery().toString());
            successTaskMap.put("run time", String.valueOf(processInstance.getRunTimes()));
            successTaskMap.put("start time", DateUtils.dateToString(processInstance.getStartTime()));
            successTaskMap.put("end time", DateUtils.dateToString(processInstance.getEndTime()));
            successTaskMap.put("host", processInstance.getHost());
            successTaskList.add(successTaskMap);
            res = JSONUtils.toJsonString(successTaskList);
        } else if (processInstance.getState().typeIsFailure()) {

            List<LinkedHashMap> failedTaskList = new ArrayList<>();
@@ -202,6 +189,7 @@ public class AlertManager {

    /**
     * send process instance alert
     *
     * @param processInstance process instance
     * @param taskInstances task instance list
     */
@@ -233,7 +221,6 @@ public class AlertManager {
        }
        Alert alert = new Alert();


        String cmdName = getCommandCnName(processInstance.getCommandType());
        String success = processInstance.getState().typeIsSuccess() ? "success" : "failed";
        alert.setTitle(cmdName + " " + success);