通过前面两篇文章的了解,详细应该很快掌握的code路数,这里首先罗列如何获取主机(接下去也会成为HostSystem)的对象。
private static TraversalSpec getHostSystemTraversalSpec () { SelectionSpec ss = new SelectionSpec(); ss.setName("VisitFolders" ); TraversalSpec computeResourceToHostSystem = new TraversalSpec(); computeResourceToHostSystem.setName("computeResourceToHostSystem" ); computeResourceToHostSystem.setType("ComputeResource" ); computeResourceToHostSystem.setPath("host" ); computeResourceToHostSystem.setSkip(false ); computeResourceToHostSystem.getSelectSet().add(ss); TraversalSpec hostFolderToComputeResource = new TraversalSpec(); hostFolderToComputeResource.setName("hostFolderToComputeResource" ); hostFolderToComputeResource.setType("Folder" ); hostFolderToComputeResource.setPath("childEntity" ); hostFolderToComputeResource.setSkip(false ); hostFolderToComputeResource.getSelectSet().add(ss); TraversalSpec dataCenterToHostFolder = new TraversalSpec(); dataCenterToHostFolder.setName("DataCenterToHostFolder" ); dataCenterToHostFolder.setType("Datacenter" ); dataCenterToHostFolder.setPath("hostFolder" ); dataCenterToHostFolder.setSkip(false ); dataCenterToHostFolder.getSelectSet().add(ss); TraversalSpec traversalSpec = new TraversalSpec(); traversalSpec.setName("VisitFolders" ); traversalSpec.setType("Folder" ); traversalSpec.setPath("childEntity" ); traversalSpec.setSkip(false ); List<SelectionSpec> sSpecArr = new ArrayList<SelectionSpec>(); sSpecArr.add(ss); sSpecArr.add(dataCenterToHostFolder); sSpecArr.add(hostFolderToComputeResource); sSpecArr.add(computeResourceToHostSystem); traversalSpec.getSelectSet().addAll(sSpecArr); return traversalSpec; }
private static ManagedObjectReference getHostByHostName (String hostName) { ManagedObjectReference retVal = null ; ManagedObjectReference rootFolder = serviceContent.getRootFolder(); try { TraversalSpec tSpec = getHostSystemTraversalSpec(); PropertySpec propertySpec = new PropertySpec(); propertySpec.setAll(Boolean.FALSE); propertySpec.getPathSet().add("name" ); propertySpec.setType("HostSystem" ); ObjectSpec objectSpec = new ObjectSpec(); objectSpec.setObj(rootFolder); objectSpec.setSkip(Boolean.TRUE); objectSpec.getSelectSet().add(tSpec); PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec(); propertyFilterSpec.getPropSet().add(propertySpec); propertyFilterSpec.getObjectSet().add(objectSpec); List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(1 ); listpfs.add(propertyFilterSpec); List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs); if (listobjcont != null ) { for (ObjectContent oc : listobjcont) { ManagedObjectReference mr = oc.getObj(); String hostnm = null ; List<DynamicProperty> listDynamicProps = oc.getPropSet(); DynamicProperty[] dps = listDynamicProps.toArray(new DynamicProperty[listDynamicProps.size()]); if (dps != null ) { for (DynamicProperty dp : dps) { hostnm = (String) dp.getVal(); } } if (hostnm != null && hostnm.equals(hostName)) { retVal = mr; break ; } } } else { System.out.println("The Object Content is Null" ); } } catch (SOAPFaultException sfe) { printSoapFaultException(sfe); } catch (Exception e) { e.printStackTrace(); } return retVal; }
接下去展示获取HostSystem的性能信息的方法,和VirtualMachine的类似。
private static List<List<Long>> getHostData(String hostName, String nameInfo, String groupInfo) throws RuntimeFaultFaultMsg{ List<List<Long>> list = new ArrayList<List<Long>>(); ManagedObjectReference vmmor = getHostByHostName(hostName); if (vmmor != null ) { List<PerfCounterInfo> cInfo = getPerfCounters(); List<PerfCounterInfo> vmCpuCounters = new ArrayList<PerfCounterInfo>(); for (int i = 0 ; i < cInfo.size(); ++i) { vmCpuCounters.add(cInfo.get(i)); } int i = 0 ; Map<Integer, PerfCounterInfo> counters = new HashMap<Integer, PerfCounterInfo>(); for (Iterator<PerfCounterInfo> it = vmCpuCounters.iterator(); it.hasNext();) { PerfCounterInfo pcInfo = (PerfCounterInfo) it.next(); counters.put(new Integer(pcInfo.getKey()), pcInfo); } List<PerfMetricId> listpermeid = vimPort.queryAvailablePerfMetric(perfManager, vmmor, null , null , new Integer(20 )); ArrayList<PerfMetricId> mMetrics = new ArrayList<PerfMetricId>(); if (listpermeid != null ) { for (int index = 0 ; index < listpermeid.size(); ++index) { if (counters.containsKey(new Integer(listpermeid.get(index).getCounterId()))) { mMetrics.add(listpermeid.get(index)); } } } PerfQuerySpec qSpec = new PerfQuerySpec(); qSpec.setEntity(vmmor); qSpec.setMaxSample(new Integer(10 )); qSpec.getMetricId().addAll(mMetrics); qSpec.setIntervalId(new Integer(20 )); List<PerfQuerySpec> qSpecs = new ArrayList<PerfQuerySpec>(); qSpecs.add(qSpec); List<PerfEntityMetricBase> listpemb = vimPort.queryPerf(perfManager, qSpecs); List<PerfEntityMetricBase> pValues = listpemb; for (i = 0 ; i < pValues.size(); i++) { List<PerfMetricSeries> listpems = ((PerfEntityMetric) pValues.get(i)).getValue(); for (int vi = 0 ; vi < listpems.size(); ++vi) { String printInf = "" ; PerfCounterInfo pci = (PerfCounterInfo) counters.get(new Integer(listpems.get(vi).getId().getCounterId())); if (pci != null ) { if (pci.getNameInfo().getKey().equalsIgnoreCase(nameInfo) && pci.getGroupInfo().getKey().equalsIgnoreCase(groupInfo)) { printInf += vi + ":" + pci.getNameInfo().getSummary() + ":" + pci.getNameInfo().getKey() + ":" + pci.getNameInfo().getLabel() + ":" + pci.getGroupInfo().getKey() + ":" + pci.getGroupInfo().getLabel() + ":" + pci.getGroupInfo().getSummary() + " " ; if (listpems.get(vi) instanceof PerfMetricIntSeries) { PerfMetricIntSeries val = (PerfMetricIntSeries) listpems.get(vi); List<Long> lislon = val.getValue(); for (Long k : lislon) { printInf += k + " " ; } list.add(lislon); } printInf += " " + pci.getUnitInfo().getKey() + " " + pci.getUnitInfo().getLabel() + " " + pci.getUnitInfo().getSummary(); System.out.println(printInf); } } } } } return list; }
以获取主机cpu使用情况进行展示:
public static double getHostCpuUsageByHostName (String hostName) throws RuntimeFaultFaultMsg { double ans = 0.0 ; List<List<Long>> list = getHostData(hostName, "usage" , "cpu" ); long maxInner = 0 ; int times = 0 ; for (List<Long> listOuter : list) { long tempInner = 0 ; for (long inner : listOuter) { tempInner += inner; } if (tempInner > maxInner) { maxInner = tempInner; times = listOuter.size(); } } if (times != 0 ) { ans = (double ) maxInner / times; } ans = ans / 100 ; return ans; }
与VirtualMachine相同,Hostsystem也有些信息要通过另一种方式遍历。
譬如获取主机cpu的个数:
private static String getHostPropertyByHostName (String property, String hostName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { String ans = null ; RetrieveResult props = getRetrieveResultObjectWithProperty("HostSystem" , property); if (props != null ) { Boolean flag = false ; if (property.compareToIgnoreCase("name" ) < 0 ) { for (ObjectContent oc : props.getObjects()) { if (flag == true ) { break ; } String path = null ; List<DynamicProperty> dps = oc.getPropSet(); if (dps != null ) { for (DynamicProperty dp : dps) { path = dp.getName(); if (path.equalsIgnoreCase(property)) { String val = String.valueOf(dp.getVal()); ans = val; } if (path.equalsIgnoreCase("name" )) { String value = (String) dp.getVal(); if (value.equals(hostName)) { flag = true ; break ; } } } } } } else { for (ObjectContent oc : props.getObjects()) { if (flag == true ) { break ; } String path = null ; List<DynamicProperty> dps = oc.getPropSet(); if (dps != null ) { for (DynamicProperty dp : dps) { path = dp.getName(); if (path.equalsIgnoreCase("name" )) { String value = (String) dp.getVal(); if (value.equals(hostName)) { flag = true ; } } if (path.equalsIgnoreCase(property)) { String val = String.valueOf(dp.getVal()); if (flag == true ) { ans = val; break ; } } } } } } } return ans; }
public static double getHostCpuUsageByHostName (String hostName) throws RuntimeFaultFaultMsg { double ans = 0.0 ; List<List<Long>> list = getHostData(hostName, "usage" , "cpu" ); long maxInner = 0 ; int times = 0 ; for (List<Long> listOuter : list) { long tempInner = 0 ; for (long inner : listOuter) { tempInner += inner; } if (tempInner > maxInner) { maxInner = tempInner; times = listOuter.size(); } } if (times != 0 ) { ans = (double ) maxInner / times; } ans = ans / 100 ; return ans; }
这里不做过多的说明,相信读者如果真的想要迫切了解这些内容,肯定会自己研究,本人罗列的代码都是亲身试用到项目中的,保证能够运行。希望对各位有帮助。
这里同样采用获取主机名称的方法来结束:
public static List<String> getHostNames () { List<String> list = new ArrayList<String>(); ManagedObjectReference rootFolder = serviceContent.getRootFolder(); try { TraversalSpec tSpec = getHostSystemTraversalSpec(); PropertySpec propertySpec = new PropertySpec(); propertySpec.setAll(Boolean.FALSE); propertySpec.getPathSet().add("name" ); propertySpec.setType("HostSystem" ); ObjectSpec objectSpec = new ObjectSpec(); objectSpec.setObj(rootFolder); objectSpec.setSkip(Boolean.TRUE); objectSpec.getSelectSet().add(tSpec); PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec(); propertyFilterSpec.getPropSet().add(propertySpec); propertyFilterSpec.getObjectSet().add(objectSpec); List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(1 ); listpfs.add(propertyFilterSpec); List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs); if (listobjcont != null ) { for (ObjectContent oc : listobjcont) { String hostnm = null ; List<DynamicProperty> listDynamicProps = oc.getPropSet(); DynamicProperty[] dps = listDynamicProps.toArray(new DynamicProperty[listDynamicProps.size()]); if (dps != null ) { for (DynamicProperty dp : dps) { hostnm = (String) dp.getVal(); if (hostnm != null ) { list.add(hostnm); } } } } } else { System.out.println("getHostNames: Object Content is null " ); } } catch (SOAPFaultException sfe) { printSoapFaultException(sfe); } catch (Exception e) { e.printStackTrace(); } return list; }
欢迎支持笔者的作品《深入理解Kafka: 核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客(ID: hiddenkafka)。
本文作者:
朱小厮
版权声明:
未经本人允许,不得擅自转载、修改或用于其它任何用途!