CollBalanceWithSNMP.java 16.8 KB
package com.sitech.ismp.coll.loadBalance;

import com.sitech.ismp.coll.CollBase;
import com.sitech.ismp.coll.basic.TblATO_KPIDETAIL;
import com.sitech.util.DES3;
import com.sitech.util.Formater;
import com.sitech.util.LogUtil;
import com.sitech.util.SNMPClient;
import org.apache.log4j.Logger;
import org.apache.velocity.util.StringUtils;
import org.snmp4j.mp.SnmpConstants;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

/**
 * 负载均衡采集
 *
 * Created by IntelliJ IDEA.
 * User: liush_bj
 * Date: 2014-10-16
 */
public class CollBalanceWithSNMP extends CollBase{
    private String kbpClass;
    private String ipAddr;
    private String deviceName;
    private int snmpVersion;
    private int snmpPort;
    private String snmpCommunity;
    private SNMPClient client;
    private String sysObjectID;
    private boolean isConn = false;
    private boolean isSupportSnmp = false;

    public Vector<TblATO_KPIDETAIL> getTotal(HashMap<String, String> params)
            throws Exception {
        init(params);

        String unitId = kbpClass + "-10" + ":" + deviceName + "-total";

        String status = "UP";
        try {
            connect();

            // CM-01-03-001-01 设备名称
            super.addKPI(unitId, "CM-01-03-001-01", params.get("HOST_NAME"));

            // CM-01-03-001-02 IP地址
            super.addKPI(unitId, "CM-01-03-001-02", ipAddr);

            // CM-01-03-001-03 设备软件版本
            super.addKPI(unitId, "CM-01-03-001-03", getSoftVersion());
            //real server索引
            super.addKPI(unitId,"CM-01-03-001-04", client.get(".1.3.6.1.4.1.7564.19.2.1.1.1.1.0"));
            //real server名字
            super.addKPI(unitId,"CM-01-03-001-05", client.get(".1.3.6.1.4.1.7564.19.2.1.1.1.2.0"));
            //virtual serivice索引
            super.addKPI(unitId,"CM-01-03-001-06", client.get(".1.3.6.1.4.1.7564.19.2.2.1.1.1.0"));
            //virtual service名字
            super.addKPI(unitId,"CM-01-03-001-07", client.get(".1.3.6.1.4.1.7564.19.2.2.1.1.2.0"));
            //设备序列号
            super.addKPI(unitId,"CM-01-03-001-08", client.get(".1.3.6.1.4.1.7564.3.1.0"));
            //Cache功能开关
            super.addKPI(unitId,"FM-01-03-001-02", client.get(".1.3.6.1.4.1.7564.16.1.1.0"));
            //real server健康状态
            super.addKPI(unitId,"FM-01-03-001-03", client.get(".1.3.6.1.4.1.7564.19.2.1.1.1.8.0"));
            //电源状态
            super.addKPI(unitId,"FM-01-03-001-05", client.get(".1.3.6.1.4.1.7564.32.3.0"));

        } catch (Exception e) {
            status = e.getMessage();
            LogUtil.error("Exception while getTotal", e);
        } finally {
            // FM-01-03-001-01 设备状态
            super.addKPI(unitId, "FM-01-03-001-01", status);
            destroy();
        }

        return super.KPISet;
    }


