def __init__(self): super(EventForwarderToKafkaAction, self).__init__() self.sec_drop = global_conf.get('evtf-seconds-drop-flagsec', '900') self.msg_drop_flagsec = global_conf.get('evtf-msg-drop-flagsec', '') if self.msg_drop_flagsec.lower() == "true": self.msg_drop_flagsec = True else: self.msg_drop_flagsec = '' try: self.zKafka = KafkaHandler() self.kafkaAvailable = True except: #log.error(traceback.format_exc().splitlines()[-1]) self.kafkaAvailable = False
class EventForwarderToKafkaAction(IActionBase): implements(IAction) id = 'eventForwarderToKafka' name = 'Event Forwarder To Kafka' actionContentInfo = IEventForwarderToKafkaActionContentInfo global_conf = getGlobalConfiguration() def __init__(self): super(EventForwarderToKafkaAction, self).__init__() self.sec_drop = global_conf.get('evtf-seconds-drop-flagsec', '900') self.msg_drop_flagsec = global_conf.get('evtf-msg-drop-flagsec', '') if self.msg_drop_flagsec.lower() == "true": self.msg_drop_flagsec = True else: self.msg_drop_flagsec = '' try: self.zKafka = KafkaHandler() self.kafkaAvailable = True except: #log.error(traceback.format_exc().splitlines()[-1]) self.kafkaAvailable = False def setupAction(self, dmd): self.guidManager = GUIDManager(dmd) def execute(self, notification, signal): data = _signalToContextDict(signal, self.options.get('zopeurl'), notification, self.guidManager) if signal.clear and data['clearEventSummary'].uuid: event = data['clearEventSummary'] else: event = data['eventSummary'] actor = getattr(event, "actor", None) details = event.details fields = { 'created_time' : ( 0, event), 'uuid' : ( 1, event), 'fingerprint' : ( 2, event), 'element_identifier' : ( 3, actor), 'element_sub_identifier' : ( 4, actor), 'event_class' : ( 5, event), 'event_key' : ( 6, event), 'summary' : ( 7, event), 'message' : ( 8, event), 'severity' : ( 9, event), 'status' : (10, event), 'event_class_key' : (11, event), 'event_group' : (12, event), 'status_change_time' : (13, event), 'first_seen_time' : (14, event), 'last_seen_time' : (15, event), 'count' : (16, event), 'zenoss.device.production_state':(17, details), 'monitor': (18, event), 'manager': (19, details), 'agent': (20, event), 'zenoss.device.device_class': (21, details), 'zenoss.device.location' : (22, details), 'zenoss.device.systems' : (23, details), 'zenoss.device.groups' : (24, details), 'zenoss.device.ip_address': (25, details), 'syslog_facility' : (26, event), 'syslog_priority' : (27, event), 'nt_event_code' : (28, event), 'current_user_name' : (29, event), 'cleared_by_event_uuid' : (31, event), 'zenoss.device.priority' : (32, details), 'event_class_mapping_uuid': (33, event), 'element_title': (34, actor), 'element_sub_title': (35, actor), 'originalTime': (36, details) } eventDict = self.createEventDict(fields, event) self.eventForwarderToKafkaAction(notification, data, eventDict) def eventForwarderToKafkaAction(self, notification, data, eventDict): """ Forward events to Kafka. """ log.info('Processing event forwarder action.') self.processEventDict(eventDict, data, notification.dmd) try: if self.kafkaAvailable: cur_time = time.time() created_time = eventDict['created_time'] / 1000.0 forwarderLagSeconds = float(cur_time - created_time) if self.msg_drop_flagsec and forwarderLagSeconds > float(self.sec_drop): log.warn("Dropping event ('%s') with forwarderLagSeconds > %s (%s)." % \ (eventDict['fingerprint'], self.sec_drop, forwarderLagSeconds)) return msg_evt = generate_evt_data(eventDict, 'zeneventforwardertokafka') log.debug("KAFKA Message: %s" % msg_evt) log.debug("Sending to kafkaTopic: %s" % notification.content['kafkaTopic']) fail_send = self.zKafka.send(msg_evt, notification.content['kafkaTopic']) if fail_send: log.error("Problem sending to Kafka. Return Code: %s" % fail_send) else: log.error("Kafka is NOT available.") except: log.error(traceback.format_exc().splitlines()[-1]) def createEventDict(self, fields, event): """ Create an event dictionary suitable for Python evaluation. """ eventDict = {} for field, oidspec in fields.items(): i, source = oidspec if source is event.details: val = source.get(field, '') else: val = getattr(source, field, '') eventDict[field] = val return eventDict def processEventDict(self, eventDict, data, dmd): """ Integration hook """ pass def updateContent(self, content=None, data=None): updates = dict() updates['kafkaTopic'] = data.get('kafkaTopic', 'ie_zenoss') content.update(updates)