/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.monitoring.system.api.model; import java.io.Serializable; import java.util.List; import de.rcenvironment.core.monitoring.system.internal.SystemMonitoringUtils; /** * The complete model which holds monitoring data. * * @author David Scholz * @author Robert Mischke */ public class FullSystemAndProcessDataSnapshot implements Serializable { private static final long serialVersionUID = 4316060053937251752L; private double totalNodeCPUusage; private double systemIdle; private long totalNodeRAMUsage; private long totalNodeSystemRAM; private List<ProcessInformation> rceSubProcesses; private List<ProcessInformation> rceOwnProcesses; public FullSystemAndProcessDataSnapshot(double totalNodeCPUusage, long totalNodeRAMUsage, long totalNodeSystemRAM, double systemIdle, List<ProcessInformation> rceSubProcesses, List<ProcessInformation> rceOwnProcesses) { this.totalNodeCPUusage = totalNodeCPUusage; this.totalNodeRAMUsage = totalNodeRAMUsage; this.totalNodeSystemRAM = totalNodeSystemRAM; this.systemIdle = systemIdle; this.rceSubProcesses = rceSubProcesses; this.rceOwnProcesses = rceOwnProcesses; } /** * Get rce sub processes. Returns null if list is empty. * * @return rce sub processes. */ public List<ProcessInformation> getRceSubProcesses() { return rceSubProcesses; } /** * Get rce entities. * * @return rce entities. */ public List<ProcessInformation> getRceProcessesInfo() { return rceOwnProcesses; } public double getNodeCPUusage() { return totalNodeCPUusage; } public long getNodeRAMUsage() { return totalNodeRAMUsage; } public long getNodeSystemRAM() { return totalNodeSystemRAM; } public double getIdle() { return systemIdle; } /** * Get total rce cpu usage. * * @return rce cpu usage. */ public double getTotalRceOwnProcessesCpuUsage() { double usage = 0; for (ProcessInformation pinf : rceOwnProcesses) { usage += pinf.getCpuUsage(); } return usage; } /** * Get total rce ram usage. * * @return rce ram usage. */ public long getTotalRceOwnProcessesRamUsage() { long usage = 0; for (ProcessInformation pinf : rceOwnProcesses) { usage += pinf.getRamUsage(); } return usage; } /** * Get total cpu usage of children. * * @return children cpu usage. */ public double getTotalSubProcessesCpuUsage() { return calcTotalChildrenCpuUsage(rceSubProcesses); } private double calcTotalChildrenCpuUsage(List<ProcessInformation> list) { double usage = 0; for (ProcessInformation info : list) { usage += info.getCpuUsage() + calcTotalChildrenCpuUsage(info.getChildren()); } return usage; } /** * Get total cpu usage of all other processes. * * @return cpu usage of other processes. */ public double getOtherProcessCpuUsage() { // TODO check: this was totalNodeCPUusage - getTotalRceOwnProcessesCpuUsage() before, but that seemed semantically wrong? - misc_ro // TODO this recomputes the other values; cache them instead return SystemMonitoringUtils.clampToPercentageOrNAN(totalNodeCPUusage - getTotalRceOwnProcessesCpuUsage() - getTotalSubProcessesCpuUsage()); } @Override public int hashCode() { final int prime = 31; final int i = 32; int result = 1; if (rceOwnProcesses == null) { result = prime * result; } else { result = prime * result + rceOwnProcesses.hashCode(); } if (rceSubProcesses == null) { result = prime * result; } else { result = prime * result + rceSubProcesses.hashCode(); } long temp; temp = Double.doubleToLongBits(systemIdle); result = prime * result + (int) (temp ^ (temp >>> i)); temp = Double.doubleToLongBits(totalNodeCPUusage); result = prime * result + (int) (temp ^ (temp >>> i)); result = prime * result + (int) (totalNodeRAMUsage ^ (totalNodeRAMUsage >>> i)); result = prime * result + (int) (totalNodeSystemRAM ^ (totalNodeSystemRAM >>> i)); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } FullSystemAndProcessDataSnapshot other = (FullSystemAndProcessDataSnapshot) obj; if (rceOwnProcesses == null) { if (other.rceOwnProcesses != null) { return false; } } else if (!rceOwnProcesses.equals(other.rceOwnProcesses)) { return false; } if (rceSubProcesses == null) { if (other.rceSubProcesses != null) { return false; } } else if (!rceSubProcesses.equals(other.rceSubProcesses)) { return false; } if (Double.doubleToLongBits(systemIdle) != Double.doubleToLongBits(other.systemIdle)) { return false; } if (Double.doubleToLongBits(totalNodeCPUusage) != Double.doubleToLongBits(other.totalNodeCPUusage)) { return false; } if (totalNodeRAMUsage != other.totalNodeRAMUsage) { return false; } if (totalNodeSystemRAM != other.totalNodeSystemRAM) { return false; } return true; } @Override public String toString() { final String newLine = "\n"; final String percent = "%"; final double maxCPU = 100; final double totalRceUsage = getTotalRceOwnProcessesCpuUsage(); final double totalChildUsage = getTotalSubProcessesCpuUsage(); final double idle = getIdle(); StringBuilder sb = new StringBuilder(); sb.append("Total node cpu usage: " + totalNodeCPUusage + newLine); sb.append("Total node ram: " + totalNodeSystemRAM + newLine); sb.append("Total used ram: " + totalNodeRAMUsage + newLine); sb.append("RCE cpu usage: " + totalRceUsage + percent + newLine); sb.append("RCE Sub-Processes: " + totalChildUsage + percent + newLine); for (ProcessInformation child : rceSubProcesses) { sb.append(child.toString()); } sb.append("System Idle: " + idle + percent + newLine); sb.append("Other processes: " + (maxCPU - totalRceUsage - totalChildUsage - idle) + percent + newLine); return sb.toString(); } }