package com.vmware.springsource.hyperic.plugin.gemfire.collectors; import com.vmware.springsource.hyperic.plugin.gemfire.GemFireUtils; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.management.MBeanServerConnection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperic.hq.product.Collector; import org.hyperic.hq.product.PluginException; import org.hyperic.hq.product.jmx.MxUtil; public class MemberCollector extends Collector { static Log log = LogFactory.getLog(MemberCollector.class); @Override protected void init() throws PluginException { Properties props = getProperties(); log.debug("[init] props=" + props); super.init(); } @Override public void collect() { Properties props = getProperties(); try { MBeanServerConnection mServer = MxUtil.getMBeanServer(props); String memberID = GemFireUtils.memberNameToMemberID(props.getProperty("member.name"), mServer); addValues(getMetrics(memberID, mServer, false)); setAvailability(true); } catch (Exception ex) { setAvailability(false); log.debug("[collect] " + ex.getMessage(), ex); } } private static final int prefixLength = "gemfire.member.".length(); public static Map getMetrics(String memberID, MBeanServerConnection mServer, boolean hqu) throws PluginException { Map res = new java.util.HashMap<String, Object>(); Map<String, Object> memberDetails = GemFireUtils.getMemberDetails(memberID, mServer); for (String k : memberDetails.keySet()) { res.put(k.substring(prefixLength, k.lastIndexOf('.')), memberDetails.get(k)); if (log.isDebugEnabled()) { log.debug("[getMetrics] " + k + "=" + memberDetails.get(k)); } } Long max = ((Long) res.get("stat.maxmemory")); Long used = ((Long) res.get("stat.usedmemory")); if ((max != null) && (used != null)) { res.put("used_memory", ((double) used / (double) max)); } if (res.get("stat.processcputime") != null) { res.put("used_cpu", calcCPU(res, memberID, hqu)); } res.put("uptime", ((Long) res.get("uptime")) / 1000); res.put("nclients", ((Map) res.get("clients")).size()); return res; } static Map cpu_cache = new HashMap(); private static double calcCPU(Map metrics, String memberID, boolean hqu) { double cpu = 0; String cacheKey = (hqu ? "hqu_" : "") + memberID; long last_cpu = ((Long) metrics.get("stat.processcputime") / 1000000); long last_time = System.currentTimeMillis(); CPUCacheEntry c_entry = (CPUCacheEntry) cpu_cache.get(cacheKey); if (c_entry != null) { long prev_cpu = c_entry.cpuTime; long prev_time = c_entry.time; int cpus = (Integer) metrics.get("stat.cpus"); cpu = (double) (last_cpu - prev_cpu) / (double) ((last_time - prev_time) * cpus); if (log.isDebugEnabled()) { log.debug("[calcCPU] cacheKey=" + cacheKey + " prev_cpu=" + prev_cpu + " last_cpu=" + last_cpu + " prev_time=" + prev_time + " last_time=" + last_time + " cpus=" + cpus); log.debug("[calcCPU] " + (last_cpu - prev_cpu) + "/" + ((last_time - prev_time) * cpus) + " cpu=" + cpu); } } else { c_entry = new CPUCacheEntry(); } c_entry.cpuTime = last_cpu; c_entry.time = last_time; cpu_cache.put(cacheKey, c_entry); return cpu; } private static class CPUCacheEntry { long cpuTime = 0, time = 0; } }