关键词搜索

源码搜索 ×
×

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

发布2015-11-11浏览13173次

详情内容

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

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

 

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

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

 

  1. private static TraversalSpec getVmTraversalSpec()
  2. {
  3. TraversalSpec vAppToVM = new TraversalSpec();
  4. vAppToVM.setName("vAppToVM");
  5. vAppToVM.setType("VirtualApp");
  6. vAppToVM.setPath("vm");
  7. TraversalSpec vAppToVApp = new TraversalSpec();
  8. vAppToVApp.setName("vAppToVApp");
  9. vAppToVApp.setType("VirtualApp");
  10. vAppToVApp.setPath("resourcePool");
  11. SelectionSpec vAppRecursion = new SelectionSpec();
  12. vAppRecursion.setName("vAppToVApp");
  13. SelectionSpec vmInVApp = new SelectionSpec();
  14. vmInVApp.setName("vAppToVM");
  15. List<SelectionSpec> vAppToVMSS = new ArrayList<SelectionSpec>();
  16. vAppToVMSS.add(vAppRecursion);
  17. vAppToVMSS.add(vmInVApp);
  18. vAppToVApp.getSelectSet().addAll(vAppToVMSS);
  19. SelectionSpec sSpec = new SelectionSpec();
  20. sSpec.setName("VisitFolders");
  21. TraversalSpec dataCenterToVMFolder = new TraversalSpec();
  22. dataCenterToVMFolder.setName("DataCenterToVMFolder");
  23. dataCenterToVMFolder.setType("Datacenter");
  24. dataCenterToVMFolder.setPath("vmFolder");
  25. dataCenterToVMFolder.setSkip(false);
  26. dataCenterToVMFolder.getSelectSet().add(sSpec);
  27. TraversalSpec traversalSpec = new TraversalSpec();
  28. traversalSpec.setName("VisitFolders");
  29. traversalSpec.setType("Folder");
  30. traversalSpec.setPath("childEntity");
  31. traversalSpec.setSkip(false);
  32. List<SelectionSpec> sSpecArr = new ArrayList<SelectionSpec>();
  33. sSpecArr.add(sSpec);
  34. sSpecArr.add(dataCenterToVMFolder);
  35. sSpecArr.add(vAppToVM);
  36. sSpecArr.add(vAppToVApp);
  37. traversalSpec.getSelectSet().addAll(sSpecArr);
  38. return traversalSpec;
  39. }
  1. private static ManagedObjectReference getVmByVmName(String vmName)
  2. {
  3. ManagedObjectReference retVal = null;
  4. ManagedObjectReference rootFolder = serviceContent.getRootFolder();
  5. try
  6. {
  7. TraversalSpec tSpec = getVmTraversalSpec();
  8. PropertySpec propertySpec = new PropertySpec();
  9. propertySpec.setAll(Boolean.FALSE);
  10. propertySpec.getPathSet().add("name");
  11. propertySpec.setType("VirtualMachine");
  12. ObjectSpec objectSpec = new ObjectSpec();
  13. objectSpec.setObj(rootFolder);
  14. objectSpec.setSkip(Boolean.TRUE);
  15. objectSpec.getSelectSet().add(tSpec);
  16. PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
  17. propertyFilterSpec.getPropSet().add(propertySpec);
  18. propertyFilterSpec.getObjectSet().add(objectSpec);
  19. List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(1);
  20. listpfs.add(propertyFilterSpec);
  21. List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);
  22. if (listobjcont != null)
  23. {
  24. for (ObjectContent oc : listobjcont)
  25. {
  26. ManagedObjectReference mr = oc.getObj();
  27. String vmnm = null;
  28. List<DynamicProperty> dps = oc.getPropSet();
  29. if (dps != null)
  30. {
  31. for (DynamicProperty dp : dps)
  32. {
  33. vmnm = (String) dp.getVal();
  34. }
  35. }
  36. if (vmnm != null && vmnm.equals(vmName))
  37. {
  38. retVal = mr;
  39. break;
  40. }
  41. }
  42. }
  43. }
  44. catch (SOAPFaultException sfe)
  45. {
  46. printSoapFaultException(sfe);
  47. }
  48. catch (Exception e)
  49. {
  50. e.printStackTrace();
  51. }
  52. return retVal;
  53. }

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

 

 

  1. private static List<List<Long>> getVmData(String vmName, String nameInfo, String groupInfo) throws RuntimeFaultFaultMsg, DatatypeConfigurationException
  2. {
  3. List<List<Long>> list = new ArrayList<List<Long>>();
  4. ManagedObjectReference vmmor = getVmByVmName(vmName);
  5. if (vmmor != null)
  6. {
  7. List<PerfCounterInfo> cInfo = getPerfCounters();
  8. int i = 0;
  9. Map<Integer, PerfCounterInfo> counters = new HashMap<Integer, PerfCounterInfo>();
  10. for (Iterator<PerfCounterInfo> it = cInfo.iterator(); it.hasNext();)
  11. {
  12. PerfCounterInfo pcInfo = (PerfCounterInfo) it.next();
  13. counters.put(new Integer(pcInfo.getKey()), pcInfo);
  14. }
  15. List<PerfMetricId> listpermeid = vimPort.queryAvailablePerfMetric(perfManager, vmmor, null, null, new Integer(20));
  16. ArrayList<PerfMetricId> mMetrics = new ArrayList<PerfMetricId>();
  17. if (listpermeid != null)
  18. {
  19. for (int index = 0; index < listpermeid.size(); ++index)
  20. {
  21. if (counters.containsKey(new Integer(listpermeid.get(index).getCounterId())))
  22. {
  23. mMetrics.add(listpermeid.get(index));
  24. }
  25. }
  26. }
  27. PerfQuerySpec qSpec = new PerfQuerySpec();
  28. qSpec.setEntity(vmmor);
  29. qSpec.setMaxSample(new Integer(10));
  30. qSpec.getMetricId().addAll(mMetrics);
  31. qSpec.setIntervalId(new Integer(20));
  32. List<PerfQuerySpec> qSpecs = new ArrayList<PerfQuerySpec>();
  33. qSpecs.add(qSpec);
  34. List<PerfEntityMetricBase> listpemb = vimPort.queryPerf(perfManager, qSpecs);
  35. List<PerfEntityMetricBase> pValues = listpemb;
  36. for (i = 0; i < pValues.size(); i++)
  37. {
  38. List<PerfMetricSeries> listpems = ((PerfEntityMetric) pValues.get(i)).getValue();
  39. List<PerfSampleInfo> listinfo = ((PerfEntityMetric) pValues.get(i)).getSampleInfo();
  40. for (int vi = 0; vi < listpems.size(); ++vi)
  41. {
  42. String printInf = "";
  43. PerfCounterInfo pci = (PerfCounterInfo) counters.get(new Integer(listpems.get(vi).getId().getCounterId()));
  44. if (pci != null)
  45. {
  46. if (pci.getNameInfo().getKey().equalsIgnoreCase(nameInfo) && pci.getGroupInfo().getKey().equalsIgnoreCase(groupInfo))
  47. {
  48. printInf += vi + ":" + pci.getNameInfo().getSummary() + ":" + pci.getNameInfo().getKey() + ":" + pci.getNameInfo().getLabel() + ":"
  49. + pci.getGroupInfo().getKey() + ":" + pci.getGroupInfo().getLabel() + ":" + pci.getGroupInfo().getSummary() + " ";
  50. for (PerfMetricId pmi : mMetrics)
  51. {
  52. int counterId = pmi.getCounterId();
  53. if (counterId == listpems.get(vi).getId().getCounterId())
  54. {
  55. printInf += "[" + pmi.getCounterId() + ":" + pmi.getInstance() + "] ";
  56. }
  57. }
  58. if (listpems.get(vi) instanceof PerfMetricIntSeries)
  59. {
  60. PerfMetricIntSeries val = (PerfMetricIntSeries) listpems.get(vi);
  61. List<Long> lislon = val.getValue();
  62. for (Long k : lislon)
  63. {
  64. printInf += k + " ";
  65. }
  66. list.add(lislon);
  67. }
  68. printInf += " " + pci.getUnitInfo().getKey() + " " + pci.getUnitInfo().getLabel() + " " + pci.getUnitInfo().getSummary();
  69. System.out.println(printInf);
  70. }
  71. }
  72. }
  73. }
  74. }
  75. return list;
  76. }


