package org.ovirt.engine.core.vdsbroker.monitoring;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import javax.inject.Inject;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
import org.ovirt.engine.core.vdsbroker.VdsManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PollVmStatsRefresher extends VmStatsRefresher {
private static final Logger log = LoggerFactory.getLogger(PollVmStatsRefresher.class);
protected static final int VMS_REFRESH_RATE = Config.<Integer> getValue(ConfigValues.VdsRefreshRate) * 1000;
protected static final int NUMBER_VMS_REFRESHES_BEFORE_SAVE = Config.<Integer> getValue(ConfigValues.NumberVmRefreshesBeforeSave);
@Inject
private SchedulerUtilQuartzImpl scheduler;
private String vmsMonitoringJobId;
public PollVmStatsRefresher(VdsManager vdsManager) {
super(vdsManager);
}
@OnTimerMethodAnnotation("poll")
public void poll() {
if (isMonitoringNeeded(vdsManager.getStatus())) {
VmsListFetcher fetcher = new VmsStatisticsFetcher(vdsManager);
long fetchTime = System.nanoTime();
if (fetcher.fetch()) {
getVmsMonitoring().perform(fetcher.getChangedVms(), fetchTime, vdsManager, true);
//we only want to monitor vm devices for vms that already exist in the db
Stream<VdsmVm> vdsmVmsToMonitor = fetcher.getChangedVms().stream().
filter(monitoredVm -> monitoredVm.getFirst() != null).
map(Pair::getSecond);
processDevices(vdsmVmsToMonitor, fetchTime);
} else {
log.info("Failed to fetch vms info for host '{}' - skipping VMs monitoring.", vdsManager.getVdsName());
}
}
}
public void startMonitoring() {
vmsMonitoringJobId =
scheduler.scheduleAFixedDelayJob(
this,
"poll",
new Class[0],
new Object[0],
0,
VMS_REFRESH_RATE * NUMBER_VMS_REFRESHES_BEFORE_SAVE,
TimeUnit.MILLISECONDS);
}
public void stopMonitoring() {
scheduler.deleteJob(vmsMonitoringJobId);
}
/* visible for testing only */
boolean isMonitoringNeeded(VDSStatus status) {
switch (status) {
default:
return false;
case Up:
case Error:
case NonOperational:
case PreparingForMaintenance:
// FIXME The below statuses are probably not relevant
// for monitoring but it's currently not final.
case NonResponsive:
case Initializing:
case Connecting:
return true;
}
}
}