CollCassandraWithJMX.java 9.84 KB
package com.sitech.ismp.coll.database;

import com.sitech.ismp.coll.CollBase;
import com.sitech.ismp.coll.basic.TblATO_KPIDETAIL;
import com.sitech.util.DES3;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

/**
 * Created with IntelliJ IDEA.
 * User: AMCC
 * Date: 15-6-10
 * Time: 下午2:31
 * To change this template use File | Settings | File Templates.
 */
public class CollCassandraWithJMX extends CollBase {

    private final String PRE_UNITID = "10-41-14"; // Cassamdra的标识

    private String deviceName = "";
    MBeanServerConnection mbsc = null;
    JMXConnector connector = null;

    public void init(HashMap<String, String> params) {
        try {
            String collIp = (String) params.get("COLLIP");
            String jmxPort = (String) params.get("JMXPORT");
            String user = (String) params.get("COLLUSER");
//        String password = (String) params.get("COLLPASSWORD");
            String password = DES3.decrypt(params.get("COLLPASSWORD"));
            deviceName = (String) params.get("DEVICENAME");
            String jmxURL = "service:jmx:rmi:///jndi/rmi://" + collIp + ":" + jmxPort + "/jmxrmi";//tomcat jmx url
            logger.info("jmxURL=" + jmxURL);
            JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
            Map map = new HashMap();
            String[] credentials = new String[]{user, password};
            map.put("jmx.remote.credentials", credentials);
            connector = JMXConnectorFactory.connect(serviceURL, map);
            mbsc = connector.getMBeanServerConnection();
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
        }
    }

    /**
     * 采集内存使用指标
     *
     * @param params
     * @return
     */

    public Vector getMemory(HashMap params) {
        logger.info("begin getMemory");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            init(params);
            ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
            CompositeDataSupport heapMemoryUsage = (CompositeDataSupport) mbsc.getAttribute(heapObjName, "HeapMemoryUsage");
            long maxMemory = ((Long) heapMemoryUsage.get("max")).longValue() / (1024 * 1024); //堆最大
            long commitMemory = ((Long) heapMemoryUsage.get("committed")).longValue() / (1024 * 1024); //堆当前分配
            long usedMemory = ((Long) heapMemoryUsage.get("used")).longValue() / (1024 * 1024); //当前使用的
            double heapUsage = (double) usedMemory * 100 / commitMemory; //堆使用率
            String unitId = PRE_UNITID + "-11:" + deviceName + "-memory";
            // PM-41-02-001-04 堆当前分配
            collResult.addKPI(unitId, "PM-41-02-001-04", String.valueOf(commitMemory));
            // PM-41-02-001-03 允许支配的内存堆
            collResult.addKPI(unitId, "PM-41-02-001-03", String.valueOf(maxMemory));
            // PM-41-02-001-05 当前使用的内存堆
            collResult.addKPI(unitId, "PM-41-02-001-05", String.valueOf(usedMemory));
            // PM-41-02-001-19 堆使用率
            collResult.addKPI(unitId, "PM-41-02-001-19", String.valueOf(heapUsage));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                connector.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return collResult.getKPISet();
    }

    /**
     * 采集即时状态指标
     *
     * @param params
     * @return
     */
    public Vector getStorageProxy(HashMap params) {
        logger.info("begin getStorageService");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            init(params);
            ObjectName storageProxyObjName = new ObjectName("org.apache.cassandra.db:type=StorageProxy");
            String readOperations = mbsc.getAttribute(storageProxyObjName, "ReadOperations").toString();
            String writeOperations = mbsc.getAttribute(storageProxyObjName, "WriteOperations").toString();
            String totalReadLatencyMicros = mbsc.getAttribute(storageProxyObjName, "TotalReadLatencyMicros").toString();
            String totalWriteLatencyMicros = mbsc.getAttribute(storageProxyObjName, "TotalWriteLatencyMicros").toString();

            String unitId = PRE_UNITID + "-14:" + deviceName + "-proxy";
            // PM-41-02-001-10 即时读次数
            collResult.addKPI(unitId, "PM-41-02-001-10", readOperations);
            // PM-41-02-001-11 即时写次数
            collResult.addKPI(unitId, "PM-41-02-001-11", writeOperations);
            // PM-41-02-001-14 即时读延迟
            collResult.addKPI(unitId, "PM-41-02-001-14", totalReadLatencyMicros);
            // PM-41-02-001-15 即时写延迟
            collResult.addKPI(unitId, "PM-41-02-001-15", totalWriteLatencyMicros);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                connector.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return collResult.getKPISet();
    }

