/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.wisdom.monitor.extensions.dashboard;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricSet;
import com.google.common.collect.ImmutableMap;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.util.Map;
/**
* Some information about the running system.
*/
public class CpuGaugeSet implements MetricSet {
/**
* The key to retrieve the number of processor.
*/
public static final String PROCESSORS = "processors";
/**
* The key to retrieve the system load.
*/
public static final String SYSTEM_LOAD_AVERAGE = "systemLoadAverage";
/**
* The key to retrieve the CPU system load.
*/
public static final String CPU_SYSTEM_LOAD = "cpuSystemLoad";
/**
* The key to retrieve the CPU process load.
*/
public static final String CPU_PROCESS_LOAD = "cpuProcessLoad";
/**
* The key to retrieve the CPU process time.
*/
public static final String CPU_PROCESS_TIME = "cpuProcessTime";
private OperatingSystemMXBean bean = ManagementFactory.getOperatingSystemMXBean();
/**
* @return the CPU metrics. The returned map contains the following metrics: number of processors,
* average system load, CPU system load, CPU process load, and Process CPU time. These values are retrieved using
* JMX and in particular the Sun's implementation of the OperatingSystemMXBean MBean. This bean is not necessarily
* available. In this case {@literal -1} is returned.
*/
public Map<String, Metric> getMetrics() {
return ImmutableMap.<String, Metric>of(
PROCESSORS, new Gauge<Integer>() {
/**
* @return the number of processor.
*/
public Integer getValue() {
return bean.getAvailableProcessors();
}
},
SYSTEM_LOAD_AVERAGE, new Gauge<Double>() {
/**
* @return the average system load.
*/
public Double getValue() {
return bean.getSystemLoadAverage();
}
},
CPU_SYSTEM_LOAD, new Gauge<Double>() {
/**
* @return the system CPU load.
*/
public Double getValue() {
return getSystemCpuLoad();
}
},
CPU_PROCESS_LOAD, new Gauge<Double>() {
/**
* @return the process CPU load.
*/
public Double getValue() {
return getCpuProcessLoad();
}
},
CPU_PROCESS_TIME, new Gauge<Long>() {
/**
* @return the process CPU load.
*/
public Long getValue() {
return getCpuTime();
}
}
);
}
/**
* This method uses a Sun specific class (implementation of the Operating System MX Bean.
* @return the CPU system load, or {@literal -1.0} if not available.
*/
private Double getSystemCpuLoad() {
if (bean instanceof com.sun.management.OperatingSystemMXBean) { //NOSONAR
return ((com.sun.management.OperatingSystemMXBean) bean).getSystemCpuLoad() * 100.0; //NOSONAR
} else {
return -1.0;
}
}
/**
* This method uses a Sun specific class (implementation of the Operating System MX Bean.
* @return the CPU process load, or {@literal -1.0} if not available.
*/
private Double getCpuProcessLoad() {
if (bean instanceof com.sun.management.OperatingSystemMXBean) { //NOSONAR
return ((com.sun.management.OperatingSystemMXBean) bean).getProcessCpuLoad() * 100.0; //NOSONAR
} else {
return -1.0;
}
}
/**
* This method uses a Sun specific class (implementation of the Operating System MX Bean.
* @return the CPU process time, or {@literal -1L} if not available.
*/
private Long getCpuTime() {
if (bean instanceof com.sun.management.OperatingSystemMXBean) { //NOSONAR
return ((com.sun.management.OperatingSystemMXBean) bean).getProcessCpuTime(); //NOSONAR
} else {
return -1L;
}
}
}