i3geek.com
闫庚哲的个人博客

XenServer 利用javaSDK实现虚拟机监控

本文主要使用XenSDK-6.2.0,通过调用新版的http api实现获取虚拟机的各个参数。以前旧版本中,可以通过VMGuestMetrics类的方法获取系统的实时信息,但是新版本放弃了该方法,调用时将返回0,新版本支持了http api通过rrdxport格式进行返回。由于该方面的国内文献比较少,而且没有相关的实现,故本文做以代码的实现分享。

主要实现功能

1、获取Host上的全部虚拟机1小时内,每1分钟的实时状态。

2、信息包括:CPU使用情况、内存使用情况、硬盘读写情况、网络读写情况等

3、根据UUID获取指定虚拟机的近1小时内的信息。

代码结构

QQ20151217-0

代码实现

monitorUtil.java

/**
 * @date 2015年12月15日 下午2:19:52
 * @author yangengzhe
 */
public class monitorUtil {

    /**
     * @param rrdXportData
     * @author ygz 下午2:20:47
     */
    public static hostRRDPojo parse_RRD(String rrdXportData) {
        int endTime = 0;
        HashMap<String, double[]> metricsTimelines = null;
        int startTime = 0;
        int step = 0;
        int rows = 0;
        int columns = 0;
        hostRRDPojo hostRRD = null;

        try {
            DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setNamespaceAware(true);
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            StringReader stringReader = new StringReader(rrdXportData);
            InputSource inputSource = new InputSource(stringReader);
            Document doc = builder.parse(inputSource);
            stringReader.close();

            ArrayList<ArrayList<String>> dataRows = new ArrayList<ArrayList<String>>();
            ArrayList<String> legends = new ArrayList<String>();
            NodeList xportChildNodes = doc.getDocumentElement().getChildNodes();
            ArrayList<Integer> time = new ArrayList<Integer>();
            for (int i = 0; i < xportChildNodes.getLength(); i++) {
                Node xportChildNode = xportChildNodes.item(i);
                if (xportChildNode.getNodeName().equals("meta")) {
                    NodeList metaChildNodes = xportChildNode.getChildNodes();
                    for (int j = 0; j < metaChildNodes.getLength(); j++) {
                        Node metaChildNode = metaChildNodes.item(j);
                        if (metaChildNode.getNodeName().equals("step")) {
                            step = new Integer(metaChildNode.getTextContent()).intValue();
                        } else if (metaChildNode.getNodeName().equals("start")) {
                            startTime = new Integer(metaChildNode.getTextContent()).intValue();
                        } else if (metaChildNode.getNodeName().equals("end")) {
                            endTime = new Integer(metaChildNode.getTextContent()).intValue();
                        } else if (metaChildNode.getNodeName().equals("columns")) {
                            columns = new Integer(metaChildNode.getTextContent()).intValue();
                        } else if (metaChildNode.getNodeName().equals("rows")) {
                            rows = new Integer(metaChildNode.getTextContent()).intValue();
                        } else if (metaChildNode.getNodeName().equals("legend")) {
                            NodeList legendChildNodes = metaChildNode.getChildNodes();
                            for (int k = 0; k < legendChildNodes.getLength(); k++) {
                                Node legendChildNode = legendChildNodes.item(k);
                                legends.add(k, legendChildNode.getTextContent());
                            }
                        }
                    }
                    hostRRD = new hostRRDPojo(startTime, step, endTime, rows, columns);
                } else if (xportChildNode.getNodeName().equals("data")) {
                    NodeList dataChildNodes = xportChildNode.getChildNodes();
                    for (int j = 0; j < dataChildNodes.getLength(); j++) {
                        Node rowNode = dataChildNodes.item(j);
                        NodeList rowChildNodes = rowNode.getChildNodes();
                        ArrayList<String> dataRow = new ArrayList<String>();
                        time.add(j, new Integer(rowChildNodes.item(0).getTextContent()).intValue());
                        for (int k = 1; k < rowChildNodes.getLength(); k++) {
                            Node rowChildNode = rowChildNodes.item(k);
                            dataRow.add(k - 1, rowChildNode.getTextContent());
                        }
                        dataRows.add(dataRow);
                    }
                }
            }

            int nrDataRows = dataRows.size();
            int nrLegends = legends.size();

            metricsTimelines = new HashMap<String, double[]>();
            for (int i = 0; i < nrLegends; i++) {
                metricsTimelines.put(legends.get(i), new double[nrDataRows]);
            }
            for (int i = 0; i < nrLegends; i++) {
                for (int j = 0; j < nrDataRows; j++) {
                    double[] values = metricsTimelines.get(legends.get(i));
                    values[j] = new Double(dataRows.get(j).get(i)).doubleValue();
                }
            }

            HashMap<String, vmRRDPojo> legend = new HashMap<String, vmRRDPojo>();
            HashMap<String, double[]> datas = null;
            String uuid = "";
            for (int i = 0; i < columns; i++) {
                String[] str_array = legends.get(i).split(":");
                if (str_array.length < 4) return null;
                if (!str_array[2].equals(uuid)) {
                    uuid = str_array[2];
                    datas = new HashMap<String, double[]>();
                    vmRRDPojo vmrrd = new vmRRDPojo(uuid, time, datas);
                    legend.put(uuid, vmrrd);
                }
                datas.put(str_array[3], metricsTimelines.get(legends.get(i)));
            }

            hostRRD.setLegend(legend);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return hostRRD;
    }

}

hostRRDPojo.java

/**
 * @date 2015年12月15日 下午3:07:02
 * @author yangengzhe
 *
 */
public class hostRRDPojo {
    public int start;
    public int step;
    public int end;
    public int rows;
    public int columns;
    public HashMap<String,vmRRDPojo> legend;
    
