Example #1
0
class engine(Engine):

    etype = 'perfdata'

    def __init__(self, *args, **kargs):

        super(engine, self).__init__(*args, **kargs)

        self.perfdata = PerfData()

    def work(self, event, *args, **kargs):

        # Get perfdata
        perf_data = event.get('perf_data')
        perf_data_array = event.get('perf_data_array', [])

        if perf_data_array is None:
            perf_data_array = []

        # Parse perfdata
        if perf_data:

            self.logger.debug(' + perf_data: {0}'.format(perf_data))

            try:
                perf_data_array += self.perfdata.parse_perfdata(perf_data)

            except Exception as err:
                self.logger.error(
                    "Impossible to parse perfdata from: {0} ({1})"
                    .format(event, err)
                )

        self.logger.debug(' + perf_data_array: {0}'.format(perf_data_array))

        # Add status informations
        event_type = event.get('event_type')

        handled_event_types = ['check', 'selector', 'sla']

        if event_type is not None and event_type in handled_event_types:

            self.logger.debug('Add status informations')

            state = int(event.get('state', 0))
            state_type = int(event.get('state_type', 0))
            state_extra = 0

            # Multiplex state
            cps_state = state * 100 + state_type * 10 + state_extra

            perf_data_array.append(
                {
                    "metric": "cps_state",
                    "value": cps_state
                }
            )

        event['perf_data_array'] = perf_data_array

        # remove perf_data_keys where values are None
        for index, perf_data in enumerate(event['perf_data_array']):

            perf_data_array_with_Nones = event['perf_data_array'][index]

            event['perf_data_array'][index] = {
                name: perf_data_array_with_Nones[name]
                for name in perf_data_array_with_Nones
                if perf_data_array_with_Nones[name] is not None
            }

        self.logger.debug('perf_data_array: {0}'.format(perf_data_array))

        event = deepcopy(event)

        # Metrology
        timestamp = event['timestamp'] if 'timestamp' in event else None

        if timestamp is not None:

            perf_data_array = event.get('perf_data_array', [])

            for perf_data in perf_data_array:

                perf_data = perf_data.copy()
                event_with_metric = deepcopy(event)
                event_with_metric['type'] = 'metric'
                event_with_metric[Context.NAME] = perf_data.pop('metric')

                metric_id = self.perfdata.context.get_entity_id(
                    event_with_metric
                )
                value = perf_data.pop('value', None)

                self.perfdata.put(
                    metric_id=metric_id, points=[(timestamp, value)],
                    meta=perf_data, cache=True
                )

        return event