    /**
     * 采集操作系统指标
     *
     * @param params
     * @return
     */
    public Vector getOperatingSystem(HashMap params) {
        logger.info("begin getStorageService");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            init(params);
            ObjectName storageSystemObjName = new ObjectName("java.lang:type=OperatingSystem");
            String processCpuTime = mbsc.getAttribute(storageSystemObjName, "ProcessCpuTime").toString();
            String availableProcessors = mbsc.getAttribute(storageSystemObjName, "AvailableProcessors").toString();
            String unitId = PRE_UNITID + "-10:" + deviceName + "-system";
            // PM-41-02-001-01 进CPU使用时间
            collResult.addKPI(unitId, "PM-41-02-001-01", processCpuTime);
            // PM-41-02-001-02 CPU可用进程
            collResult.addKPI(unitId, "PM-41-02-001-02", availableProcessors);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                connector.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return collResult.getKPISet();
    }

    /**
     * 采集存储服务指标
     *
     * @param params
     * @return
     */
    public Vector getStorageService(HashMap params) {
        logger.info("begin getStorageService");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            init(params);
            ObjectName storageserviceObjName = new ObjectName("org.apache.cassandra.db:type=StorageService");
            String liveNodes = mbsc.getAttribute(storageserviceObjName, "LiveNodes").toString();
            String load = mbsc.getAttribute(storageserviceObjName, "Load").toString();
            String unitId = PRE_UNITID + "-13:" + deviceName + "-system";
            // FM-41-02-001-01 进程状态
            collResult.addKPI(unitId, "FM-41-02-001-01", liveNodes);
            // PM-41-02-001-09 当前节点存储数据量
            collResult.addKPI(unitId, "PM-41-02-001-09", load);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                connector.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return collResult.getKPISet();
    }


    public Vector getThreadPool(HashMap params) {
        logger.info("begin getThreadPool");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            init(params);
            ObjectName threadpoolObjName = new ObjectName("java.lang:type=Threading");
            String peakThreads = mbsc.getAttribute(threadpoolObjName, "PeakThreadCount").toString();
            String threads = mbsc.getAttribute(threadpoolObjName, "ThreadCount").toString();
            String unitId = PRE_UNITID + "-12:" + deviceName + "-thread";
            // PM-41-02-001-07 峰值线程数
            collResult.addKPI(unitId, "PM-41-02-001-07", peakThreads);
            // PM-41-02-001-06 线程数
            collResult.addKPI(unitId, "PM-41-02-001-06", threads);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                connector.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return collResult.getKPISet();
    }

    public static String formatTimeSpan(long ms) {
        int ss = 1000;
        int mi = ss * 60;
        int hh = mi * 60;
        int dd = hh * 24;
        long day = ms / dd;
        long hour = (ms - day * dd) / hh;
        long minute = (ms - day * dd - hour * hh) / mi;
        long second = (ms - day * dd - hour * hh - minute * mi) / ss;
        long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;
        String strDay = day < 10 ? "" + day : "" + day;
        String strHour = hour < 10 ? "0" + hour : "" + hour;
        String strMinute = minute < 10 ? "0" + minute : "" + minute;
        String strSecond = second < 10 ? "0" + second : "" + second;
        String strMilliSecond = milliSecond < 10 ? "0" + milliSecond : "" + milliSecond;
        strMilliSecond = milliSecond < 100 ? "0" + strMilliSecond : "" + strMilliSecond;
        return strDay + "天" + strHour + ":" + strMinute + ":" + strSecond + " " + strMilliSecond;
    }
}