从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中读取事件相关推荐
- VMware 修复 vCenter 服务器中的严重 RCE 漏洞
聚焦源代码安全,网罗国内外最新资讯! 作者:Pierluigi Paganini 编译:奇安信代码卫士团队 VMware 修复 vCenter Server 虚拟基础设施管理平台中的一个严重远程代码 ...
- PowerShell 2.0管理事件日志(一)查看和读取事件日志
事件日志是操作系统用来保存本身及其他程序信息的工具,本文将会介绍如何通过PowerShell脚本阅读事件日志并创建新的日志条目.Windows系统中包含多种事件日志,在Windows XP系统中包括4 ...
- 使用VMware Infrastructure Client中的VMware Server 2.0.x的管理
使用VMware Infrastructure Client中 VMware Server 2.0.x的管理 VMware Server是一个很酷的免费产品,您可 ...
- 在jQuery中删除事件处理程序的最佳方法?
我有一个input type="image" . 这就像Microsoft Excel中的单元格注释一样. 如果有人在与该input-image配对的文本框中input-image ...
- 编写图形界面程序,接受用户输入的5个浮点数据和一个文件目录名,将这五个数据保存在该文件中,再从文件中读取出来并且进行从大到小排序,然后再一次追加保存在该文件中。
File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的 ...
- HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...
- JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象
前 言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...
- js中的事件循环和宏任务和微任务的理解
参考许多大神的文章,写下自己的理解 事件循环: 说到事件循环就得谈到js中同步和异步的执行顺序 1.javascript将任务分为同步任务和异步任务,同步任务放到主线中,异步函数首先进行回调函数注册. ...
- 【转】Dynamics 365中的事件框架与事件执行管道(Event execution pipeline)
本文介绍了Microsoft Dynamics 365(以下简称D365)中的两个概念,事件框架(Event Framework)与事件执行管道(Event execution pipeline). ...
- 中读取数据_Flink入门实战 (中)
一.Flink 流处理 API 1.Environment getExecutionEnvironment 创建一个执行环境,表示当前执行程序的上下文. 如果程序是独立调用的,则 此方法返回本地执行环 ...
最新文章
- linuxmysql乱码
- pyinstaller安装以及生成exe文件
- 京东输血变造血-丰收节交易会·罗伟:农村谋定物流服务能力
- 移动端-ibokan
- linux 命令行字符终端terminal下强制清空回收站
- 通讯中断 pc_S7程序RFID 与PC连接区别FB 65/UDT65
- Linux程序分析工具介绍—ldd,nm
- 3D-BoNet:比3D点云实例分割算法快10倍!代码已开源
- MyBatis insert操作插入,返回主键from官方
- switch语句训练
- CentOs7安装Oracle11g中的坑
- 2018美国基金业年鉴-数据图表简版
- Linux进程管理和控制服务
- 《京东话费充值系统架构演进实践》阅读笔记
- python爬虫+数据分析完整流程--豆瓣电影分类排行榜
- 物联网卡开启养老新模式
- 保利清能西海岸收房步骤和费用明细
- 用 Kotlin 的函数式编程 替代 GOF 设计模式
- 茶饮行业舆情管理方案
- RabbitMQ:Consumers的介绍和使用