欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-virtual-cpu/

本文通过代码举例虚拟机cpu的使用情况来演示如何遍历搜寻VirtualMachine的对象,以及根据这个对象进行性能指标的见识。希望可以取到举一反三的效果。

首先下面先罗列出如何更具虚拟机的名称获得VirtualMachine的ManagedObjectReference对象。

 private static TraversalSpec getVmTraversalSpec(){TraversalSpec vAppToVM = new TraversalSpec();vAppToVM.setName("vAppToVM");vAppToVM.setType("VirtualApp");vAppToVM.setPath("vm");TraversalSpec vAppToVApp = new TraversalSpec();vAppToVApp.setName("vAppToVApp");vAppToVApp.setType("VirtualApp");vAppToVApp.setPath("resourcePool");SelectionSpec vAppRecursion = new SelectionSpec();vAppRecursion.setName("vAppToVApp");SelectionSpec vmInVApp = new SelectionSpec();vmInVApp.setName("vAppToVM");List<SelectionSpec> vAppToVMSS = new ArrayList<SelectionSpec>();vAppToVMSS.add(vAppRecursion);vAppToVMSS.add(vmInVApp);vAppToVApp.getSelectSet().addAll(vAppToVMSS);SelectionSpec sSpec = new SelectionSpec();sSpec.setName("VisitFolders");TraversalSpec dataCenterToVMFolder = new TraversalSpec();dataCenterToVMFolder.setName("DataCenterToVMFolder");dataCenterToVMFolder.setType("Datacenter");dataCenterToVMFolder.setPath("vmFolder");dataCenterToVMFolder.setSkip(false);dataCenterToVMFolder.getSelectSet().add(sSpec);TraversalSpec traversalSpec = new TraversalSpec();traversalSpec.setName("VisitFolders");traversalSpec.setType("Folder");traversalSpec.setPath("childEntity");traversalSpec.setSkip(false);List<SelectionSpec> sSpecArr = new ArrayList<SelectionSpec>();sSpecArr.add(sSpec);sSpecArr.add(dataCenterToVMFolder);sSpecArr.add(vAppToVM);sSpecArr.add(vAppToVApp);traversalSpec.getSelectSet().addAll(sSpecArr);return traversalSpec;}
 private static ManagedObjectReference getVmByVmName(String vmName){ManagedObjectReference retVal = null;ManagedObjectReference rootFolder = serviceContent.getRootFolder();try{TraversalSpec tSpec = getVmTraversalSpec();PropertySpec propertySpec = new PropertySpec();propertySpec.setAll(Boolean.FALSE);propertySpec.getPathSet().add("name");propertySpec.setType("VirtualMachine");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 vmnm = null;List<DynamicProperty> dps = oc.getPropSet();if (dps != null){for (DynamicProperty dp : dps){vmnm = (String) dp.getVal();}}if (vmnm != null && vmnm.equals(vmName)){retVal = mr;break;}}}}catch (SOAPFaultException sfe){printSoapFaultException(sfe);}catch (Exception e){e.printStackTrace();}return retVal;}