    /**
     * ArrayAPV负载均衡监控
     * @param params
     * @return
     * @throws Exception
     */
    public Vector<TblATO_KPIDETAIL> getArrayAPV(HashMap<String, String> params) throws Exception {
            init(params);

            try {
                connect();
                String arrayUnitId = kbpClass + "-11" + ":" + deviceName+"-pf";
                //CacheOff不命中的次数
                super.addKPI(arrayUnitId,"PM-01-03-001-01", client.get(".1.3.6.1.4.1.7564.16.1.14.0"));
                //Cache缓存命中次数
                super.addKPI(arrayUnitId,"PM-01-03-001-02", client.get(".1.3.6.1.4.1.7564.16.1.15.0"));
                //Cache缓存命中但是需要更新的次数
                super.addKPI(arrayUnitId,"PM-01-03-001-03", client.get(".1.3.6.1.4.1.7564.16.1.18.0"));
                //不可Cache的请求数量
                super.addKPI(arrayUnitId,"PM-01-03-001-04", client.get(".1.3.6.1.4.1.7564.16.1.19.0"));
                //Cache命中率
                super.addKPI(arrayUnitId,"PM-01-03-001-05", client.get(".1.3.6.1.4.1.7564.16.1.22.0"));
                //所有VIP收到的数据包
                super.addKPI(arrayUnitId,"PM-01-03-001-06", client.get(".1.3.6.1.4.1.7564.22.4.0"));
                //所有VIP发出的数据包
                super.addKPI(arrayUnitId,"PM-01-03-001-07", client.get(".1.3.6.1.4.1.7564.22.5.0"));
                //real server命中次数
                super.addKPI(arrayUnitId,"PM-01-03-001-08", client.get(".1.3.6.1.4.1.7564.19.2.1.1.1.7.0"));
                //vs当前连接数
                super.addKPI(arrayUnitId,"PM-01-03-001-09", client.get(".1.3.6.1.4.1.7564.19.2.2.1.1.19.0"));
                //SYN-SENT数目
                super.addKPI(arrayUnitId,"PM-01-03-001-10", client.get(".1.3.6.1.4.1.7564.25.1.0"));
                //LISTEN状态数目
                super.addKPI(arrayUnitId,"PM-01-03-001-11", client.get(".1.3.6.1.4.1.7564.25.2.0"));
                //CLOSE-WAIT状态连接数
                super.addKPI(arrayUnitId,"PM-01-03-001-12", client.get(".1.3.6.1.4.1.7564.25.5.0"));
                //CPU利用率
                super.addKPI(arrayUnitId,"PM-01-03-001-13", client.get(".1.3.6.1.4.1.7564.30.1.0"));
                //每秒新建连接
                super.addKPI(arrayUnitId,"PM-01-03-001-14", client.get(".1.3.6.1.4.1.7564.30.2.0"));
                //每秒请求
                super.addKPI(arrayUnitId,"PM-01-03-001-15", client.get(".1.3.6.1.4.1.7564.30.3.0"));

                //拆分系统温度和cpu温度 结果格式sys:73,cpu1:46,cpu2:0
                String tempTemperature = client.get(".1.3.6.1.4.1.7564.32.1.0");
                String[] tempList = StringUtils.split(tempTemperature,",");
                for(String temp : tempList){
                    String[] tempList1 = StringUtils.split(temp,":");
                    if(tempList1.length>1){
                        if(tempList1[0].contains("sys")){
                            //记录系统温度
                            super.addKPI(kbpClass + "-10" + ":" + deviceName + "-total","PM-01-03-001-16", tempList1[1]);
                        }else if(tempList1[0].contains("cpu")){
                            //记录名称
                            super.addKPI(kbpClass + "-12" + ":" + deviceName+"-"+tempList1[0],"CM-00-04-003-15", tempList1[0]);
                            //记录cpu温度
                            super.addKPI(kbpClass + "-12" + ":" + deviceName+"-"+tempList1[0],"PM-01-03-001-17", tempList1[1]);
                        }
                    }
                }
                return super.getKPISet();
            } catch (Exception e) {
                LogUtil.error("Exception while getArray", e);
            } finally {
                destroy();
            }

            return null;
    }


