package org.ovirt.engine.ui.frontend.server.dashboard.dao;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.ovirt.engine.ui.frontend.server.dashboard.DashboardDataException;
import org.ovirt.engine.ui.frontend.server.dashboard.models.ResourceUsage;
import org.ovirt.engine.ui.frontend.server.dashboard.models.ResourcesTotal;
import org.ovirt.engine.ui.frontend.server.dashboard.models.TrendResources;
public class HostDwhDao extends BaseDao {
private static final String CPU = "cpu_"; //$NON-NLS-1$
private static final String MEM = "mem_"; //$NON-NLS-1$
private static final String DATE = "the_date"; //$NON-NLS-1$
private static final String USAGE = "avg"; //$NON-NLS-1$
private static final String MEM_USAGE = MEM + USAGE;
private static final String CPU_USAGE = CPU + USAGE;
private static final String TOTAL = "total"; //$NON-NLS-1$
private static final String MEM_TOTAL = MEM + TOTAL;
private static final String CPU_TOTAL = CPU + TOTAL;
private static final String NAME="name"; //$NON-NLS-1$
private static final String CPU_USAGE_PERCENT = "cpu_usage_percent"; //$NON-NLS-1$
private static final String CORES_HOST = "number_of_cores"; //$NON-NLS-1$
private static final String PREVIOUS_CPU_PERCENT = "previous_cpu_percent"; //$NON-NLS-1$
private static final String MEMORY_USAGE_PERCENT = "memory_usage_percent"; //$NON-NLS-1$
private static final String PREVIOUS_MEMORY_PERCENT = "previous_memory_percent"; //$NON-NLS-1$
private static final String MEMORY_SIZE = "memory_size_mb"; //$NON-NLS-1$
private static final String HOURLY_CPU_MEM_HISTORY = "host.hourly_cpu_mem_history"; //$NON-NLS-1$
private static final String LAST5_MIN_CPU_MEM_AVERAGE = "host.last_5_min_cpu_mem_average"; //$NON-NLS-1$
private static final String TOTAL_CPU_MEMORY_COUNT = "host.total_cpu_memory_count"; //$NON-NLS-1$
private static final String CPU_HOST_UTILIZATION = "host.cpu_host_utilization"; //$NON-NLS-1$
private static final String MEM_HOST_UTILIZATION = "host.mem_host_utilization"; //$NON-NLS-1$
public HostDwhDao(DataSource dwhDataSource) throws DashboardDataException {
super(dwhDataSource, "HostDwhDAO.properties", HostDwhDao.class); //$NON-NLS-1$
}
public List<ResourceUsage> getHourlyCpuMemUsage() throws DashboardDataException {
final List<ResourceUsage> result = new ArrayList<>();
runQuery(HOURLY_CPU_MEM_HISTORY, rs -> {
ResourceUsage resourceUsage = new ResourceUsage();
resourceUsage.setEpoch(rs.getTimestamp(DATE).getTime());
resourceUsage.setCpuValue(rs.getDouble(CPU_USAGE));
resourceUsage.setMemValue(rs.getDouble(MEM_USAGE));
result.add(resourceUsage);
});
return result;
}
public ResourceUsage getLast5MinCpuMemUsage() throws DashboardDataException {
final ResourceUsage result = new ResourceUsage();
runQuery(LAST5_MIN_CPU_MEM_AVERAGE, rs -> {
result.setCpuValue(rs.getDouble(CPU_USAGE));
result.setMemValue(rs.getDouble(MEM_USAGE));
});
return result;
}
public ResourcesTotal getTotalCpuMemCount() throws DashboardDataException {
final ResourcesTotal result = new ResourcesTotal();
runQuery(TOTAL_CPU_MEMORY_COUNT, rs -> {
result.setCpuTotal(rs.getInt(CPU_TOTAL));
result.setMemTotal(rs.getDouble(MEM_TOTAL));
});
return result;
}
/**
* Get the CPU utilization for the last 5 minutes per host. Also retrieve the previous 5 minutes before that,
* so we can calculate a trend. Usage in returned in percentages. Top 10 are returned.
* @return List of {@code TrendResources} objects containing cpu usage of each host.
* @throws DashboardDataException If there is a database problem.
*/
public List<TrendResources> getCpuUtilizationHosts() throws DashboardDataException {
final List<TrendResources> result = new ArrayList<>();
runQuery(CPU_HOST_UTILIZATION, rs -> {
TrendResources usage = new TrendResources();
usage.setName(rs.getString(NAME));
usage.setUsed(rs.getDouble(CPU_USAGE_PERCENT));
usage.setTotal(rs.getDouble(CORES_HOST));
usage.setPreviousUsed(rs.getDouble(PREVIOUS_CPU_PERCENT));
result.add(usage);
});
return result;
}
/**
* Get memory utilization for the last 5 minutes per host. Also retrieve the previous 5 minute before that, so
* we can calculate a trend. Memory is returned in MB. Top 10 are returned
* @return List of {@code TrendResources} objects containing memory usage of each host.
* @throws DashboardDataException If there is a database problem.
*/
public List<TrendResources> getMemoryUtilizationHosts() throws DashboardDataException {
final List<TrendResources> result = new ArrayList<>();
runQuery(MEM_HOST_UTILIZATION, rs -> {
TrendResources usage = new TrendResources();
usage.setName(rs.getString(NAME));
usage.setUsed(rs.getDouble(MEMORY_USAGE_PERCENT) * rs.getDouble(MEMORY_SIZE) / 100);
usage.setTotal(rs.getDouble(MEMORY_SIZE));
usage.setPreviousUsed(rs.getDouble(PREVIOUS_MEMORY_PERCENT) * rs.getDouble(MEMORY_SIZE) / 100);
result.add(usage);
});
return result;
}
}