package com.linkedin.thirdeye.tools.anomaly.report; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.linkedin.thirdeye.anomaly.ThirdEyeAnomalyConfiguration; import io.dropwizard.configuration.ConfigurationFactory; import io.dropwizard.jackson.Jackson; import java.io.File; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.validation.Validation; import org.quartz.CronExpression; public class AnomalyReportDriver { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory()); private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { Runnable job = new Runnable() { @Override public void run() { try { System.out.println("Running report generation"); runReportGenerator(); } catch (Exception e) { e.printStackTrace(); } } }; ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); long delaySeconds = (getNextExecutionTime().getTime() - System.currentTimeMillis()) / 1000; // Repeat every 4 hours // scheduler.scheduleAtFixedRate(job, delaySeconds, TimeUnit.HOURS.toSeconds(4), TimeUnit.SECONDS); // Repeat every Day scheduler.scheduleAtFixedRate(job, delaySeconds, TimeUnit.DAYS.toSeconds(1), TimeUnit.SECONDS); System.out.println("Press q to quit"); int ch = System.in.read(); while (ch != 'q') { System.out.println("Press q to quit, next execution time : " + getNextExecutionTime()); ch = System.in.read(); } System.exit(-1); } static Date getNextExecutionTime() throws Exception { CronExpression cronExpression = new CronExpression("0 0 7 * * ?"); return cronExpression.getNextValidTimeAfter(new Date()); } static void runReportGenerator() throws Exception { File configFile = new File( "/opt/Code/pinot2_0/thirdeye/thirdeye-pinot/src/test/resources/custom-anomaly-report-config.yml"); AnomalyReportConfig config = OBJECT_MAPPER.readValue(configFile, AnomalyReportConfig.class); File persistenceFile = new File(config.getThirdEyeConfigDirectoryPath() + "/persistence.yml"); if (!persistenceFile.exists()) { System.err.println("Missing file:" + persistenceFile); System.exit(1); } File detectorConfigFile = new File(config.getThirdEyeConfigDirectoryPath() + "/detector.yml"); if (!detectorConfigFile.exists()) { System.err.println("Missing file:" + detectorConfigFile); System.exit(1); } ConfigurationFactory<ThirdEyeAnomalyConfiguration> factory = new ConfigurationFactory<>(ThirdEyeAnomalyConfiguration.class, Validation.buildDefaultValidatorFactory().getValidator(), Jackson.newObjectMapper(), ""); ThirdEyeAnomalyConfiguration detectorConfig = factory.build(detectorConfigFile); long current = System.currentTimeMillis(); Date endDate = new Date(current - (current % 36_00_000)); Date startDate = new Date(endDate.getTime() - TimeUnit.HOURS.toMillis(24)); GenerateAnomalyReport reportGenerator = new GenerateAnomalyReport(startDate, endDate, persistenceFile, Arrays.asList(config.getDatasets().split(",")), config.getTeBaseUrl(), detectorConfig.getSmtpConfiguration(), config.getEmailRecipients()); reportGenerator.buildReport(); } }