    public Vector<TblATO_KPIDETAIL> getRadware(HashMap<String,String> params) throws Exception {
        init(params);

        try {
            connect();
            String arrayUnitId = kbpClass + "-12" + ":" + deviceName;

            DecimalFormat df = new DecimalFormat("#.###");
            Map<String,String> ipMap = client.walk2Map("1.3.6.1.4.1.89.35.1.40.40.4.1.1");
            Map<String,String> NatInUseMap = client.walk2Map("1.3.6.1.4.1.89.35.1.40.40.4.1.2");
            Map<String,String> NatAvgMap = client.walk2Map("1.3.6.1.4.1.89.35.1.40.40.4.1.3");
            if(ipMap != null && (!ipMap.isEmpty())){
                for(Map.Entry temp :ipMap.entrySet()){
                    String subIP = (String)temp.getKey();
                    String subUnitid = subIP.replace('.', '_');
                    String inUse = NatInUseMap.get(subIP);
                    String avg = NatAvgMap.get(subIP);
                    logger.info("IP:"+subIP+"   inUse:"+inUse+"     avg:"+avg);
                    String natGrowth = "0".equals(avg)? "0":df.format((Double.parseDouble(inUse) - Double.parseDouble(avg))*100/Double.parseDouble(avg));
                    // CM-00-02-002-05 端口IP
                    super.addKPI(arrayUnitId + "-" + subUnitid, "CM-00-02-002-05", subIP);
                    // PM-00-10-001-01 NAT增长率
                    super.addKPI(arrayUnitId + "-" + subUnitid, "PM-00-10-001-01", natGrowth);
                }
            }

            /*super.addKPI(arrayUnitId,"FM-01-03-002-01", client.get("1.3.6.1.4.1.89.0.5.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-02", client.get("1.3.6.1.4.1.89.51.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-03", client.get("1.3.6.1.4.1.89.68.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-04", client.get("1.3.6.1.4.1.89.35.1.1.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-05", client.get("1.3.6.1.4.1.89.35.1.5.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-06", client.get("1.3.6.1.4.1.89.35.1.8.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-07", client.get("1.3.6.1.4.1.89.35.1.104.1.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-08", client.get("1.3.6.1.4.1.89.35.1.40.7.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-09", client.get("1.3.6.1.4.1.89.35.1.40.0.10.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-10", client.get("1.3.6.1.4.1.89.35.1.40.11.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-11", client.get("1.3.6.1.4.1.89.35.1.40.12.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-12", client.get("1.3.6.1.4.1.89.35.1.40.15.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-13", client.get("1.3.6.1.4.1.89.35.1.40.16.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-14", client.get("1.3.6.1.4.1.89.35.1.40.19.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-15", client.get("1.3.6.1.4.1.89.35.1.40.20.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-16", client.get("1.3.6.1.4.1.89.35.1.40.21.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-17", client.get("1.3.6.1.4.1.89.35.1.40.17.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-18", client.get("1.3.6.1.4.1.89.35.1.40.18.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-19", client.get("1.3.6.1.4.1.89.35.1.40.22.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-20", client.get("1.3.6.1.4.1.89.141.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-21", client.get("1.3.6.1.4.1.89.35.1.2.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-22", client.get("1.3.6.1.4.1.89.35.1.4.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-23", client.get("1.3.6.1.4.1.89.35.1.40.8.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-24", client.get("1.3.6.1.4.1.89.35.1.40.9.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-25", client.get("1.3.6.1.4.1.89.35.1.0.11.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-26", client.get("1.3.6.1.4.1.89.35.1.12.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-27", client.get("1.3.6.1.4.1.89.35.1.14.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-28", client.get("1.3.6.1.4.1.89.35.1.40.14.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-29", client.get("1.3.6.1.4.1.89.35.1.40.0.23.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-30", client.get("1.3.6.1.4.1.89.35.1.40.0.24.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-31", client.get("1.3.6.1.4.1.89.35.1.60.0.1.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-32", client.get("1.3.6.1.4.1.89.35.1.60.0.3.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-33", client.get("1.3.6.1.4.1.89.35.1.60.0.4.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-34", client.get("1.3.6.1.4.1.89.35.1.60.0.5.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-35", client.get("1.3.6.1.4.1.89.35.1.79.1.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-36", client.get("1.3.6.1.4.1.89.35.1.79.2.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-37", client.get("1.3.6.1.4.1.89.35.1.79.0.3.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-38", client.get("1.3.6.1.4.1.89.35.1.73.0.1.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-39", client.get("1.3.6.1.4.1.89.35.1.104.2.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-40", client.get("1.3.6.1.4.1.89.21.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-41", client.get("1.3.6.1.4.1.89.0.69.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-42", client.get("1.3.6.1.4.1.89.0.71.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-43", client.get("1.3.6.1.4.1.89.78.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-44", client.get("1.3.6.1.4.1.89.80.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-45", client.get("1.3.6.1.4.1.89.82.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-46", client.get("1.3.6.1.4.1.89.84.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-47", client.get("1.3.6.1.4.1.89.85.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-48", client.get("1.3.6.1.4.1.89.35.1.16.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-49", client.get("1.3.6.1.4.1.89.35.1.17.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-50", client.get("1.3.6.1.4.1.89.35.1.40.0.37.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-51", client.get("1.3.6.1.4.1.89.35.1.40.0.38.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-52", client.get("1.3.6.1.4.1.89.35.1.40.54.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-53", client.get("1.3.6.1.4.1.89.35.1.40.55.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-54", client.get("1.3.6.1.4.1.89.0.7.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-55", client.get("1.3.6.1.4.1.89.76.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-56", client.get("1.3.6.1.4.1.89.77.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-57", client.get("1.3.6.1.4.1.89.16.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-58", client.get("1.3.6.1.4.1.89.17.0"));
            super.addKPI(arrayUnitId,"FM-01-03-002-59", client.get("1.3.6.1.4.1.89.0.15.0"));*/
            return super.getKPISet();
        } catch (Exception e) {
            LogUtil.error("Exception while getRadware", e);
        } finally {
            destroy();
        }
        return null;
    }


