从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中读取事件相关推荐

  1. VMware 修复 vCenter 服务器中的严重 RCE 漏洞

     聚焦源代码安全,网罗国内外最新资讯! 作者:Pierluigi Paganini 编译:奇安信代码卫士团队 VMware 修复 vCenter Server 虚拟基础设施管理平台中的一个严重远程代码 ...

  2. PowerShell 2.0管理事件日志(一)查看和读取事件日志

    事件日志是操作系统用来保存本身及其他程序信息的工具,本文将会介绍如何通过PowerShell脚本阅读事件日志并创建新的日志条目.Windows系统中包含多种事件日志,在Windows XP系统中包括4 ...

  3. 使用VMware Infrastructure Client中的VMware Server 2.0.x的管理

    使用VMware Infrastructure Client中                    VMware Server 2.0.x的管理 VMware Server是一个很酷的免费产品,您可 ...

  4. 在jQuery中删除事件处理程序的最佳方法?

    我有一个input type="image" . 这就像Microsoft Excel中的单元格注释一样. 如果有人在与该input-image配对的文本框中input-image ...

  5. 编写图形界面程序,接受用户输入的5个浮点数据和一个文件目录名,将这五个数据保存在该文件中,再从文件中读取出来并且进行从大到小排序,然后再一次追加保存在该文件中。

    File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的 ...

  6. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

  7. JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

       前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...

  8. js中的事件循环和宏任务和微任务的理解

    参考许多大神的文章,写下自己的理解 事件循环: 说到事件循环就得谈到js中同步和异步的执行顺序 1.javascript将任务分为同步任务和异步任务,同步任务放到主线中,异步函数首先进行回调函数注册. ...

  9. 【转】Dynamics 365中的事件框架与事件执行管道(Event execution pipeline)

    本文介绍了Microsoft Dynamics 365(以下简称D365)中的两个概念,事件框架(Event Framework)与事件执行管道(Event execution pipeline). ...

  10. 中读取数据_Flink入门实战 (中)

    一.Flink 流处理 API 1.Environment getExecutionEnvironment 创建一个执行环境,表示当前执行程序的上下文. 如果程序是独立调用的,则 此方法返回本地执行环 ...

最新文章

  1. linuxmysql乱码
  2. pyinstaller安装以及生成exe文件
  3. 京东输血变造血-丰收节交易会·罗伟:农村谋定物流服务能力
  4. 移动端-ibokan
  5. linux 命令行字符终端terminal下强制清空回收站
  6. 通讯中断 pc_S7程序RFID 与PC连接区别FB 65/UDT65
  7. Linux程序分析工具介绍—ldd,nm
  8. 3D-BoNet:比3D点云实例分割算法快10倍!代码已开源
  9. MyBatis insert操作插入,返回主键from官方
  10. switch语句训练
  11. CentOs7安装Oracle11g中的坑
  12. 2018美国基金业年鉴-数据图表简版
  13. Linux进程管理和控制服务
  14. 《京东话费充值系统架构演进实践》阅读笔记
  15. python爬虫+数据分析完整流程--豆瓣电影分类排行榜
  16. 物联网卡开启养老新模式
  17. 保利清能西海岸收房步骤和费用明细
  18. 用 Kotlin 的函数式编程 替代 GOF 设计模式
  19. 茶饮行业舆情管理方案
  20. RabbitMQ:Consumers的介绍和使用

热门文章

  1. 新时代火热技术栈:大数据->人工智能(AI)->区块链
  2. 计算机里pow函数是什么,pow函数是什么?
  3. 【雅思大作文考官范文】——第七篇: 'dress code' essay
  4. Auto.js蚂蚁森林自动偷能量脚本
  5. 云计算基础与应用 第二章 云计算技术架构
  6. 投 资 网 站 建 设 方 案
  7. python解析pdf中文乱码_Python解决中文乱码.pdf
  8. 生而神灵,弱而能言,幼而徇齐,长而敦敏,成而聪明
  9. PostgreSQL下载地址
  10. SAS实验2——假设检验