@Override public void send(StreamEvent event) throws Exception { Object[] data = event.getData(); List<Object> columnValues = new ArrayList<>(); for (int i = 0; i < expectFieldIndices.size(); i++) { Object o = data[expectFieldIndices.get(i)]; // convert value to string columnValues.add(o.toString()); } boolean isAbsenceAlert = driver.process(columnValues, event.getTimestamp()); // Publishing alerts. if (isAbsenceAlert) { AlertStreamEvent alertEvent = AlertStreamUtils.createAlertEvent(event, context, sds); collector.emit(alertEvent); } }
public boolean process(List<Object> appearAttrs, long occurTime) { // initialize window if (processor == null) { processor = nextProcessor(occurTime); LOG.info("initialized a new window {}", processor); } processor.process(appearAttrs, occurTime); AbsenceWindowProcessor.OccurStatus status = processor.checkStatus(); boolean expired = processor.checkExpired(); boolean isAbsenceAlert = false; if (expired) { if (status == AbsenceWindowProcessor.OccurStatus.absent) { // send alert LOG.info("==================="); LOG.info("|| Absence Alert ||"); LOG.info("==================="); isAbsenceAlert = true; // figure out next window and set the new window } processor = nextProcessor(occurTime); LOG.info("created a new window {}", processor); } return isAbsenceAlert; }
@Test public void testAbsence() throws Exception { // from 2PM to 3PM each day AbsenceDailyRule rule = new AbsenceDailyRule(); rule.startOffset = 14 * 3600 * 1000; rule.endOffset = 15 * 3600 * 1000; AbsenceWindowGenerator generator = new AbsenceWindowGenerator(rule); List<Object> expectAttrs = Arrays.asList("host1"); AbsenceAlertDriver driver = new AbsenceAlertDriver(expectAttrs, generator); // first event came in 2016-07-08 11:20:00 String date = "2016-07-08 11:20:00"; DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("UTC")); Date d = df.parse(date); long baseOccurTime = d.getTime(); // first event driver.process(Arrays.asList("host2"), baseOccurTime); // event after 1 hour driver.process(Arrays.asList("host2"), baseOccurTime + 3600 * 1000); // event after 2 hour driver.process(Arrays.asList("host2"), baseOccurTime + 2 * 3600 * 1000); // event after 3 hour, enter this window driver.process(Arrays.asList("host2"), baseOccurTime + 3 * 3600 * 1000); // event after 3.5 hour, still in this window driver.process(Arrays.asList("host2"), baseOccurTime + 3 * 3600 * 1000 + 1800 * 1000); // event after 4 hour, exit this window driver.process(Arrays.asList("host2"), baseOccurTime + 4 * 3600 * 1000); }
rule.endOffset = t2.getTime(); AbsenceWindowGenerator generator = new AbsenceWindowGenerator(rule); driver = new AbsenceAlertDriver(expectValues, generator);
AbsenceWindowGenerator generator = new AbsenceWindowGenerator(rule); List<Object> expectAttrs = Arrays.asList("host1"); AbsenceAlertDriver driver = new AbsenceAlertDriver(expectAttrs, generator); driver.process(Arrays.asList("host2"), baseOccurTime); driver.process(Arrays.asList("host2"), baseOccurTime + 3600 * 1000); driver.process(Arrays.asList("host2"), baseOccurTime + 2 * 3600 * 1000); driver.process(Arrays.asList("host2"), baseOccurTime + 3 * 3600 * 1000); driver.process(Arrays.asList("host1"), baseOccurTime + 3 * 3600 * 1000 + 1800 * 1000); driver.process(Arrays.asList("host2"), baseOccurTime + 4 * 3600 * 1000);