    private void init(HashMap<String, String> params) throws Exception {
        kbpClass = params.get("KBP_CLASS");
        ipAddr = params.get("IP");

        deviceName = Formater.neatenunitid(params.get("HOST_NAME"));

        try {
            snmpCommunity = DES3.decrypt(params.get("COMMUNITY"));
        }catch (Exception e) {
            throw new Exception("Wrong SNMP COMMUNITY");
        }

        try {
            snmpPort = Integer.parseInt(params.get("PORT"));
        } catch (Exception e) {
            throw new Exception("Wrong SNMP PORT:" + params.get("PORT"));
        }

        String versionStr = params.get("VERSION");

        if (versionStr != null && versionStr.toLowerCase().trim().equals("v1")) {
            snmpVersion = SnmpConstants.version1;
        } else if (versionStr != null
                && versionStr.toLowerCase().trim().equals("v2c")) {
            snmpVersion = SnmpConstants.version2c;
        } else if (versionStr != null
                && versionStr.toLowerCase().trim().equals("v3")) {
            throw new Exception("nonsupport snmp version: v3");
        } else {
            // 默认按照v2c版本采集
            snmpVersion = SnmpConstants.version2c;
        }
    }

    private void connect() throws Exception {
        client = new SNMPClient(ipAddr, snmpPort, snmpCommunity, snmpVersion);

        isSupportSnmp = client.isOpenSNMP();

        isConn = client.connect();

        if (!isConn || !isSupportSnmp) {
            throw new Exception(
                    "Device not support SNMP or Collect params is wrong or Network is error: "
                            + ipAddr + ":" + snmpPort);
        }


        sysObjectID = client.get("1.3.6.1.2.1.1.2.0");

        logger.info("-- sysObjectID: " + sysObjectID);
    }

    public void destroy() {
        if(client != null){
            client.close();
        }
    }

    /**
     * 设备软件版本
     */
    private String getSoftVersion() {
        String oid = "1.3.6.1.2.1.1.1.0";
        String version = null;
        try {
            version = client.get(oid).replace("\n", " ").replace("\r", "");
        } catch (Exception e) {
            LogUtil.error("Exception while getSoftVersion", e);
        }
        return version;
    }

    public static void main(String[] args) {
        System.out.println("***************Load Balance Collect Test Begin*********************");
        //拆分系统温度和cpu温度 sys:73,cpu1:46,cpu2:0
        String[] tempList = StringUtils.split("sys:73,cpu1:46,cpu2:0",",");
        for(String temp : tempList){
            String[] tempList1 = StringUtils.split(temp,":");
            if(tempList1.length>1){
                if(tempList1[0].contains("sys")){
                    System.out.println(tempList1[0]+"sys-----"+tempList1[1]);
                }else if(tempList1[0].contains("cpu")){
                    System.out.println(tempList1[0]+"cpu-----"+tempList1[1]);
                }
            }
        }

    }

}