package org.ovirt.engine.core.common.businessentities; import java.util.ArrayList; import java.util.List; import java.util.Objects; import org.ovirt.engine.core.common.businessentities.comparators.BusinessEntityComparator; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Guid; public class VmStatistics implements BusinessEntity<Guid>, Comparable<VmStatistics> { private static final long serialVersionUID = -7480866662740734452L; private List<Integer> memoryUsageHistory; private List<Integer> cpuUsageHistory; private List<Integer> networkUsageHistory; private Double cpuSys; private Double cpuUser; private Double elapsedTime; private Double roundedElapsedTime; private Integer usageMemPercent; private Integer migrationProgressPercent; private String disksUsage; private Integer usageNetworkPercent; private Guid vmId; private Integer usageCpuPercent; private Long guestMemoryCached; private Long guestMemoryBuffered; private Long guestMemoryFree; public VmStatistics() { cpuSys = 0.0; cpuUser = 0.0; elapsedTime = 0.0; roundedElapsedTime = 0.0; vmId = Guid.Empty; } public VmStatistics(Guid vmId) { this(); this.vmId = vmId; } @Override public int hashCode() { return Objects.hash( cpuSys, cpuUser, elapsedTime, roundedElapsedTime, usageCpuPercent, usageMemPercent, usageNetworkPercent, migrationProgressPercent, disksUsage, vmId, cpuUsageHistory, networkUsageHistory, memoryUsageHistory, guestMemoryFree, guestMemoryBuffered, guestMemoryCached ); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof VmStatistics)) { return false; } VmStatistics other = (VmStatistics) obj; return Objects.equals(cpuSys, other.cpuSys) && Objects.equals(cpuUser, other.cpuUser) && Objects.equals(elapsedTime, other.elapsedTime) && Objects.equals(roundedElapsedTime, other.roundedElapsedTime) && Objects.equals(usageCpuPercent, other.usageCpuPercent) && Objects.equals(usageMemPercent, other.usageMemPercent) && Objects.equals(migrationProgressPercent, other.migrationProgressPercent) && Objects.equals(usageNetworkPercent, other.usageNetworkPercent) && Objects.equals(disksUsage, other.disksUsage) && Objects.equals(vmId, other.vmId) && Objects.equals(cpuUsageHistory, other.cpuUsageHistory) && Objects.equals(networkUsageHistory, other.networkUsageHistory) && Objects.equals(memoryUsageHistory, other.memoryUsageHistory) && Objects.equals(guestMemoryBuffered, other.guestMemoryBuffered) && Objects.equals(guestMemoryCached, other.guestMemoryCached) && Objects.equals(guestMemoryFree, other.guestMemoryFree); } public Double getCpuSys() { return this.cpuSys; } public void setCpuSys(Double cpuSys) { this.cpuSys = cpuSys; } public Double getCpuUser() { return this.cpuUser; } public void setCpuUser(Double cpuUser) { this.cpuUser = cpuUser; } public Double getElapsedTime() { return this.elapsedTime; } public void setElapsedTime(Double elapsedTime) { this.elapsedTime = elapsedTime; setRoundedElapsedTime(elapsedTime); } public Double getRoundedElapsedTime() { return this.roundedElapsedTime; } public void setRoundedElapsedTime(Double value) { final int SEC_IN_MIN = 60; final int SEC_IN_HOUR = SEC_IN_MIN * 60; final int SEC_IN_DAY = SEC_IN_HOUR * 24; this.roundedElapsedTime = value; if (value != null) { if (getRoundedElapsedTime() == null) { this.setRoundedElapsedTime(value); } else { // Notify each Min until 1 Hour,each Hour until 1 Day and from then on every day. int val = value.intValue(); int lastVal = getRoundedElapsedTime().intValue(); if ((val > 0 && val < SEC_IN_MIN && val / SEC_IN_MIN > lastVal / SEC_IN_MIN) || (val >= SEC_IN_HOUR && val < SEC_IN_DAY && val / SEC_IN_HOUR > lastVal / SEC_IN_HOUR) || (val / SEC_IN_DAY > lastVal / SEC_IN_DAY)) { this.setRoundedElapsedTime(value); } } } } public Integer getUsageCpuPercent() { return this.usageCpuPercent; } public void setUsageCpuPercent(Integer usageCpuPercent) { this.usageCpuPercent = usageCpuPercent; } public Integer getUsageMemPercent() { return this.usageMemPercent; } public void setUsageMemPercent(Integer usageMemPercent) { this.usageMemPercent = usageMemPercent; } public Integer getMigrationProgressPercent() { return migrationProgressPercent; } public void setMigrationProgressPercent(Integer migrationProgressPercent) { this.migrationProgressPercent = migrationProgressPercent; } /** * Field for history db, not intended to be accessible to clients. */ public String getDisksUsage() { return disksUsage; } public void setDisksUsage(String disksUsage) { this.disksUsage = disksUsage; } public Integer getUsageNetworkPercent() { return this.usageNetworkPercent; } public void setUsageNetworkPercent(Integer usageNetworkPercent) { this.usageNetworkPercent = usageNetworkPercent; } @Override public Guid getId() { return vmId; } @Override public void setId(Guid id) { this.vmId = id; } @Override public int compareTo(VmStatistics o) { return BusinessEntityComparator.<VmStatistics, Guid>newInstance().compare(this, o); } public List<Integer> getMemoryUsageHistory() { return memoryUsageHistory; } public void addMemoryUsageHistory(Integer memoryUsageHistory, int limit) { this.memoryUsageHistory = addToHistory(this.memoryUsageHistory, memoryUsageHistory, limit); } public List<Integer> getCpuUsageHistory() { return cpuUsageHistory; } public void addCpuUsageHistory(Integer cpuUsageHistory, int limit) { this.cpuUsageHistory = addToHistory(this.cpuUsageHistory, cpuUsageHistory, limit); } public List<Integer> getNetworkUsageHistory() { return networkUsageHistory; } public void addNetworkUsageHistory(Integer networkUsageHistory, int limit) { this.networkUsageHistory = addToHistory(this.networkUsageHistory, networkUsageHistory, limit); } public void setMemoryUsageHistory(List<Integer> memoryUsageHistory) { this.memoryUsageHistory = memoryUsageHistory; } public void setCpuUsageHistory(List<Integer> cpuUsageHistory) { this.cpuUsageHistory = cpuUsageHistory; } public void setNetworkUsageHistory(List<Integer> networkUsageHistory) { this.networkUsageHistory = networkUsageHistory; } List<Integer> addToHistory(List<Integer> current, Integer newValue, int limit) { if (newValue == null) { return current; } if (limit == 0) { return new ArrayList<>(0); } if (current == null || current.isEmpty()) { List<Integer> res = new ArrayList<>(); res.add(newValue); return res; } List<Integer> res = new ArrayList<>(current); res.add(newValue); if (limit >= res.size()) { return res; } return new ArrayList<>(res.subList(res.size() - limit, res.size())); } public Long getGuestMemoryCached() { return guestMemoryCached; } public void setGuestMemoryCached(Long guestMemoryCached) { this.guestMemoryCached = guestMemoryCached; } public Long getGuestMemoryBuffered() { return guestMemoryBuffered; } public void setGuestMemoryBuffered(Long guestMemoryBuffered) { this.guestMemoryBuffered = guestMemoryBuffered; } public Long getGuestMemoryFree() { return guestMemoryFree; } public void setGuestMemoryFree(Long guestMemoryFree) { this.guestMemoryFree = guestMemoryFree; } /** * Update data that was received from VDSM * @param vmStatistics - the reported statistics from VDSM * @param vm - the static part of the VM for which the statistics belong */ public void updateRuntimeData(VmStatistics vmStatistics, int numOfCpus, boolean updateMigrationProgress) { Integer usageHistoryLimit = Config.getValue(ConfigValues.UsageHistoryLimit); setElapsedTime(vmStatistics.getElapsedTime()); setDisksUsage(vmStatistics.getDisksUsage()); // -------- cpu -------------- setCpuSys(vmStatistics.getCpuSys()); setCpuUser(vmStatistics.getCpuUser()); if ((getCpuSys() != null) && (getCpuUser() != null)) { Double percent = (getCpuSys() + getCpuUser()) / numOfCpus; setUsageCpuPercent(percent.intValue()); if (getUsageCpuPercent() != null && getUsageCpuPercent() > 100) { setUsageCpuPercent(100); } } addCpuUsageHistory(getUsageCpuPercent(), usageHistoryLimit); // -------- memory -------------- setUsageMemPercent(vmStatistics.getUsageMemPercent()); addMemoryUsageHistory(getUsageMemPercent(), usageHistoryLimit); setGuestMemoryBuffered(vmStatistics.getGuestMemoryBuffered()); setGuestMemoryCached(vmStatistics.getGuestMemoryCached()); setGuestMemoryFree(vmStatistics.getGuestMemoryFree()); // -------- migration -------------- if (updateMigrationProgress) { setMigrationProgressPercent(vmStatistics.getMigrationProgressPercent()); } } }