真正获取cpu使用情况的方法只是调用上面的方法做一些简单的处理:

 

 

  1. public static double getVmCpuUsageByVmName(String VmName) throws RuntimeFaultFaultMsg, DatatypeConfigurationException
  2. {
  3. double ans = 0.0;
  4. List<List<Long>> list = getVmData(VmName, "usage", "cpu");
  5. long maxInner = 0;
  6. int times = 0;
  7. for (List<Long> listOuter : list)
  8. {
  9. long tempInner = 0;
  10. for (long inner : listOuter)
  11. {
  12. tempInner += inner;
  13. }
  14. if (tempInner > maxInner)
  15. {
  16. maxInner = tempInner;
  17. times = listOuter.size();
  18. }
  19. }
  20. if (times != 0)
  21. {
  22. ans = (double) maxInner / times;
  23. }
  24. ans = ans / 100;
  25. return ans;
  26. }


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

 

接下来获取cpu的可用量:

 

  1. public static double getVmCpuEntitlementByVmName(String VmName) throws RuntimeFaultFaultMsg, DatatypeConfigurationException
  2. {
  3. double ans = 0;
  4. List<List<Long>> list = getVmData(VmName, "entitlement", "cpu");
  5. long maxInner = 0;
  6. int times = 0;
  7. for (List<Long> listOuter : list)
  8. {
  9. long tempInner = 0;
  10. for (long inner : listOuter)
  11. {
  12. tempInner += inner;
  13. }
  14. if (tempInner > maxInner)
  15. {
  16. maxInner = tempInner;
  17. times = listOuter.size();
  18. }
  19. }
  20. if (times != 0)
  21. {
  22. ans = (double) maxInner / times;
  23. }
  24. return ans;
  25. }

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

 

 

  1. public static int getVmCpuNumByVmName(String VmName) throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg
  2. {
  3. int ans = 0;
  4. String cpuNum = getVmPropertyByVmName("summary.config.numCpu", VmName);
  5. ans = Integer.valueOf(cpuNum);
  6. return ans;
  7. }
  1. private static String getVmPropertyByVmName(String property, String VmName) throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg
  2. {
  3. String ans = null;
  4. RetrieveResult props = getRetrieveResultObjectWithProperty("VirtualMachine", property);
  5. if (props != null)
  6. {
  7. Boolean flag = false;
  8. if (property.compareToIgnoreCase("name") < 0)
  9. {
  10. for (ObjectContent oc : props.getObjects())
  11. {
  12. if (flag == true)
  13. {
  14. break;
  15. }
  16. String path = null;
  17. List<DynamicProperty> dps = oc.getPropSet();
  18. if (dps != null)
  19. {
  20. for (DynamicProperty dp : dps)
  21. {
  22. path = dp.getName();
  23. if (path.equalsIgnoreCase(property))
  24. {
  25. String val = String.valueOf(dp.getVal());
  26. ans = val;
  27. }
  28. if (path.equalsIgnoreCase("name"))
  29. {
  30. String value = (String) dp.getVal();
  31. if (value.equals(VmName))
  32. {
  33. flag = true;
  34. break;
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }
  41. else
  42. {
  43. for (ObjectContent oc : props.getObjects())
  44. {
  45. if (flag == true)
  46. {
  47. break;
  48. }
  49. String path = null;
  50. List<DynamicProperty> dps = oc.getPropSet();
  51. if (dps != null)
  52. {
  53. for (DynamicProperty dp : dps)
  54. {
  55. path = dp.getName();
  56. if (path.equalsIgnoreCase("name"))
  57. {
  58. String value = (String) dp.getVal();
  59. if (value.equals(VmName))
  60. {
  61. flag = true;
  62. }
  63. }
  64. if (path.equalsIgnoreCase(property))
  65. {
  66. String val = String.valueOf(dp.getVal());
  67. if (flag == true)
  68. {
  69. ans = val;
  70. break;
  71. }
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }
  78. return ans;
  79. }
  1. private static RetrieveResult getRetrieveResultObjectWithProperty(String MorName, String property) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg
  2. {
  3. ManagedObjectReference viewMgrRef = serviceContent.getViewManager();
  4. ManagedObjectReference propColl = serviceContent.getPropertyCollector();
  5. List<String> vmList = new ArrayList<String>();
  6. vmList.add(MorName);
  7. ManagedObjectReference cViewRef = vimPort.createContainerView(viewMgrRef, serviceContent.getRootFolder(), vmList, true);
  8. ObjectSpec oSpec = new ObjectSpec();
  9. oSpec.setObj(cViewRef);
  10. oSpec.setSkip(true);
  11. TraversalSpec tSpec = new TraversalSpec();
  12. tSpec.setName("traversalEntities");
  13. tSpec.setPath("view");
  14. tSpec.setSkip(false);
  15. tSpec.setType("ContainerView");
  16. oSpec.getSelectSet().add(tSpec);
  17. PropertySpec pSpec = new PropertySpec();
  18. pSpec.setType(MorName);
  19. pSpec.getPathSet().add("name");
  20. PropertySpec pSpecRPr = new PropertySpec();
  21. pSpecRPr.setType(MorName);
  22. pSpecRPr.getPathSet().add(property);
  23. PropertyFilterSpec fSpec = new PropertyFilterSpec();
  24. fSpec.getObjectSet().add(oSpec);
  25. fSpec.getPropSet().add(pSpec);
  26. fSpec.getPropSet().add(pSpecRPr);
  27. List<PropertyFilterSpec> fSpecList = new ArrayList<PropertyFilterSpec>();
  28. fSpecList.add(fSpec);
  29. RetrieveOptions ro = new RetrieveOptions();
  30. RetrieveResult props = vimPort.retrievePropertiesEx(propColl, fSpecList, ro);
  31. return props;
  32. }

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

 

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

  1. public static List<String> getVmNames()
  2. {
  3. List<String> list = new ArrayList<String>();
  4. ManagedObjectReference rootFolder = serviceContent.getRootFolder();
  5. try
  6. {
  7. TraversalSpec tSpec = getVmTraversalSpec();
  8. PropertySpec propertySpec = new PropertySpec();
  9. propertySpec.setAll(Boolean.FALSE);
  10. propertySpec.getPathSet().add("name");
  11. propertySpec.setType("VirtualMachine");
  12. ObjectSpec objectSpec = new ObjectSpec();
  13. objectSpec.setObj(rootFolder);
  14. objectSpec.setSkip(Boolean.TRUE);
  15. objectSpec.getSelectSet().add(tSpec);
  16. PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
  17. propertyFilterSpec.getPropSet().add(propertySpec);
  18. propertyFilterSpec.getObjectSet().add(objectSpec);
  19. List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(1);
  20. listpfs.add(propertyFilterSpec);
  21. List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);
  22. if (listobjcont != null)
  23. {
  24. for (ObjectContent oc : listobjcont)
  25. {
  26. String vmnm = null;
  27. List<DynamicProperty> dps = oc.getPropSet();
  28. if (dps != null)
  29. {
  30. for (DynamicProperty dp : dps)
  31. {
  32. vmnm = (String) dp.getVal();
  33. if (vmnm != null)
  34. {
  35. list.add(vmnm);
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. catch (SOAPFaultException sfe)
  43. {
  44. printSoapFaultException(sfe);
  45. }
  46. catch (Exception e)
  47. {
  48. e.printStackTrace();
  49. }
  50. return list;
  51. }

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

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

 

  1. private static List<PerfCounterInfo> getPerfCounters()
  2. {
  3. List<PerfCounterInfo> pciArr = null;
  4. try
  5. {
  6. PropertySpec propertySpec = new PropertySpec();
  7. propertySpec.setAll(Boolean.FALSE);
  8. propertySpec.getPathSet().add("perfCounter");
  9. propertySpec.setType("PerformanceManager");
  10. List<PropertySpec> propertySpecs = new ArrayList<PropertySpec>();
  11. propertySpecs.add(propertySpec);
  12. ObjectSpec objectSpec = new ObjectSpec();
  13. objectSpec.setObj(perfManager);
  14. List<ObjectSpec> objectSpecs = new ArrayList<ObjectSpec>();
  15. objectSpecs.add(objectSpec);
  16. PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
  17. propertyFilterSpec.getPropSet().add(propertySpec);
  18. propertyFilterSpec.getObjectSet().add(objectSpec);
  19. List<PropertyFilterSpec> propertyFilterSpecs = new ArrayList<PropertyFilterSpec>();
  20. propertyFilterSpecs.add(propertyFilterSpec);
  21. List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(10);
  22. listpfs.add(propertyFilterSpec);
  23. List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);
  24. if (listobjcont != null)
  25. {
  26. for (ObjectContent oc : listobjcont)
  27. {
  28. List<DynamicProperty> dps = oc.getPropSet();
  29. if (dps != null)
  30. {
  31. for (DynamicProperty dp : dps)
  32. {
  33. List<PerfCounterInfo> pcinfolist = ((ArrayOfPerfCounterInfo) dp.getVal()).getPerfCounterInfo();
  34. pciArr = pcinfolist;
  35. }
  36. }
  37. }
  38. }
  39. }
  40. catch (SOAPFaultException sfe)
  41. {
  42. printSoapFaultException(sfe);
  43. }
  44. catch (Exception e)
  45. {
  46. e.printStackTrace();
  47. }
  48. return pciArr;
  49. }

 

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

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

 

 

 

 

 

 

相关技术文章

最新源码

下载排行榜

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载