日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用VMware VSphere WebService SDK进行开发 (二)——获取虚拟机cpu的使用情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歡迎支持筆者新作:《深入理解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的使用情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本人体视频 | 日韩精品极品视频在线观看免费 | 日本成人精品在线 | 国产午夜精品视频 | 成人v片 | 国产午夜精品久久久久 | 精品人妻一区二区免费 | 成人在线一区二区三区 | 中文字幕 自拍 | 亚洲码在线观看 | 亚洲产国偷v产偷v自拍涩爱 | 人妻丰满熟妇av无码区hd | 狠狠操你 | 成人网站免费观看入口 | 中文字幕av网站 | 污片网站在线观看 | 干骚视频| 亚洲AV永久无码国产精品国产 | 亚洲日本色 | 精品成人av一区二区在线播放 | 午夜影院久久 | 美女诱惑一区 | 自拍偷拍专区 | 国产999| 朝桐光av在线 | 黄色综合| 亚洲四虎影院 | av日韩一区 | av在线第一页 | 国产精品厕所 | 亚洲熟女乱色一区二区三区 | 国产视频一区在线 | 美女一级| 最近免费中文字幕中文高清百度 | 日日夜夜2017| 欧美亚洲精品在线观看 | 国产在线麻豆精品观看 | 熟妇熟女乱妇乱女网站 | 国产又粗又猛又色又 | 91精品久久久久久久久 | 欧美日韩一区二区在线 | 69久久久| 亚洲a色 | 国产免费黄色小视频 | 久久国产福利 | 超碰在线观看av | 6080电视影片在线观看 | 中文字幕一区久久 | 国产区精品在线观看 | 神马一区二区三区 | 欧美精品色婷婷五月综合 | 日韩你懂的| 国产成年无码久久久久毛片 | 人妻熟女一区二区三区 | 欧洲熟妇的性久久久久久 | 一区二区网站 | 国产黄色大片 | 老司机精品在线 | www.午夜av| 国产不卡视频一区二区三区 | 中文字幕有码在线视频 | 国产高清精品在线观看 | 欧美日韩激情在线观看 | 天天干夜夜欢 | 久久av高潮av | 亚洲视频精品在线观看 | 亚洲人午夜射精精品日韩 | 日本aa大片 | 日韩精品一区二区三区久久 | 国内自拍青青草 | 伊人久久青青草 | 精品欧美一区二区三区在线观看 | 成人黄色免费网 | 亚洲在线一区 | 国产在线视频福利 | 欧美日韩人妻精品一区二区三区 | 久久久久久夜 | 欧美特级a | 97视频人人 | 免费观看亚洲视频 | 先锋影音亚洲 | 国产精品毛片久久 | 91禁在线观看 | 亚洲综合视频网站 | 亚洲二区在线播放视频 | 日本v片 | 一区二区三区视频在线观看 | 樱花影院电视剧免费 | 成人深夜电影 | 天天综合色 | 国产又色又爽又黄又免费 | 中文字幕在线看片 | 在线观看亚洲天堂 | 国产又粗又猛又爽又黄的视频一 | 色婷婷av一区二区 | 亚洲欧美一级 | 亚洲午夜激情视频 | 国产妞干网 | a级在线播放 |