in src/main/java/com/microsoft/dhalion/policy/PoliciesExecutor.java [50:111]
public ScheduledFuture<?> start() {
ScheduledFuture<?> future = executor.scheduleWithFixedDelay(() -> {
// schedule the next execution cycle
Duration nextScheduleDelay = policies.stream()
.map(IHealthPolicy::getDelay)
.min(Comparator.naturalOrder())
.orElse(Duration.ofSeconds(10));
if (nextScheduleDelay.toMillis() > 0) {
try {
LOG.info("Sleep (millis) before next policy execution cycle: " + nextScheduleDelay);
TimeUnit.MILLISECONDS.sleep(nextScheduleDelay.toMillis());
} catch (InterruptedException e) {
LOG.warning("Interrupted while waiting for next policy execution cycle");
}
}
for (IHealthPolicy policy : policies) {
if (policy.getDelay().toMillis() > 0) {
continue;
}
ExecutionContext context = policyContextMap.get(policy);
context.captureCheckpoint();
Instant previous = context.previousCheckpoint;
Instant current = context.checkpoint;
LOG.info(String.format("Executing Policy: %s, checkpoint: %s",
policy.getClass().getSimpleName(),
context.checkpoint));
Collection<Measurement> measurements = policy.executeSensors();
measurements.stream()
.filter(m -> m.instant().isAfter(current) || m.instant().isBefore(previous))
.forEach(m -> LOG.info(m.toString() + "is outside checkpoint window"));
context.measurementsTableBuilder.addAll(measurements);
Collection<Symptom> symptoms = policy.executeDetectors(measurements);
identifyOutliers(previous, current, symptoms);
context.symptomsTableBuilder.addAll(symptoms);
Collection<Diagnosis> diagnosis = policy.executeDiagnosers(symptoms);
identifyOutliers(previous, current, diagnosis);
context.diagnosisTableBuilder.addAll(diagnosis);
Collection<Action> actions = policy.executeResolvers(diagnosis);
identifyOutliers(previous, current, actions);
context.actionTableBuilder.addAll(actions);
// TODO pretty print
LOG.info(actions.toString());
Instant expiration = current.minus(Duration.ofMinutes(30));
context.measurementsTableBuilder.expireBefore(expiration);
context.symptomsTableBuilder.expireBefore(expiration);
context.diagnosisTableBuilder.expireBefore(expiration);
context.actionTableBuilder.expireBefore(expiration);
}
}, 1, 1, TimeUnit.MILLISECONDS);
return future;
}