然后根据上面的VirtualMachine的ManagedObjectReference对象获取虚拟机的实时性能信息:

 private static List<List<Long>> getVmData(String vmName, String nameInfo, String groupInfo) throws RuntimeFaultFaultMsg, DatatypeConfigurationException{List<List<Long>> list = new ArrayList<List<Long>>();ManagedObjectReference vmmor = getVmByVmName(vmName);if (vmmor != null){List<PerfCounterInfo> cInfo = getPerfCounters();int i = 0;Map<Integer, PerfCounterInfo> counters = new HashMap<Integer, PerfCounterInfo>();for (Iterator<PerfCounterInfo> it = cInfo.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();List<PerfSampleInfo> listinfo = ((PerfEntityMetric) pValues.get(i)).getSampleInfo();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() + " ";for (PerfMetricId pmi : mMetrics){int counterId = pmi.getCounterId();if (counterId == listpems.get(vi).getId().getCounterId()){printInf += "[" + pmi.getCounterId() + ":" + pmi.getInstance() + "]    ";}}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 getVmCpuUsageByVmName(String VmName) throws RuntimeFaultFaultMsg, DatatypeConfigurationException{double ans = 0.0;List<List<Long>> list = getVmData(VmName, "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;}

这里的虚拟机cpu使用情况是百分制的,而且vsphere sdk返回的百分比的结果都是要除以100的,譬如真实结果是5%,那么vsphere sdk返回的就是500,需要做一下处理。

接下来获取cpu的可用量:

 public static double getVmCpuEntitlementByVmName(String VmName) throws RuntimeFaultFaultMsg, DatatypeConfigurationException{double ans = 0;List<List<Long>> list = getVmData(VmName, "entitlement", "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;}return ans;}

细心的读者可能发现的差别,这里只需要修改nameinfo以及groupinfo即可以获取不同的结果。
有一些监控数据不是实时获取的,通过上面的方法是获取不到的,比如:获取虚拟机cpu的个数,类似这种比较固定的信息,或者说配置信息更,就要另辟蹊径了。

 public static int getVmCpuNumByVmName(String VmName) throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg{int ans = 0;String cpuNum = getVmPropertyByVmName("summary.config.numCpu", VmName);ans = Integer.valueOf(cpuNum);return ans;}
 private static String getVmPropertyByVmName(String property, String VmName) throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg{String ans = null;RetrieveResult props = getRetrieveResultObjectWithProperty("VirtualMachine", 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(VmName)){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(VmName)){flag = true;}}if (path.equalsIgnoreCase(property)){String val = String.valueOf(dp.getVal());if (flag == true){ans = val;break;}}}}}}}return ans;}
 private static RetrieveResult getRetrieveResultObjectWithProperty(String MorName, String property) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg{ManagedObjectReference viewMgrRef = serviceContent.getViewManager();ManagedObjectReference propColl = serviceContent.getPropertyCollector();List<String> vmList = new ArrayList<String>();vmList.add(MorName);ManagedObjectReference cViewRef = vimPort.createContainerView(viewMgrRef, serviceContent.getRootFolder(), vmList, true);ObjectSpec oSpec = new ObjectSpec();oSpec.setObj(cViewRef);oSpec.setSkip(true);TraversalSpec tSpec = new TraversalSpec();tSpec.setName("traversalEntities");tSpec.setPath("view");tSpec.setSkip(false);tSpec.setType("ContainerView");oSpec.getSelectSet().add(tSpec);PropertySpec pSpec = new PropertySpec();pSpec.setType(MorName);pSpec.getPathSet().add("name");PropertySpec pSpecRPr = new PropertySpec();pSpecRPr.setType(MorName);pSpecRPr.getPathSet().add(property);PropertyFilterSpec fSpec = new PropertyFilterSpec();fSpec.getObjectSet().add(oSpec);fSpec.getPropSet().add(pSpec);fSpec.getPropSet().add(pSpecRPr);List<PropertyFilterSpec> fSpecList = new ArrayList<PropertyFilterSpec>();fSpecList.add(fSpec);RetrieveOptions ro = new RetrieveOptions();RetrieveResult props = vimPort.retrievePropertiesEx(propColl, fSpecList, ro);return props;}

这样就可以获取虚拟机的cpu个数的信息。

附加一个方法(获取vCenter下所有虚拟机的名称)

 public static List<String> getVmNames(){List<String> list = new ArrayList<String>();ManagedObjectReference rootFolder = serviceContent.getRootFolder();try{TraversalSpec tSpec = getVmTraversalSpec();PropertySpec propertySpec = new PropertySpec();propertySpec.setAll(Boolean.FALSE);propertySpec.getPathSet().add("name");propertySpec.setType("VirtualMachine");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 vmnm = null;List<DynamicProperty> dps = oc.getPropSet();if (dps != null){for (DynamicProperty dp : dps){vmnm = (String) dp.getVal();if (vmnm != null){list.add(vmnm);}}}}}}catch (SOAPFaultException sfe){printSoapFaultException(sfe);}catch (Exception e){e.printStackTrace();}return list;}

关于主机(HostSystem)信息的获取将在下一篇文章中呈现。敬请期待。

