package org.kie.perf.metrics;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.MetricSet;
import com.codahale.metrics.UniformReservoir;
public class CPUUsageHistogramSet implements MetricSet {
private Class<?> scenario;
private Histogram cpuUsageHistogram = new Histogram(new UniformReservoir());
private OperatingSystemMXBean operatingSystemMXBean;
private Method getProcessCpuLoad;
private Timer timer = new Timer();
private static CPUUsageHistogramSet instance = null;
private CPUUsageHistogramSet(Class<?> scenario) {
this.scenario = scenario;
operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
try {
getProcessCpuLoad = operatingSystemMXBean.getClass().getMethod("getProcessCpuLoad");
getProcessCpuLoad.setAccessible(true);
} catch (Exception e) {
}
}
public static CPUUsageHistogramSet getInstance(Class<?> scenario) {
if (instance == null) {
instance = new CPUUsageHistogramSet(scenario);
}
return instance;
}
private void update() {
Double value = null;
try {
if (getProcessCpuLoad != null && operatingSystemMXBean != null) {
value = (Double) getProcessCpuLoad.invoke(operatingSystemMXBean);
value *= 100;
}
} catch (Exception e) {
e.printStackTrace();
}
if (value != null) {
long cpu = Math.round(value);
cpuUsageHistogram.update(cpu);
}
}
public void start() {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
update();
}
}, 100, 200);
}
public void stop() {
timer.cancel();
}
@Override
public Map<String, Metric> getMetrics() {
final Map<String, Metric> metrics = new HashMap<String, Metric>();
if (getProcessCpuLoad != null && operatingSystemMXBean != null) {
metrics.put(MetricRegistry.name(scenario, "cpu.usage"), cpuUsageHistogram);
}
return metrics;
}
}