java代码 虚拟机监控_XenServer 利用javaSDK实现虚拟机监控

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

主要实现功能

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

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

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

代码结构

85693b060c3fa94da96b476dfe7d5ef3.png

代码实现

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 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> dataRows = new ArrayList>();

ArrayList legends = new ArrayList();

NodeList xportChildNodes = doc.getDocumentElement().getChildNodes();

ArrayList time = new ArrayList();

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 dataRow = new ArrayList();

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();

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 legend = new HashMap();

HashMap 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();

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 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 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 time;

public HashMap datas;

public vmRRDPojo(){

}

public vmRRDPojo(String UUID, ArrayList time, HashMap datas){

this.UUID = UUID;

this.time = time;

this.datas = datas;

}

/**

* @return

* @author ygz 下午5:08:47

*/

public ArrayList getMetrics() {

if (time.size() < 1) return null;

ArrayList array = new ArrayList();

for (int i = 0; i < time.size(); i++) {

vmMetricsPojo vm = new vmMetricsPojo(UUID, time.get(i));

HashMap vmdata = new HashMap();

for (Entry 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值