最近一直沒有更新這部分的內容,會利用五一時間完成vcenter這一個系列。
這里先給大家一本關於vijava開發的書,比較實用。
地址:http://pan.baidu.com/s/1gfkl9mj。密碼:t1y3
有網友評論要數據存儲讀寫速度及延遲之后時間的實現。今天就先介紹關於java實現實時監控vcenter狀態的內容,包括CPU、內存、網絡、存儲等。
在看這篇前如果還是新手,建議先看下我的第一篇 http://www.cnblogs.com/xiaodige/p/6721517.html(vijava基本連接和數據中心信息獲取)
先說一下我之前是怎么發現,CPU、內存、網絡、存儲等可以監控的內容。我用vsphere client連接vcenter查看客戶端所能監控的屬性.
建議大家在實現功能前,先看下官方文檔關於性能監控的知識。貼上連接vcenter6.0的官方文檔連接。http://pubs.vmware.com/vsphere-60/index.jsp
比如要監控虛擬機的性能信息:首先得保證虛擬機開機,選擇“性能選項”,點擊“圖標選項”,這樣就能看到它所支持的性能監控信息。下面貼圖:

下圖左邊就是該對象具體能監控的信息,右邊就是具體性能,使用率啊等等。

做性能監控這塊,如果不知道具體能監控對象的哪些屬性就打開客戶端看看。下面就貼上具體的java實現代碼。
package com.iking.vmware.performance; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.iking.vmware.bean.PerformanceManage; import com.iking.vmware.bean.VsphereConst; import com.iking.vmware.connection.ConnectedVimServiceBase; import com.iking.vmware.vim25.PerfCounterInfo; import com.iking.vmware.vim25.PerfEntityMetric; import com.iking.vmware.vim25.PerfEntityMetricBase; import com.iking.vmware.vim25.PerfMetricId; import com.iking.vmware.vim25.PerfMetricIntSeries; import com.iking.vmware.vim25.PerfMetricSeries; import com.iking.vmware.vim25.PerfQuerySpec; import com.iking.vmware.vim25.PerfSampleInfo; import com.iking.vmware.vim25.mo.Folder; import com.iking.vmware.vim25.mo.HostSystem; import com.iking.vmware.vim25.mo.InventoryNavigator; import com.iking.vmware.vim25.mo.ManagedEntity; import com.iking.vmware.vim25.mo.PerformanceManager; /** * @description 監控統計vcenter所有對象性能數據 * @date 2017年2月9日11:46:35 * @version 1.1 * @author DiWk */ public class PerformanceCounter { private ConnectedVimServiceBase cs = null; public ConnectedVimServiceBase getCs() { return cs; } public void setCs(ConnectedVimServiceBase cs) { this.cs = cs; } /** * @description 根據屬性名稱、類型、對象、采集間隔獲取所有的性能數據 * @date 2017年2月8日14:37:58 * @return PerformanceMap 性能數據map對象 * @version 1.1 * @author DiWk */ public Map<String, PerformanceManage> getPerfData(String nameInfo, List<String> groupInfo, ManagedEntity mo, Integer interval) { Map<String, PerformanceManage> PerformanceMap = null; Date date = new Date(); Date sTime = new Date(date.getTime() - 24 * 60 * 60 * 1000); Calendar calBegin = Calendar.getInstance(); calBegin.setTime(sTime); Calendar calEnd = Calendar.getInstance(); calEnd.setTime(date); try { PerformanceMap = new HashMap<String, PerformanceManage>(); if (mo != null) { PerformanceManager performanceManager = cs.si.getPerformanceManager(); PerfCounterInfo[] cInfo = performanceManager.getPerfCounter(); Map<Integer, PerfCounterInfo> counters = new HashMap<Integer, PerfCounterInfo>(); for (PerfCounterInfo pcInfo : cInfo) { counters.put(new Integer(pcInfo.getKey()), pcInfo); } PerfMetricId[] listpermeid = performanceManager.queryAvailablePerfMetric(mo, null, null, interval); ArrayList<PerfMetricId> mMetrics = new ArrayList<PerfMetricId>(); if (listpermeid != null) { for (int index = 0; index < listpermeid.length; ++index) { if (counters.containsKey(new Integer(listpermeid[index].getCounterId()))) { mMetrics.add(listpermeid[index]); } } } PerfQuerySpec qSpec = new PerfQuerySpec(); qSpec.setEntity(mo.getMOR()); qSpec.setMetricId(listpermeid); qSpec.setStartTime(calBegin); qSpec.setEndTime(calEnd); qSpec.setIntervalId(interval); qSpec.setFormat("normal"); PerfQuerySpec[] arryQuery = { qSpec }; PerfEntityMetricBase[] pValues = performanceManager.queryPerf(arryQuery); if (pValues == null || pValues.length <= 0) { return null; } PerfSampleInfo[] listperfsinfo = ((PerfEntityMetric) pValues[0]).getSampleInfo(); for (int i = 0; i < pValues.length; i++) { PerfMetricSeries[] listpems = ((PerfEntityMetric) pValues[i]).getValue(); for (int vi = 0; vi < listpems.length; ++vi) { PerfCounterInfo pci = (PerfCounterInfo) counters .get(new Integer(listpems[vi].getId().getCounterId())); if (pci != null) { for (String Info : groupInfo) { PerformanceManage performanceManage = new PerformanceManage(); performanceManage.setStartTime(listperfsinfo[0].getTimestamp().getTime()); performanceManage .setEndTime((listperfsinfo[listperfsinfo.length - 1]).getTimestamp().getTime()); if (pci.getNameInfo().getKey().equalsIgnoreCase(nameInfo) && pci.getGroupInfo().getKey().equalsIgnoreCase(Info)) { if (listpems[vi] instanceof PerfMetricIntSeries) { PerfMetricIntSeries val = (PerfMetricIntSeries) listpems[vi]; long[] lislon = val.getValue(); List<Long> asList = new ArrayList<Long>(); for (Long k : lislon) { asList.add(k); } performanceManage.setPerformanceValues(asList); PerformanceMap.put(Info, performanceManage); } } } } } } } } catch (Exception e) { e.printStackTrace(); } return PerformanceMap; } /** main測試方法 */ public static void main(String[] args) throws Exception { PerformanceCounter performanceCounter2 = new PerformanceCounter(); ConnectedVimServiceBase cs = new ConnectedVimServiceBase(); cs.connect("192.168.1.253", "administrator@vsphere.local", "Iking!@#456"); performanceCounter2.setCs(cs); Folder rootFolder = cs.si.getRootFolder(); HostSystem dataCenter = (HostSystem) new InventoryNavigator(rootFolder) .searchManagedEntity(VsphereConst.HOSTSYSTEM, "192.168.1.254"); List<String> listNm = new ArrayList<String>(); listNm.add("datastore"); Map<String, PerformanceManage> perfData = performanceCounter2.getPerfData("write", listNm, dataCenter, 20); PerformanceManage performanceManage = perfData.get("datastore"); List<Long> performanceValues = performanceManage.getPerformanceValues(); System.out.println(performanceValues.toString()); } }
上面就是通過Java代碼實現對vcenter性能的實時監控,相信大家結合官方文檔和我分享的電子書一定能實現自己想要的效果。
關於數據存儲並沒有歷史信息的監控,只有實時信息的監控。所以當我統計數據存儲的歷史信息時,我是累加了所有的虛擬機、主機關於數據存儲的數據。我知道這不是一個很好的方法,但是目前沒想到更好的。希望和網友分享學習。
