获取告警信息相对而言比较简单点,这里先陈述告警信息的pojo类,作为存储告警信息的源头(省略getter和setter方法):
public class AlarmItem { private String ObjectName; private ManagedEntityStatus overallStatus; private String alarmName; private Date time; private Date acknowledgedTime; private String acknowledgedByUser; private Boolean acknowledged; }
|
以获取主机告警信息为例:
public static List<AlarmItem> getHostAlarms(String hostName) throws Exception { List<AlarmItem> ansList = null; ManagedObjectReference hostmor = getHostByHostName(hostName); ansList = getAlarms(hostmor); return ansList; }
|
这里先根据主机名称获取主机的对象(HostSystem),相关代码可以参考前面的相关文章。
接下去就是获取告警的方法getAlarms(ManagedObjectReference mor):
private static List<AlarmItem> getAlarms(ManagedObjectReference mor) throws Exception { List<AlarmItem> ansList = new ArrayList<AlarmItem>(); List<AlarmState> list = vimPort.getAlarmState(alarmManager, mor); for(AlarmState alarmState : list) { if(alarmState.getOverallStatus().toString().equals("YELLOW") || alarmState.getOverallStatus().toString().equals("RED")) { AlarmItem alarmItem = new AlarmItem(); ManagedObjectReference alarm = alarmState.getAlarm(); if(alarm!=null) { PropertyFilterSpec alarmFilterSpec = createAlarmFilterSpec(alarm); ArrayList<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(); listpfs.add(alarmFilterSpec); List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs); if(listobjcont != null) { ObjectContent oc = (ObjectContent) listobjcont.get(0); AlarmInfo alarmInfo = (AlarmInfo) oc.getPropSet().get(0).getVal(); alarmItem.setAlarmName(alarmInfo.getName()); } } alarmItem.setAcknowledged(alarmState.isAcknowledged()); alarmItem.setAcknowledgedByUser(alarmState.getAcknowledgedByUser()); alarmItem.setAcknowledgedTime(DateConvert.convertToDate(alarmState.getAcknowledgedTime())); alarmItem.setOverallStatus(alarmState.getOverallStatus()); alarmItem.setTime(DateConvert.convertToDate(alarmState.getTime())); alarmItem.setObjectName(getObjectName(alarmState.getEntity())); ansList.add(alarmItem); } } return ansList; }
|
private static PropertyFilterSpec createAlarmFilterSpec(ManagedObjectReference eventHistoryCollectorRef) { PropertySpec propSpec = new PropertySpec(); propSpec.setAll(new Boolean(false)); propSpec.getPathSet().add("info"); propSpec.setType(eventHistoryCollectorRef.getType());
ObjectSpec objSpec = new ObjectSpec(); objSpec.setObj(eventHistoryCollectorRef); objSpec.setSkip(new Boolean(false));
PropertyFilterSpec spec = new PropertyFilterSpec(); spec.getPropSet().add(propSpec); spec.getObjectSet().add(objSpec); return spec; }
private static String getObjectName(ManagedObjectReference mor) throws Exception { String objectName = null; PropertySpec propSpec = new PropertySpec(); propSpec.setAll(new Boolean(false)); propSpec.getPathSet().add("name"); propSpec.setType(mor.getType());
ObjectSpec objSpec = new ObjectSpec(); objSpec.setObj(mor); objSpec.setSkip(new Boolean(false));
PropertyFilterSpec spec = new PropertyFilterSpec(); spec.getPropSet().add(propSpec); spec.getObjectSet().add(objSpec); ArrayList<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(); listpfs.add(spec); List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs); if(listobjcont != null) { ObjectContent oc = (ObjectContent) listobjcont.get(0); objectName = (String) oc.getPropSet().get(0).getVal(); } return objectName; }
|
这样就可以获取相关的主机告警信息。
对于其他的,比如虚拟机的告警信息就可以这样:
public static List<AlarmItem> getVmAlarms(String vmName) throws Exception { List<AlarmItem> ansList = null; ManagedObjectReference hostmor = getVmByVmName(vmName); ansList = getAlarms(hostmor); return ansList; }
|
对于其他的譬如vCenter, Cluster, Datacenter的告警就不一一赘述了,相信看得懂上面代码的小伙伴一定能很快的自己写出实现的方法。
欢迎支持笔者的作品《深入理解Kafka: 核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客(ID: hiddenkafka)。
本文作者:
朱小厮
版权声明:
未经本人允许,不得擅自转载、修改或用于其它任何用途!