Modified: 居然忘了写一个重要的函数了,这里赶紧补上:

 private static List<PerfCounterInfo> getPerfCounters(){List<PerfCounterInfo> pciArr = null;try{PropertySpec propertySpec = new PropertySpec();propertySpec.setAll(Boolean.FALSE);propertySpec.getPathSet().add("perfCounter");propertySpec.setType("PerformanceManager");List<PropertySpec> propertySpecs = new ArrayList<PropertySpec>();propertySpecs.add(propertySpec);ObjectSpec objectSpec = new ObjectSpec();objectSpec.setObj(perfManager);List<ObjectSpec> objectSpecs = new ArrayList<ObjectSpec>();objectSpecs.add(objectSpec);PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();propertyFilterSpec.getPropSet().add(propertySpec);propertyFilterSpec.getObjectSet().add(objectSpec);List<PropertyFilterSpec> propertyFilterSpecs = new ArrayList<PropertyFilterSpec>();propertyFilterSpecs.add(propertyFilterSpec);List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(10);listpfs.add(propertyFilterSpec);List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);if (listobjcont != null){for (ObjectContent oc : listobjcont){List<DynamicProperty> dps = oc.getPropSet();if (dps != null){for (DynamicProperty dp : dps){List<PerfCounterInfo> pcinfolist = ((ArrayOfPerfCounterInfo) dp.getVal()).getPerfCounterInfo();pciArr = pcinfolist;}}}}}catch (SOAPFaultException sfe){printSoapFaultException(sfe);}catch (Exception e){e.printStackTrace();}return pciArr;}

欢迎跳转到本文的原文链接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-virtual-cpu/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

使用VMware VSphere WebService SDK进行开发 (二)——获取虚拟机cpu的使用情况相关推荐

  1. 使用VMware VSphere WebService SDK进行开发 (一)——基本信息阐述

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. 使用VMware VSphere WebService SDK进行开发 (七)——获取数据中心、集群、主机、虚拟机的目录结构

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  3. 使用VMware VSphere WebService SDK进行开发 (六)——检测告警信息

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  4. 使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  5. 使用VMware VSphere WebService SDK进行开发 (四)——获取集群(Cluster, ComputeResource)的相关信息

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. 使用VMware VSphere WebService SDK进行开发 (三)——获取主机(HostSystem)的基本信息

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. VMware vSphere 5.1 学习系列之七:虚拟机管理

    一. VMware vSphere 虚拟机简介 什么是虚拟机 与物理机一样,虚拟机是运行操作系统和应用程序的软件计算机.虚拟机包含一组规范和配置文件,由主机的物理资源支持.每个虚拟机都有可提供与物理硬 ...

  8. 微信企业号开发[二]——获取用户信息

    注:文中绿色部分为摘自微信官方文档 在<微信企业号开发[一]--创建应用>介绍了如何创建应用,但是当用户点击应用跳转到我们设定的URL时,其实并没有带上用户的任何信息,为了获取用户信息,我 ...

  9. [Mark]The problems solutions of vmware vsphere

    [Mark]The problems & solutions of vmware vsphere Vmware vSphere常见问题汇总(转) 发表于2014 年 10 月 28 日由yuk ...

最新文章

  1. css字体相关样式的处理
  2. SMTP 通过 ssh 通道发送垃圾邮件
  3. python怎么安装pip?
  4. 防止私自接交换机_防止私接家用路由器干扰DHCP功能,禁止用户手动设置IP地址-肖哥...
  5. android 删除模拟器,android – 如何从avd设备中删除脱机模拟器?
  6. 表单的ajax填入问题
  7. 关于计算机设计的英语作文,一篇关于计算机的看法的英语作文
  8. 开源软件在中小企业的应用_开源如何启动我的小企业
  9. 游戏外挂设计技术探讨(上)
  10. [NLP]OpenNLP块检测器(Chunker)的使用
  11. numpy教程:随机数模块numpy.random
  12. javascript 快速入门
  13. Qt编写地图综合应用30-世界地图
  14. LINUX打包并下载到本地
  15. 低碳节能智慧路灯杆解决方案
  16. 石墨烯 量子计算机,又是石墨烯,这次对量子计算机下手了
  17. 80386 CPU资源
  18. 制作好的种子怎么上传服务器,用BT如何上传自己的文件?
  19. 知识图谱下图神经网络、图计算、图数据、图数据库未来发展趋势如何?
  20. 屏幕距离和坐便转换工具_视频分辨率转换器(mp4视频分辨率转换器)V2.0.1 官方版...

热门文章

  1. cad中简单流程图制作_想要又快又好的画出世界级的流程图,这样牛掰的方法一定要知道...
  2. dubbo provider异步_dubbo九连问你知道多少?
  3. mycat配置访问oracle_教程 | MySql都会了,确定不学习一下MyCat分片?
  4. JavaFX 中使用多线程与保证 UI 线程安全
  5. HID接口设备-硬件要求
  6. .ASP NET Core中缓存问题案例
  7. .NET (c#)序列化和反序列化
  8. 下载煎蛋妹子图python代码[自用]
  9. 2016网络安全***赛记录
  10. Android学习建议