本文主要使用XenSDK-6.2.0,通过调用新版的http api实现获取虚拟机的各个参数。以前旧版本中,可以通过VMGuestMetrics类的方法获取系统的实时信息,但是新版本放弃了该方法,调用时将返回0,新版本支持了http api通过rrdxport格式进行返回。由于该方面的国内文献比较少,而且没有相关的实现,故本文做以代码的实现分享。
主要实现功能
1、获取Host上的全部虚拟机1小时内,每1分钟的实时状态。
2、信息包括:CPU使用情况、内存使用情况、硬盘读写情况、网络读写情况等
3、根据UUID获取指定虚拟机的近1小时内的信息。
代码结构
代码实现
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();
}
}