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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

从VMware的vCenter中读取事件

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从VMware的vCenter中读取事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從VMware的vCenter中讀取事件,每幾分鐘從vCenter中的事件管理中讀取事件,得到事件后,再對事件做處理。上代碼。

連接vCenter的連接類

import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;import com.vmware.vim25.mo.ServiceInstance;/*** @Title: vCenter連接池*/public class VmwareConnectionUtil {private static Logger logger = LogManager.getLogger(VmwareConnectionUtil.class);private static final VmwareConnectionUtil instance = new VmwareConnectionUtil();private Map<String, ServiceInstance> poolMap = new HashMap<String, ServiceInstance>(); // Map<ip,ServiceInstance>private static final int GETTESTSTATUSTIMEOUT = 60;private VmwareConnectionUtil() {}/*** 單例模式* @return*/public static synchronized VmwareConnectionUtil getInstance() {return instance;}/*** 建立與vCenter的連接* @param url數組: IP, port, username, password* @return*/public synchronized ServiceInstance getConnection(String[] url) {String key = getKey(url);ServiceInstance conn = poolMap.get(key);if (conn != null) {try {conn.currentTime();} catch (Exception e) {logger.error("Get VmWare vCenter connection exception", e);poolMap.remove(key);conn.getServerConnection().logout();conn = null;}} else {poolMap.remove(key);conn = initConnection(url);poolMap.put(key, conn);}return conn;}private ServiceInstance initConnection(String[] param) {try { // ignoreSsl();} catch (Exception e1) {logger.error("Ignore SSL error", e1);}ServiceInstance conn = null;URL url = null;String spec = "";if(param[1] == null || param[1].trim().equals(""))spec = "https://" + param[0] + "/sdk"; //沒有端口elsespec = "https://" + param[0] + ":" + param[1] + "/sdk";try {url = new URL(spec);logger.info("Connect to VmWare vCenter " + url);} catch (MalformedURLException e) {logger.error("Connect to VmWare vCenter exception", e);return conn;}try {conn = new ServiceInstance(url, param[2], param[3], true);} catch (Exception e) {if (conn != null) {conn.getServerConnection().logout();}conn = null;logger.error("Failed to init VmWare vCenter webservice connection URL " + spec + ", user:" + param[2], e);}return conn;}private ServiceInstance initConnectTimeOut(final String[] param) {ServiceInstance conn = null;final ExecutorService exec = Executors.newFixedThreadPool(1);Callable<ServiceInstance> call = new Callable<ServiceInstance>() {public ServiceInstance call() throws Exception {ServiceInstance conn = initConnection(param);return conn;}};try {Future<ServiceInstance> future = exec.submit(call);conn = future.get(GETTESTSTATUSTIMEOUT, TimeUnit.SECONDS); // 任務處理超時時間設為60 秒} catch (TimeoutException ex) {logger.error("Init connect time out", ex);} catch (Exception e) {logger.error("Init connect exception", e);}exec.shutdown(); // 關閉線程池return conn;}/*** IP:userName|password* @param url* @return*/private String getKey(String[] url) {return url[0] + ":" + url[2] + "|" + url[3];}public boolean testConnection(String ip, String port, String username, String password) {String[] param = new String[] { ip, port, username, password };ServiceInstance serviceInstance = null;serviceInstance = initConnectTimeOut(param);if (serviceInstance == null) {return false;}return true;}public Map<String, ServiceInstance> getPoolMap() {return poolMap;}public void setPoolMap(Map<String, ServiceInstance> poolMap) {this.poolMap = poolMap;}public void deleteConnPoolMap(String key) {this.poolMap.remove(key);}}

從vCenter中讀取事件

import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;import com.collector.vm.vmware.util.VmwareConnectionUtil; import com.vmware.vim25.ComputeResourceEventArgument; import com.vmware.vim25.DatacenterEventArgument; import com.vmware.vim25.Event; import com.vmware.vim25.EventEx; import com.vmware.vim25.EventFilterSpec; import com.vmware.vim25.EventFilterSpecByTime; import com.vmware.vim25.ExtendedEvent; import com.vmware.vim25.HostEventArgument; import com.vmware.vim25.ManagedObjectReference; import com.vmware.vim25.VmEventArgument; import com.vmware.vim25.mo.EventManager; import com.vmware.vim25.mo.ServiceInstance;/*** @Title:采集Vmware事件* @description 從vCenter中的事件管理器中,每幾分鐘讀取新發生的事件*/ public class EventCollector {private Logger log = LogManager.getLogger(EventCollector.class);//上次事件采集時間點緩存  key:url , value:timeprivate static Map<String, Long> lastDateMap = new HashMap<String, Long>();private static final long interval = 1200000l; //20分鐘private static HashMap<String, String> keyMap = new HashMap<String, String>();//事件類型private String[] eventTypes = null;public EventCollector() {eventTypes = new String[]{"VmRemovedEvent","VmCreatedEvent","VmRenamedEvent","VmBeingRelocatedEvent","MigrationResourceWarningEvent","HostConnectionLostEvent","HostConnectedEvent","HostDisconnectedEvent","HostRemovedEvent","DatastoreRemovedOnHostEvent","HostOvercommittedEvent","HostCnxFailedTimeoutEvent","MigrationErrorEvent","VmCloneFailedEvent","VmConnectedEvent","VmDisconnectedEvent","ClusterCreatedEvent","ClusterDestroyedEvent","HostOvercommittedEvent","DatastoreDestroyedEvent","DatastoreFileDeletedEvent","DuplicateIpDetectedEvent","HostIpChangedEvent","ResourcePoolDestroyedEvent","VmFailedToPowerOnEvent","VmFailedToPowerOffEvent","EnteredMaintenanceModeEvent","VmStateFailedToRevertToSnapshot","VmStateRevertedToSnapshot"};}/*** 取采集開始時間* @param key* @return*/private long getLastTime(String key) {long lastTime = 0l;if (!lastDateMap.containsKey(key)) {Calendar startTime = Calendar.getInstance();startTime.setTimeInMillis(System.currentTimeMillis() - interval * 3); //前60分鐘的lastTime = startTime.getTimeInMillis();lastDateMap.put(key, lastTime);log.info("First start collect time from: "+ getSimpleDateFormat(lastTime) + ", key:" + key);}lastTime = lastDateMap.get(key);return lastTime;}/*** 查詢事件* @param url* @throws CollectorException*/private void doCollect(String[] url) {try {String key = "Datacenter@" + url[0];long lastEventDate = getLastTime(key);log.info("Start collect event data by " + url[0] + " from " + getSimpleDateFormat(lastEventDate));ServiceInstance serviceInstance = VmwareConnectionUtil.getInstance().getConnection(url);EventFilterSpec efs = new EventFilterSpec();efs.setType(eventTypes);//設置事件過濾器,根據時間查詢事件EventFilterSpecByTime tFilter = new EventFilterSpecByTime();Calendar startTime = Calendar.getInstance();startTime.setTimeInMillis(lastEventDate);tFilter.setBeginTime(startTime);efs.setTime(tFilter);EventManager evtMgr = serviceInstance.getEventManager();try {Event[] events = evtMgr.queryEvents(efs);if(events != null){for (Event event : events) {printEvent(event);String eventKey = key + "_" + event.getKey();if(!keyMap.containsKey(eventKey)) { //已有的事件不再處理EventProcessor ep = new EventProcessor();ep.process(event, url);} keyMap.put(eventKey, ""); }} elselog.warn("Query events from " + url[0] + " empty");} catch(Exception e) {log.error("Query events exception", e);}long nextStart = System.currentTimeMillis() - interval;lastDateMap.put(key, nextStart);log.info("Next start query event time: " + getSimpleDateFormat(nextStart) + ", key:" + key);} catch (Throwable e) {log.error("Collect Event exception by " + url[0], e);}}/*** 輸出事件信息* @param evt*/private void printEvent(Event evt) {String type = evt.getClass().getSimpleName();// 事件類型int key = evt.getKey();// 事件ID // int chainId = evt.getChainId();// 父或組ID // String userName = evt.getUserName();// 引發該事件的用戶long createdTime = evt.getCreatedTime().getTimeInMillis();// 創建時間String formattedMessage = evt.getFullFormattedMessage();// 事件內容String logInfo="type="+type;String eventTypeId="";if(evt instanceof EventEx){EventEx e=(EventEx)evt;eventTypeId=e.getEventTypeId();logInfo=logInfo+", eventTypeId="+eventTypeId;}else if(evt instanceof ExtendedEvent){ExtendedEvent e=(ExtendedEvent)evt;eventTypeId=e.getEventTypeId();logInfo=logInfo+", eventTypeId="+eventTypeId;}logInfo=logInfo+ ", key=" + key + ", time=" + getSimpleDateFormat(createdTime)+", message=" + formattedMessage;if (evt.getDatacenter() != null) {DatacenterEventArgument dc= evt.getDatacenter();ManagedObjectReference mor=dc.getDatacenter();logInfo=logInfo+"\n datacenter=" +dc.getName() + ", datacenterEntity=" + mor.getVal();}if (evt.getComputeResource() != null) {ComputeResourceEventArgument cr= evt.getComputeResource();ManagedObjectReference mor= cr.getComputeResource();logInfo=logInfo+"\n cluster=" +cr.getName() + ", clusterEntity=" + mor.getVal();}if (evt.getHost() != null) {HostEventArgument host= evt.getHost();ManagedObjectReference mor= host.getHost();logInfo=logInfo+"\n host:" +host.getName() + ", hostEntity=" + mor.getVal();}if (evt.getVm() != null) {VmEventArgument vm= evt.getVm();ManagedObjectReference mor= vm.getVm();logInfo=logInfo+"\n vm:" +vm.getName() + ", vmEntity:" + mor.getVal();}log.info(logInfo);}/*** 格式化時間* @param time* @return*/private String getSimpleDateFormat(long time) {if(time == 0l)return "";SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return format.format(new Date(time));}/*** 測試方法* @param args*/public static void main(String[] args) {try {Calendar startTime = Calendar.getInstance();startTime.roll(Calendar.DATE, false);//設置查詢,一天內的事件EventCollector collector = new EventCollector();String[] url = new String[4];url[1] = "";url[0] = "192.168.98.203"; //云中心的IPurl[2] = "administrator";url[3] = "ulabcde!@#";collector.doCollect(url);} catch (Exception e) {e.printStackTrace();}} }

VMware事件處理

package com.ultrapower.ultranms.monitor.collector.vm.vmware.event;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;import com.vmware.vim25.ComputeResourceEventArgument; import com.vmware.vim25.DatacenterEventArgument; import com.vmware.vim25.DatastoreEventArgument; import com.vmware.vim25.Event; import com.vmware.vim25.HostEventArgument; import com.vmware.vim25.VmEventArgument;/*** @Title:VMware事件處理*/ public class EventProcessor {private Logger log = LogManager.getLogger(EventProcessor.class);public void process(Event evt, String[] url) {String type = evt.getClass().getSimpleName();// 事件類型String text = evt.getFullFormattedMessage();// 事件內容String userName = evt.getUserName();// 引發該事件的用戶if(userName != null && !userName.trim().equals(""))text += ", 操作用戶:" + userName;if(type.equals("VmCreatedEvent") || type.equals("VmRemovedEvent")) { //成功創建虛擬機事件/虛擬機被清除回收事件if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);VmEventArgument vm = evt.getVm();}} else if(type.equals("VmRenamedEvent") || type.equals("VmBeingRelocatedEvent") || //虛擬機虛擬機重命名事件/虛擬機被遷移事件type.equals("MigrationErrorEvent") || type.equals("VmCloneFailedEvent") || //遷移錯誤事件/克隆失敗事件type.equals("VmDisconnectedEvent") || //虛擬機斷開連接事件type.equals("MigrationResourceWarningEvent") || type.equals("VmFailedToPowerOnEvent") || type.equals("VmFailedToPowerOffEvent")){ //資源遷移警告事件/虛擬機啟動失敗事件/虛擬機關閉失敗事件if (evt.getVm() != null) {VmEventArgument vm = evt.getVm();System.out.println("VM: " + vm.getVm().getVal() + ", " + vm.getName() + ", type: " + type + ", text: " + text);} else if (evt.getHost() != null) {HostEventArgument host = evt.getHost();System.out.println("Host: " + host.getName() + ", type: " + type + ", text: " + text);} else if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("VmConnectedEvent")){ //虛擬機已連接事件if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("ClusterCreatedEvent") || type.equals("ClusterDestroyedEvent") ) { //集群創建/刪除事件if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("HostOvercommittedEvent")) { //集群超出主機容量事件if (evt.getComputeResource() != null) {ComputeResourceEventArgument cr = evt.getComputeResource();System.out.println("ComputeResource: " + cr.getName() + ", type: " + type + ", text: " + text);} else if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("HostConnectionLostEvent") || type.equals("HostRemovedEvent")) { //主機連接/主機刪除事件if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("HostConnectedEvent")) { //主機已連接事件if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("HostDisconnectedEvent") || type.equals("HostIpChangedEvent") || //主機斷開/主機IP改變事件type.equals("DatastoreRemovedOnHostEvent") || type.equals("EnteredMaintenanceModeEvent") || //刪除在主機的數據存儲事件/已經進入維護模式type.equals("HostCnxFailedTimeoutEvent") || type.equals("DuplicateIpDetectedEvent")) { //主機連接超時事件/檢測到IP重復事件if (evt.getHost() != null) {HostEventArgument host = evt.getHost();System.out.println("Host: " + host.getName() + ", type: " + type + ", text: " + text);} else if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("DatastoreDestroyedEvent") ) { //數據存儲被刪除if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("DatastoreFileDeletedEvent")) { //刪除數據存儲文件事件if (evt.getDs() != null) {DatastoreEventArgument ce = evt.getDs();System.out.println("Datastore: " + ce.getName() + ", type: " + type + ", text: " + text);} else if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}} else if(type.equals("VmStateFailedToRevertToSnapshot") || type.equals("VmStateRevertedToSnapshot")) { //創建快照失敗, 創建快照if (evt.getVm() != null) {VmEventArgument vm = evt.getVm();System.out.println("VM: " + vm.getVm().getVal() + ", " + vm.getName() + ", type: " + type + ", text: " + text);} else if (evt.getDatacenter() != null) {DatacenterEventArgument dc = evt.getDatacenter();System.out.println("DataCenter: " + dc.getDatacenter().getVal() + ", type: " + type + ", text: " + text);}}}}

?

總結

以上是生活随笔為你收集整理的从VMware的vCenter中读取事件的全部內容,希望文章能夠幫你解決所遇到的問題。

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