CollIdmdbByCMD.java 12.1 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 com.sitech.util.Formater;
import com.sitech.util.upload.RomoteController;
import com.sitech.util.upload.SSHThread;
import com.sitech.util.upload.TelnetThread;
import org.apache.log4j.Logger;

import java.util.*;

/**
 * Created by mooker on 2014/8/29.
 */
public class CollIdmdbByCMD {

    private static Logger logger = Logger.getLogger("COLL");

    String KBP_CLASS = "10-32-16";

    RomoteController tt = null;
    String dbserver = "";

    public Vector<TblATO_KPIDETAIL> getSystem(HashMap<String, String> params) {
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            // 登陆执行命令,获取结果进行解析
            init(params);
            if (!tt.isAuthorized()) {
                return collResult.KPISet;
            }

            // 数据库名 CM-00-03-001-08
            collResult.addKPI(this.KBP_CLASS + "-10:" + this.dbserver + "-SYS", "CM-00-03-001-08", dbserver);
            // 网元厂商 CM-00-02-001-02
            collResult.addKPI(this.KBP_CLASS + "-10:" + this.dbserver + "-SYS", "CM-00-02-001-02", "SI-TECH");

            Vector<String> vNodeStatus = tt.getResultAsVector(". ./.bash_profile;dmdb_status -v");
            if (!vNodeStatus.isEmpty()) {
                for (int i = 5; i < vNodeStatus.size(); i++) {
                    String nodeStatus = (String) vNodeStatus.elementAt(i);
                    if (nodeStatus != null && nodeStatus.contains("stty:")) {
                        continue;
                    }
                    if (nodeStatus != null && !nodeStatus.startsWith("db")) {
                        continue;
                    }
                    String nodeName = split(nodeStatus, 0);
                    String mainDb = split(nodeStatus, 1);
                    String slaveDb = split(nodeStatus, 2);
                    String mainDbStatus = split(nodeStatus, 3);
                    String slaveDbStatus = split(nodeStatus, 4);
                    String _unitId = this.KBP_CLASS + "-21:" + this.dbserver + "-" + Formater.neatenunitid(nodeName);
                    // 节点名称 CM-00-03-011-01
                    collResult.addKPI(_unitId, "CM-00-03-011-01", nodeName);
                    // 节点主库 CM-00-03-011-02
                    collResult.addKPI(_unitId, "CM-00-03-011-02", mainDb);
                    // 节点备库 CM-00-03-011-03
                    collResult.addKPI(_unitId, "CM-00-03-011-03", slaveDb);
                    // 节点主库状态 FM-00-03-001-10
                    collResult.addKPI(_unitId, "FM-00-03-001-10", mainDbStatus);
                    // 节点备库状态 FM-00-03-001-11
                    collResult.addKPI(_unitId, "FM-00-03-001-11", slaveDbStatus);
                }
            }
        } catch (Exception e) {
            logger.error("", e);
        } finally {
            release();
        }
        return collResult.getKPISet();
    }

    public Vector<TblATO_KPIDETAIL> getSession(HashMap<String, String> params) {
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            // 登陆执行命令,获取结果进行解析
            init(params);
            if (!tt.isAuthorized()) {
                return collResult.KPISet;
            }

            String PRE_UNIT_ID = this.KBP_CLASS + "-22:" + this.dbserver;
            Vector<String> vNodeSession = tt.getResultAsVector(". ./.bash_profile;dmdb_status -s | grep ^$ -B2 | sed -e '/Error/i\\--' | sed -e '/Error/a\\session 0'");
            if (!vNodeSession.isEmpty()) {
                int startIndex = 0;
                for (int j = 0; j < vNodeSession.size(); j++) {
                    String info = (String) vNodeSession.elementAt(j);
                    if (info != null && info.contains("#####")) {
                        startIndex = j;
                        break;
                    }
                }

                for (int k = 0; k < startIndex + 2; k++) {
                    vNodeSession.remove(0);
                }
                System.out.println("vNodeSession.size() is " + vNodeSession.size());
                for (int i = 0; i < (vNodeSession.size() + 1) / 4; i++) {
                    String nodeName = (String) vNodeSession.elementAt(i * 4 + 1);
                    String nodeSession = (String) vNodeSession.elementAt(i * 4 + 2);
                    if ((nodeName != null && nodeName.contains("stty:")) || (nodeSession != null && nodeSession.contains("stty:"))) {
                        continue;
                    }
                    String _nodeName = split(nodeName, 0);
                    String _nodeSession = split(nodeSession, 1);
                    String _unitId = PRE_UNIT_ID + "-" + Formater.neatenunitid(_nodeName);
                    // 会话数量 PM-00-03-009-03
                    collResult.addKPI(_unitId, "PM-00-03-009-03", String.valueOf(_nodeSession));
                }
            }
        } catch (Exception e) {
            logger.error("", e);
        } finally {
            release();
        }
        return collResult.getKPISet();
    }

    public Vector<TblATO_KPIDETAIL> getPerform(HashMap<String, String> params) {
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        try {
            init(params);
            if (!tt.isAuthorized()) {
                return collResult.KPISet;
            }

            String PRE_UNIT_ID = this.KBP_CLASS + "-22:" + this.dbserver;

            Vector<String> vNodeMaxClient = tt.getResultAsVector(". ./.bash_profile;dmdb_param get MAX_CLIENT | grep -v ^$ | awk -F ' ' '{print $1\" \"$5}'");
            Map<String, String> nodeMap = new HashMap<String, String>();
            if (!vNodeMaxClient.isEmpty()) {
                for (int i = 0; i < vNodeMaxClient.size(); i++) {
                    String nodeMaxClient = (String) vNodeMaxClient.elementAt(i);
                    if (nodeMaxClient != null && nodeMaxClient.contains("stty:")) {
                        continue;
                    }
                    String nodeName = split(nodeMaxClient, 0);
                    nodeMap.put(nodeName, nodeName);
                    String maxClientCfg = split(nodeMaxClient, 1);
                    String _unitId = PRE_UNIT_ID + "-" + Formater.neatenunitid(nodeName);
                    // 配置用户连接数 CM-00-03-007-02
                    collResult.addKPI(_unitId, "CM-00-03-007-02", maxClientCfg);
                }
            }

            Vector<String> vNodeMemory = tt.getResultAsVector(". ./.bash_profile;dmdb_status -m | grep db | awk '{a[$1]+=$4;b[$1]+=$5}END{for(i in a)print i,a[i],b[i]}'");
            if (!vNodeMemory.isEmpty()) {
                for (int i = 0; i < vNodeMemory.size(); i++) {
                    String nodeMemory = (String) vNodeMemory.elementAt(i);
                    if (nodeMemory != null && nodeMemory.contains("stty:")) {
                        continue;
                    }
                    String nodeName = split(nodeMemory, 0);
                    if (nodeMap.containsKey(nodeName)) {
                        nodeMap.remove(nodeName);
                    }
                    String totalMemory = split(nodeMemory, 1);
                    String usedMemory = split(nodeMemory, 2);
                    Double usedRate = Double.parseDouble(usedMemory) * 100 / Double.parseDouble(totalMemory);
                    String _unitId = PRE_UNIT_ID + "-" + Formater.neatenunitid(nodeName);
                    // 节点名称 CM-00-03-011-01
                    collResult.addKPI(_unitId, "CM-00-03-011-01", nodeName);
                    // 数据库使用最大内存 CM-00-03-007-01
                    collResult.addKPI(_unitId, "CM-00-03-007-01", totalMemory);
                    // 已消耗的主机内存 PM-00-01-002-12
                    collResult.addKPI(_unitId, "PM-00-01-002-12", usedMemory);
                    // 内存使用率 PM-00-01-002-01
                    collResult.addKPI(_unitId, "PM-00-01-002-01", Formater.formatDecimalByScale(String.valueOf(usedRate), 4));
                }

                for (Iterator iter = nodeMap.keySet().iterator(); iter.hasNext(); ) {
                    String _key = (String) iter.next();
                    String _unitId = PRE_UNIT_ID + "-" + Formater.neatenunitid(_key);
                    // 节点名称 CM-00-03-011-01
                    collResult.addKPI(_unitId, "CM-00-03-011-01", _key);
                    // 数据库使用最大内存 CM-00-03-007-01
                    collResult.addKPI(_unitId, "CM-00-03-007-01", "0");
                    // 已消耗的主机内存 PM-00-01-002-12
                    collResult.addKPI(_unitId, "PM-00-01-002-12", "0");
                    // 内存使用率 PM-00-01-002-01
                    collResult.addKPI(_unitId, "PM-00-01-002-01", "0.0");
                }
            }

            //主备库复制进程信息
            Vector<String> NodeStatus = tt.getResultAsVector(". ./.bash_profile;dmdb_status -d");

            if (!NodeStatus.isEmpty()) {
                for (int i = 5; i < NodeStatus.size(); i++) {
                    String nodeStatus = (String) NodeStatus.elementAt(i);
                    if (nodeStatus != null && nodeStatus.contains("stty:")) {
                        continue;
                    }
                    if (nodeStatus != null && !nodeStatus.startsWith("db")) {
                        continue;
                    }
                    String nodeName = split(nodeStatus, 0);
                    String mainDbStatus = split(nodeStatus, 1);
                    String slaveDbStatus = split(nodeStatus, 2);
                    String _unitId = this.KBP_CLASS + "-23:" + this.dbserver + "-" +nodeName;
                    // 节点名称 CM-00-03-011-01
                    collResult.addKPI(_unitId, "CM-00-03-011-01", nodeName);
                    // 节点主库状态 FM-00-03-001-10
                    collResult.addKPI(_unitId, "FM-00-03-001-10", mainDbStatus);
                    // 节点备库状态 FM-00-03-001-11
                    collResult.addKPI(_unitId, "FM-00-03-001-11", slaveDbStatus);
                }
            }
        } catch (Exception e) {
            logger.error("", e);
        } finally {
            release();
        }
        return collResult.getKPISet();
    }

    public void init(HashMap params) {
        String ipAddr = (String) params.get("IP_ADDR");
        String username = (String) params.get("USERNAME");
        String password = (String) params.get("PASSWORD");
        password = DES3.decrypt(password);
        String protocol = (String) params.get("PROTOCOL");
        dbserver = (String) params.get("DBNAME");
        this.dbserver = Formater.neatenunitid(dbserver);
        String protocolPort = null;
        if (params.get("PROTOCOL_PORT") != null) {
            protocolPort = ((String) params.get("PROTOCOL_PORT")).trim();
        }
        if (protocol != null && protocol.equals("telnet")) {
            if (null != protocolPort && !"".equals(protocolPort)) {
                tt = new TelnetThread(ipAddr, Integer.parseInt(protocolPort), username, password);
            } else {
                tt = new TelnetThread(ipAddr, 23, username, password);
            }
        } else {
            if (null != protocolPort && !"".equals(protocolPort)) {
                tt = new SSHThread(ipAddr, Integer.parseInt(protocolPort), username, password);
            } else {
                tt = new SSHThread(ipAddr, 22, username, password);
            }
        }
        tt.initial();
    }

    public void release() {
        if (tt != null) {
            tt.close();
            tt = null;
        }
        System.gc();
    }

    public String split(String str, int pos) {
        StringTokenizer st = new StringTokenizer(str);
        Vector values = new Vector();
        while (st.hasMoreTokens()) {
            values.add(st.nextToken());
        }
        if (pos >= 0 && pos < values.size()) {
            return (String) values.elementAt(pos);
        }
        return "";
    }
}