package org.stagemonitor.os.metrics; import static org.stagemonitor.core.metrics.metrics2.MetricName.name; import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.util.HashMap; import java.util.Map; import com.codahale.metrics.Gauge; import com.codahale.metrics.Metric; import org.hyperic.sigar.CpuInfo; import org.hyperic.sigar.CpuPerc; import org.hyperic.sigar.Sigar; import org.hyperic.sigar.SigarException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.stagemonitor.core.metrics.metrics2.MetricName; public class CpuMetricSet extends AbstractSigarMetricSet<CpuPerc> { private final Logger logger = LoggerFactory.getLogger(getClass()); private final CpuInfo cpuInfo; public CpuMetricSet(Sigar sigar, CpuInfo cpuInfo) throws SigarException { super(sigar); this.cpuInfo = cpuInfo; } @Override CpuPerc loadSnapshot(Sigar sigar) throws SigarException { return sigar.getCpuPerc(); } @Override public Map<MetricName, Metric> getMetrics() { Map<MetricName, Metric> metrics = new HashMap<MetricName, Metric>(); metrics.put(name("cpu_usage").type("sys").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getSys() * 100.0; } }); metrics.put(name("cpu_usage").type("user").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getUser() * 100.0; } }); metrics.put(name("cpu_usage").type("idle").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getIdle() * 100.0; } }); metrics.put(name("cpu_usage").type("nice").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getNice() * 100.0; } }); metrics.put(name("cpu_usage").type("wait").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getWait() * 100.0; } }); metrics.put(name("cpu_usage").type("interrupt").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getIrq() * 100.0; } }); metrics.put(name("cpu_usage").type("soft-interrupt").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getSoftIrq() * 100.0; } }); metrics.put(name("cpu_usage").type("stolen").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getStolen() * 100.0; } }); metrics.put(name("cpu_usage_percent").build(), new Gauge<Double>() { @Override public Double getValue() { return getSnapshot().getCombined() * 100.0; } }); metrics.put(name("cpu_info_mhz").build(), new Gauge<Integer>() { @Override public Integer getValue() { return cpuInfo.getMhz(); } }); metrics.put(name("cpu_info_cores").build(), new Gauge<Integer>() { @Override public Integer getValue() { return cpuInfo.getTotalCores(); } }); if (cpuInfo.getCacheSize() != Sigar.FIELD_NOTIMPL) { metrics.put(name("cpu_info_cache").build(), new Gauge<Long>() { @Override public Long getValue() { return cpuInfo.getCacheSize(); } }); } try { final OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.newPlatformMXBeanProxy( ManagementFactory.getPlatformMBeanServer(), ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class); if (operatingSystemMXBean.getSystemLoadAverage() >= 0) { metrics.put(name("cpu_queueLength").build(), new Gauge<Double>() { @Override public Double getValue() { return Math.max(0.0, operatingSystemMXBean.getSystemLoadAverage() - operatingSystemMXBean.getAvailableProcessors()); } }); metrics.put(name("cpu_load").tag("timeframe", "1m").build(), new Gauge<Double>() { @Override public Double getValue() { return operatingSystemMXBean.getSystemLoadAverage(); } }); } } catch (IOException e) { logger.warn(e.getMessage() + " (this exception is ignored)", e); } return metrics; } }