    /**
     * @param uuid
     * @return
     * @author ygz 下午4:36:45
     */
    public vmRRDPojo getVMByUUID(String uuid)
    {
        vmRRDPojo vmrrd = null;
        if(uuid!=null)
            vmrrd = legend.get(uuid);
        return vmrrd;
    }
    public int getVMCount()
    {
        return legend.size();
    }
    public hostRRDPojo(){
        
    }
    public hostRRDPojo(int start,int step,int end,int rows,int columns){
        this.start=start;
        this.step=step;
        this.end=end;
        this.rows=rows;
        this.columns=columns;
    }
}

vmMetricsPojo.java

/**
 * @date 2015年12月15日 下午5:15:28
 * @author yangengzhe
 */
public class vmMetricsPojo {

    public String                  UUID;
    public int                     time;
    public HashMap<String, Double> datas;

    public vmMetricsPojo(){
    }

    public vmMetricsPojo(String uuid, int time){
        this.UUID = uuid;
        this.time = time;
    }
    
    public int getSize(){
        return datas.size();
    }
}

vmRRDPojo.java

/**
 * @date 2015年12月15日 下午4:34:15
 * @author yangengzhe
 */
public class vmRRDPojo {

    public String                    UUID;
    public ArrayList<Integer>        time;
    public HashMap<String, double[]> datas;

    public vmRRDPojo(){
    }

    public vmRRDPojo(String UUID, ArrayList<Integer> time, HashMap<String, double[]> datas){
        this.UUID = UUID;
        this.time = time;
        this.datas = datas;
    }

    /**
     * @return
     * @author ygz 下午5:08:47
     */
    public ArrayList<vmMetricsPojo> getMetrics() {
        if (time.size() < 1) return null;
        ArrayList<vmMetricsPojo> array = new ArrayList<vmMetricsPojo>();
        for (int i = 0; i < time.size(); i++) {
            vmMetricsPojo vm = new vmMetricsPojo(UUID, time.get(i));
            HashMap<String, Double> vmdata = new HashMap<String, Double>();
            for (Entry<String, double[]> entry : datas.entrySet()) {
                vmdata.put(entry.getKey(), entry.getValue()[i]);
            }
            vm.setDatas(vmdata);
            array.add(vm);
        }
        return array;
    }

    public int getSize() {
        return time.size();
    }

}
赞(0)
未经允许不得转载:爱上极客 » XenServer 利用javaSDK实现虚拟机监控
分享到: 更多 (0)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    楼主是否可以各一个比较完整的 demo,这个看不出参数从哪里设置啊

    tom2年前 (2016-11-15)回复