package org.ovirt.engine.core.vdsbroker.monitoring;
import java.util.HashMap;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.VmDynamic;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.vdsbroker.VdsManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class VmsStatisticsFetcher extends VmsListFetcher {
private static final Logger log = LoggerFactory.getLogger(VmsStatisticsFetcher.class);
private static final Map<Guid, Integer> vdsIdToNumOfVms = new HashMap<>();
private StringBuilder logBuilder;
public VmsStatisticsFetcher(VdsManager vdsManager) {
super(vdsManager);
}
@Override
protected VDSReturnValue poll() {
return getResourceManager().runVdsCommand(
VDSCommandType.GetAllVmStats,
new VdsIdVDSCommandParametersBase(vdsManager.getVdsId()));
}
@Override
protected void onFetchVms() {
if (log.isDebugEnabled()) {
logBuilder = new StringBuilder();
}
super.onFetchVms();
logNumOfVmsIfChanged();
if (log.isDebugEnabled()) {
log.debug(logBuilder.toString());
}
}
private void logNumOfVmsIfChanged() {
int numOfVms = vdsmVms.size();
Guid vdsId = vdsManager.getVdsId();
Integer prevNumOfVms = vdsIdToNumOfVms.put(vdsId, numOfVms);
if (prevNumOfVms == null || prevNumOfVms.intValue() != numOfVms) {
log.info("Fetched {} VMs from VDS '{}'", numOfVms, vdsId);
}
}
@Override
protected void gatherChangedVms(VmDynamic dbVm, VdsmVm vdsmVm) {
changedVms.add(new Pair<>(dbVm, vdsmVm));
if (log.isDebugEnabled()) {
logBuilder.append(String.format("%s:%s ",
vdsmVm.getVmDynamic().getId().toString().substring(0, 8),
vdsmVm.getVmDynamic().getStatus()));
}
}
}