package com.linkedin.thirdeye.anomaly.grouping; import com.fasterxml.jackson.core.JsonProcessingException; import com.linkedin.thirdeye.anomaly.job.JobConstants; import com.linkedin.thirdeye.anomaly.job.JobRunner; import com.linkedin.thirdeye.anomaly.task.TaskConstants; import com.linkedin.thirdeye.anomaly.task.TaskGenerator; import com.linkedin.thirdeye.client.DAORegistry; import com.linkedin.thirdeye.datalayer.bao.JobManager; import com.linkedin.thirdeye.datalayer.dto.JobDTO; import com.linkedin.thirdeye.datalayer.dto.TaskDTO; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static com.linkedin.thirdeye.dashboard.resources.EntityManagerResource.OBJECT_MAPPER; public class GroupingJobRunner implements JobRunner { private static final Logger LOG = LoggerFactory.getLogger(GroupingJobRunner.class); private static final DAORegistry DAO_REGISTRY = DAORegistry.getInstance(); private static final JobManager jobDAO = DAO_REGISTRY.getJobDAO(); private GroupingJobContext jobContext; private TaskGenerator taskGenerator = new TaskGenerator(); public GroupingJobRunner(GroupingJobContext classificationJobContext) { this.jobContext = classificationJobContext; } @Override public Long createJob() { try { JobDTO jobSpec = new JobDTO(); String jobName = createJobName(jobContext); jobSpec.setJobName(jobName); jobSpec.setWindowStartTime(jobContext.getWindowStartTime()); jobSpec.setWindowEndTime(jobContext.getWindowEndTime()); jobSpec.setScheduleStartTime(System.currentTimeMillis()); jobSpec.setStatus(JobConstants.JobStatus.SCHEDULED); jobSpec.setTaskType(TaskConstants.TaskType.GROUPING); Long jobExecutionId = jobDAO.save(jobSpec); jobContext.setJobName(jobName); jobContext.setJobExecutionId(jobExecutionId); LOG.info("Created anomalyJobSpec {} with jobExecutionId {}", jobSpec, jobExecutionId); return jobExecutionId; } catch (Exception e) { LOG.error("Exception in creating classification job", e); } return null; } @Override public List<Long> createTasks() { List<Long> taskIds = new ArrayList<>(); try { LOG.info("Creating classification tasks"); List<GroupingTaskInfo> taskInfos = taskGenerator .createGroupingTasks(jobContext, jobContext.getWindowStartTime(), jobContext.getWindowEndTime()); LOG.info("Classification tasks {}", taskInfos); for (GroupingTaskInfo taskInfo : taskInfos) { String taskInfoJson = null; try { taskInfoJson = OBJECT_MAPPER.writeValueAsString(taskInfo); } catch (JsonProcessingException e) { LOG.error("Exception when converting GroupingTaskInfo {} to jsonString", taskInfo, e); } TaskDTO taskSpec = new TaskDTO(); taskSpec.setTaskType(TaskConstants.TaskType.GROUPING); taskSpec.setJobName(jobContext.getJobName()); taskSpec.setStatus(TaskConstants.TaskStatus.WAITING); taskSpec.setStartTime(System.currentTimeMillis()); taskSpec.setTaskInfo(taskInfoJson); taskSpec.setJobId(jobContext.getJobExecutionId()); long taskId = DAO_REGISTRY.getTaskDAO().save(taskSpec); taskIds.add(taskId); LOG.info("Created classification task {} with taskId {}", taskSpec, taskId); } } catch (Exception e) { LOG.error("Exception in creating classification tasks", e); } return taskIds; } @Override public void run() { Long jobExecutionId = createJob(); if (jobExecutionId != null) { List<Long> taskIds = createTasks(); } } private static String createJobName(GroupingJobContext jobContext) { long configId = jobContext.getConfigDTO().getId(); String configName = jobContext.getConfigDTO().getName(); long startTimes = jobContext.getWindowStartTime(); long endTimes = jobContext.getWindowEndTime(); return String.format("%s-%s-%s-%s", configId, configName, startTimes, endTimes); } }