package com.sequenceiq.periscope.monitor.evaluator;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.sequenceiq.periscope.domain.BaseAlert;
import com.sequenceiq.periscope.domain.TimeAlert;
import com.sequenceiq.periscope.log.MDCBuilder;
import com.sequenceiq.periscope.monitor.MonitorUpdateRate;
import com.sequenceiq.periscope.monitor.event.ScalingEvent;
import com.sequenceiq.periscope.repository.TimeAlertRepository;
import com.sequenceiq.periscope.utils.DateUtils;
@Component("CronTimeEvaluator")
@Scope("prototype")
public class CronTimeEvaluator extends AbstractEventPublisher implements EvaluatorExecutor {
private static final Logger LOGGER = LoggerFactory.getLogger(CronTimeEvaluator.class);
@Autowired
private TimeAlertRepository alertRepository;
private long clusterId;
@Override
public void setContext(Map<String, Object> context) {
this.clusterId = (long) context.get(EvaluatorContext.CLUSTER_ID.name());
}
private boolean isTrigger(TimeAlert alert) {
return DateUtils.isTrigger(alert.getCron(), alert.getTimeZone(), MonitorUpdateRate.CLUSTER_UPDATE_RATE);
}
private boolean isPolicyAttached(BaseAlert alert) {
return alert.getScalingPolicy() != null;
}
@Override
public void run() {
for (TimeAlert alert : alertRepository.findAllByCluster(clusterId)) {
MDCBuilder.buildMdcContext(alert.getCluster());
String alertName = alert.getName();
LOGGER.info("Checking time based alert: '{}'", alertName);
if (isTrigger(alert) && isPolicyAttached(alert)) {
LOGGER.info("Time alert: '{}' triggers", alertName);
publishEvent(new ScalingEvent(alert));
break;
}
}
}
}