/** * calculate absolute time range based on current timestamp. * * @param currTime milliseconds * @return */ private AbsenceWindowProcessor nextProcessor(long currTime) { AbsenceWindow window = windowGenerator.nextWindow(currTime); return new AbsenceWindowProcessor(expectedAttrs, window); } }
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; }
/** * nextWindow. * * @param currTime current timestamp */ public AbsenceWindow nextWindow(long currTime) { AbsenceWindow window = new AbsenceWindow(); if (rule instanceof AbsenceDailyRule) { AbsenceDailyRule r = (AbsenceDailyRule) rule; long adjustment = 0; // if today's window already expires, then adjust to tomorrow's window if (currTime % AbsenceDailyRule.DAY_MILLI_SECONDS > r.startOffset) { adjustment = AbsenceDailyRule.DAY_MILLI_SECONDS; } // use current timestamp to round down to day long day = currTime - currTime % AbsenceDailyRule.DAY_MILLI_SECONDS; day += adjustment; window.startTime = day + r.startOffset; window.endTime = day + r.endOffset; return window; } else { throw new UnsupportedOperationException("not supported rule " + rule); } } }
@Test public void testDataMissing() { List<Object> expectedHosts = Arrays.asList("host1"); AbsenceWindow window = new AbsenceWindow(); window.startTime = 100L; window.endTime = 200L; AbsenceWindowProcessor processor = new AbsenceWindowProcessor(expectedHosts, window); processor.process(Arrays.asList("host2"), 90); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.not_sure); processor.process(Arrays.asList("host3"), 101); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.not_sure); processor.process(Arrays.asList("host3"), 138); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.not_sure); processor.process(Arrays.asList("host2"), 189); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.not_sure); processor.process(Arrays.asList("host2"), 201); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.absent); }
@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); }
@Test public void testWindowInToday() throws Exception { AbsenceDailyRule rule = new AbsenceDailyRule(); // from 2PM to 3PM each day rule.startOffset = 14 * 3600 * 1000; rule.endOffset = 15 * 3600 * 1000; AbsenceWindowGenerator generator = new AbsenceWindowGenerator(rule); // get current time String date = "2016-07-08 00:00:00"; DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("UTC")); Date d = df.parse(date); long startTimeOfDay = d.getTime(); String currDate = "2016-07-08 11:30:29"; df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("UTC")); d = df.parse(currDate); AbsenceWindow window = generator.nextWindow(d.getTime()); Assert.assertEquals(startTimeOfDay + rule.startOffset, window.startTime); }
AbsenceDailyRule rule = new AbsenceDailyRule(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); Date t2 = sdf.parse(segments[offset++]); rule.endOffset = t2.getTime(); AbsenceWindowGenerator generator = new AbsenceWindowGenerator(rule); driver = new AbsenceAlertDriver(expectValues, generator);
public void test(PolicyDefinition pd) throws Exception { Map<String, StreamDefinition> sds = new HashMap<>(); StreamDefinition sd = buildStreamDef(); sds.put("testInputStream", sd); AbsencePolicyHandler handler = new AbsencePolicyHandler(sds); PolicyHandlerContext context = new PolicyHandlerContext(); context.setPolicyDefinition(pd); handler.prepare(new TestCollector(), context); handler.send(buildStreamEvt(0, "job1", "running")); }
@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 static PolicyStreamHandler createHandler(PolicyDefinition.Definition definition, Map<String, StreamDefinition> sds) { if (SIDDHI_ENGINE.equals(definition.getType())) { return new SiddhiPolicyHandler(sds, 0);// // FIXME: 8/2/16 } else if (NO_DATA_ALERT_ENGINE.equals(definition.getType())) { // no data for an entire stream won't trigger gap alert (use local time & batch window instead) return new NoDataPolicyTimeBatchHandler(sds); } else if (ABSENCE_ALERT_ENGINE.equals(definition.getType())) { return new AbsencePolicyHandler(sds); } else if (CUSTOMIZED_ENGINE.equals(definition.getType())) { try { Class<?> handlerClz = Class.forName(definition.getHandlerClass()); PolicyStreamHandler handler = (PolicyStreamHandler) handlerClz.getConstructor(Map.class).newInstance(sds); return handler; } catch (Exception e) { LOG.error("Not able to create policy handler for handler class " + definition.getHandlerClass(), e); throw new IllegalArgumentException("Illegal extended policy handler class!" + definition.getHandlerClass()); } } throw new IllegalArgumentException("Illegal policy stream handler type " + definition.getType()); }
@Test(expected = IllegalStateException.class) public void testDataExists() { List<Object> expectedHosts = Arrays.asList("host1"); AbsenceWindow window = new AbsenceWindow(); window.startTime = 100L; window.endTime = 200L; AbsenceWindowProcessor processor = new AbsenceWindowProcessor(expectedHosts, window); processor.process(Arrays.asList("host2"), 90); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.not_sure); processor.process(Arrays.asList("host3"), 101); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.not_sure); processor.process(Arrays.asList("host1"), 138); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.occured); processor.process(Arrays.asList("host2"), 189); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.occured); processor.process(Arrays.asList("host2"), 201); Assert.assertEquals(processor.checkStatus(), AbsenceWindowProcessor.OccurStatus.occured); Assert.assertEquals(processor.checkExpired(), true); processor.process(Arrays.asList("host2"), 225); } }
@Test public void testOccurrence() throws Exception { 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); 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);
@Test public void testWindowInTomorrow() throws Exception { AbsenceDailyRule rule = new AbsenceDailyRule(); // from 2PM to 3PM each day rule.startOffset = 14 * 3600 * 1000; rule.endOffset = 15 * 3600 * 1000; AbsenceWindowGenerator generator = new AbsenceWindowGenerator(rule); // get current time String date = "2016-07-08 00:00:00"; DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("UTC")); Date d = df.parse(date); long startTimeOfDay = d.getTime(); String currDate = "2016-07-08 18:20:19"; df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("UTC")); d = df.parse(currDate); AbsenceWindow window = generator.nextWindow(d.getTime()); // this needs adjustment for one day Assert.assertEquals(startTimeOfDay + rule.startOffset + AbsenceDailyRule.DAY_MILLI_SECONDS, window.startTime); } }