public ScheduledFuture start()

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;
  }