package rocks.inspectit.agent.java.sensor.platform.provider.util;
/**
* This class is used to calculate the cpu usage of the underlying Virtual Machine.
*
* @author Eduard Tudenhoefner
*
*/
public class CpuUsageCalculator {
/**
* The uptime.
*/
private long uptime = -1L;
/**
* The process cpu time.
*/
private long processCpuTime = -1L;
/**
* The available processors.
*/
private int availableProcessors = 0;
/**
* The previous uptime of the Virtual Machine.
*/
private long prevUptime = 0L;
/**
* The previous processCpuTime.
*/
private long prevProcessCpuTime = 0L;
/**
* The cpu usage.
*/
private float cpuUsage = 0.0F;
/**
* Gets {@link #cpuUsage}.
*
* @return {@link #cpuUsage}
*/
public float getCpuUsage() {
return cpuUsage;
}
/**
* Sets {@link #uptime}.
*
* @param uptime
* New value for {@link #uptime}
*/
public void setUptime(long uptime) {
this.uptime = uptime;
}
/**
* Sets {@link #processCpuTime}.
*
* @param processCpuTime
* New value for {@link #processCpuTime}
*/
public void setProcessCpuTime(long processCpuTime) {
this.processCpuTime = processCpuTime;
}
/**
* Sets {@link #availableProcessors}.
*
* @param availableProcessors
* New value for {@link #availableProcessors}
*/
public void setAvailableProcessors(int availableProcessors) {
this.availableProcessors = availableProcessors;
}
/**
* Calculates the current cpuUsage in percent.
*
* elapsedCpu is in ns and elapsedTime is in ms. cpuUsage could go higher than 100% because
* elapsedTime and elapsedCpu are not fetched simultaneously. Limit to 99% to avoid showing a
* scale from 0% to 200%.
*
*/
public void updateCpuUsage() {
if ((prevUptime > 0L) && (this.uptime > prevUptime)) {
long elapsedCpu = this.processCpuTime - prevProcessCpuTime;
long elapsedTime = this.uptime - prevUptime;
cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * this.availableProcessors));
}
this.prevUptime = this.uptime;
this.prevProcessCpuTime = this.processCpuTime;
}
}