示例#1
0
    def on_message(self, body, message):

        try:
            alert = AlertDocument.parse_alert(body)
            alertid = alert.get_id()
        except Exception as e:
            LOG.warn(e)
            return

        if alert.repeat:
            message.ack()
            return

        if alert.status not in ['open', 'closed']:
            message.ack()
            return

        if (alert.severity not in ['critical', 'major']
                and alert.previous_severity not in ['critical', 'major']):
            message.ack()
            return

        if alertid in on_hold:
            if alert.severity in ['normal', 'ok', 'cleared']:
                try:
                    del on_hold[alertid]
                except KeyError:
                    pass
                message.ack()
            else:
                on_hold[alertid] = (alert, time.time() + HOLD_TIME)
                message.ack()
        else:
            on_hold[alertid] = (alert, time.time() + HOLD_TIME)
            message.ack()
示例#2
0
def test_rules_evaluation(alert_spec, input_rules, expected_contacts):
    '''
    Test that rules are properly evaluated
    '''
    with patch.dict(mailer.OPTIONS, mailer.DEFAULT_OPTIONS):
        mailer.OPTIONS['mail_to'] = []
        mailer.OPTIONS['group_rules'] = input_rules
        mail_sender = mailer.MailSender()
        with patch.object(mail_sender, '_send_email_message') as _sem:
            alert = AlertDocument.parse_alert(alert_spec)
            _, emailed_contacts = mail_sender.send_email(alert)
            assert _sem.call_count == 1
            assert emailed_contacts == expected_contacts
示例#3
0
    def test_date_formats(self):

        self.CREATE_TIME = datetime.datetime(year=2012, month=11, day=10, hour=9, minute=8, second=7, microsecond=543210)

        alert = AlertDocument(
            id=self.ALERTID, resource=self.RESOURCE, event=self.EVENT, environment=self.ENVIRONMENT,
            severity=self.SEVERITY, correlate=self.CORRELATE, status=self.STATUS, service=self.SERVICE, group=self.GROUP,
            value=self.VALUE, text=self.TEXT, tags=self.TAGS,
            attributes={'thresholdInfo': self.THRESHOLD_INFO, 'moreInfo': self.MORE_INFO, 'graphUrls': self.GRAPH_URLS},
            origin=self.ORIGIN, event_type=self.EVENT_TYPE, create_time=self.CREATE_TIME, timeout=self.TIMEOUT,
            raw_data=self.RAW_DATA, duplicate_count=self.DUPLICATE_COUNT, repeat=self.REPEAT,
            previous_severity=self.PREVIOUS_SEVERITY, trend_indication=self.TREND_INDICATION, receive_time=self.RECEIVE_TIME,
            last_receive_id=self.ALERTID, last_receive_time=self.RECEIVE_TIME, history=self.HISTORY, customer=self.CUSTOMER)

        self.assertEqual(alert.get_date('create_time', 'local'), '2012/11/10 09:08:07')
        self.assertEqual(alert.get_date('create_time', 'iso'), '2012-11-10T09:08:07.543Z')
        self.assertEqual(alert.get_date('create_time', 'iso8601'), '2012-11-10T09:08:07.543Z')
        self.assertEqual(alert.get_date('create_time', 'rfc'), 'Sat, 10 Nov 2012 09:08:07 +0000')
        self.assertEqual(alert.get_date('create_time', 'rfc2822'), 'Sat, 10 Nov 2012 09:08:07 +0000')
        self.assertEqual(alert.get_date('create_time', 'short'), 'Sat 10 09:08:07')
        self.assertEqual(alert.get_date('create_time', 'epoch'), 1352538487.0)
        self.assertEqual(alert.get_date('create_time', 'raw'), self.CREATE_TIME)
        self.assertEqual(alert.get_date('create_time'), '2012-11-10T09:08:07.543Z')
        self.assertRaises(ValueError, alert.get_date, 'create_time', 'invalid')
示例#4
0
    def on_message(self, body, message):
        LOG.debug("Received: %s", body)
        try:
            alert = AlertDocument.parse_alert(body)
            alertid = alert.get_id()
        except Exception as e:
            LOG.warn(e)
            return

        if alert.repeat:
            message.ack()
            LOG.info('%s : Do not queue email, repeat message', alertid)
            return

        if alert.status not in ['open', 'closed']:
            message.ack()
            LOG.info('%s : Do not queue email, not open or closed', alertid)
            return

        if (alert.severity not in ['critical', 'major']
                and alert.previous_severity not in ['critical', 'major']):
            message.ack()
            LOG.info('%s : Do not queue email, not important enough', alertid)
            return

        if alertid in on_hold:
            if alert.severity in ['normal', 'ok', 'cleared']:
                try:
                    LOG.info('%s : De-queue alert because it has been cleared',
                             alertid)
                    del on_hold[alertid]
                except KeyError:
                    pass
                message.ack()
            else:
                on_hold[alertid] = (alert, time.time() + HOLD_TIME)
                LOG.info(
                    '%s : Extend queue on-hold time to %s', alertid,
                    datetime.datetime.fromtimestamp(
                        on_hold[alertid][1]).strftime("%c"))
                message.ack()
        else:
            on_hold[alertid] = (alert, time.time() + HOLD_TIME)
            LOG.info(
                '%s : Queued alert on hold until %s', alertid,
                datetime.datetime.fromtimestamp(
                    on_hold[alertid][1]).strftime("%c"))
            message.ack()
示例#5
0
    def test_alertdoc(self):
        """
        Ensure a valid alert document is created with all assigned values
        """

        alert = AlertDocument(
            id=self.ALERTID, resource=self.RESOURCE, event=self.EVENT, environment=self.ENVIRONMENT,
            severity=self.SEVERITY, correlate=self.CORRELATE, status=self.STATUS, service=self.SERVICE, group=self.GROUP,
            value=self.VALUE, text=self.TEXT, tags=self.TAGS,
            attributes={'thresholdInfo': self.THRESHOLD_INFO, 'moreInfo': self.MORE_INFO, 'graphUrls': self.GRAPH_URLS},
            origin=self.ORIGIN, event_type=self.EVENT_TYPE, create_time=self.CREATE_TIME, timeout=self.TIMEOUT,
            raw_data=self.RAW_DATA, duplicate_count=self.DUPLICATE_COUNT, repeat=self.REPEAT,
            previous_severity=self.PREVIOUS_SEVERITY, trend_indication=self.TREND_INDICATION, receive_time=self.RECEIVE_TIME,
            last_receive_id=self.ALERTID, last_receive_time=self.RECEIVE_TIME, history=self.HISTORY, customer=self.CUSTOMER)

        self.assertEquals(alert.resource, self.RESOURCE)
        self.assertEquals(alert.event, self.EVENT)
        self.assertEquals(alert.correlate, self.CORRELATE)
        self.assertEquals(alert.group, self.GROUP)
        self.assertEquals(alert.value, self.VALUE)
        self.assertEquals(alert.status, self.STATUS)
        self.assertEquals(alert.severity, self.SEVERITY)
        self.assertEquals(alert.previous_severity, self.PREVIOUS_SEVERITY)
        self.assertEquals(alert.environment, self.ENVIRONMENT)
        self.assertEquals(alert.service, self.SERVICE)
        self.assertEquals(alert.text, self.TEXT)
        self.assertEquals(alert.event_type, self.EVENT_TYPE)
        self.assertEquals(alert.tags, self.TAGS)
        self.assertEquals(alert.origin, self.ORIGIN)
        self.assertEquals(alert.repeat, self.REPEAT)
        self.assertEquals(alert.duplicate_count, self.DUPLICATE_COUNT)
        self.assertEquals(alert.timeout, self.TIMEOUT)
        self.assertEquals(alert.id, self.ALERTID)
        self.assertEquals(alert.last_receive_id, self.ALERTID)
        self.assertEquals(alert.create_time, self.CREATE_TIME)
        self.assertEquals(alert.receive_time, self.RECEIVE_TIME)
        self.assertEquals(alert.trend_indication, self.TREND_INDICATION)
        self.assertEquals(alert.raw_data, self.RAW_DATA)
        self.assertEquals(alert.history, self.HISTORY)
        self.assertEquals(alert.customer, self.CUSTOMER)
示例#6
0
    def on_message(self, body, message):

        try:
            alert = AlertDocument.parse_alert(body)
            alertid = alert.get_id()
        except Exception as e:
            LOG.warn(e)
            return

        if alert.repeat:
            message.ack()
            return

        if alert.status not in ['open', 'closed']:
            message.ack()
            return

        if (
            alert.severity not in ['critical', 'major'] and
            alert.previous_severity not in ['critical', 'major']
        ):
            message.ack()
            return

        if alertid in on_hold:
            if alert.severity in ['normal', 'ok', 'cleared']:
                try:
                    del on_hold[alertid]
                except KeyError:
                    pass
                message.ack()
            else:
                on_hold[alertid] = (alert, time.time() + HOLD_TIME)
                message.ack()
        else:
            on_hold[alertid] = (alert, time.time() + HOLD_TIME)
            message.ack()
示例#7
0
    def _draw_alerts(self):

        with lock:
            if self.w.get_groupby():
                self._addstr(
                    2, 1,
                    '{:<20} Count Dupl. Environments             Services                 Resources'
                    .format(self.w.get_groupby().capitalize()),
                    curses.A_UNDERLINE)
                i = 2
                alerts = copy.deepcopy(self.w.top10)
                for alert in alerts:
                    i += 1
                    try:
                        self._addstr(
                            i, 1, '{:<20} {:5} {:5} {:<24} {:<24} {}'.format(
                                alert[self.w.get_groupby()], alert['count'],
                                alert['duplicateCount'],
                                ','.join(alert['environments']),
                                ','.join(alert['services']), ','.join([
                                    r['resource'] for r in alert['resources']
                                ]), self.max_x - 160))
                    except curses.error as e:
                        print(e)
                        sys.exit(1)
                    except Exception:
                        break
                    if i == self.max_y - 3:
                        break
            else:
                if self.max_x < 132:
                    self._addstr(
                        2, 1,
                        'Sev. Time     Dupl. Env.         Service      Resource     Event        Value ',
                        curses.A_UNDERLINE)
                else:
                    self._addstr(
                        2, 1,
                        'Sev. Last Recv. Time Dupl. Customer Environment  Service      Resource '
                        + '      Event          Value   Text' + ' ' *
                        (self.max_x - 106), curses.A_UNDERLINE)

                def name_to_code(name):
                    return _SEVERITY_MAP.get(name.lower(), UNKNOWN_SEV_CODE)

                def to_short_sev(severity):
                    return _DISPLAY_SEVERITY.get(severity,
                                                 _DISPLAY_SEVERITY['unknown'])

                i = 2
                #self._addstr(1,1, '%sx%s' % (self.max_y, self.max_x))
                alerts = copy.deepcopy(self.w.alerts)
                for alert in sorted(alerts,
                                    key=lambda x: name_to_code(x['severity'])):
                    a = AlertDocument.parse_alert(alert)
                    i += 1
                    color = self._COLOR_MAP.get(a.severity,
                                                self._COLOR_MAP['unknown'])
                    try:
                        if self.max_x < 132:
                            self._addstr(
                                i, 1,
                                '{0:<4} {1} {2:5d} {3:<12} {4:<12} {5:<12.12} {6:<12.12} {7:<6.6}'
                                .format(
                                    to_short_sev(a.severity),
                                    a.get_date('last_receive_time',
                                               'short')[7:], a.duplicate_count,
                                    a.environment, ','.join(a.service),
                                    a.resource, a.event, a.value), color)
                        else:
                            self._addstr(
                                i, 1,
                                '{0:<4} {1} {2:5d} {3:>8.8} {4:<12} {5:<12} {6:<14.14} {7:<14.14} {8:<7.7} {9:{10}.{10}}'
                                .format(
                                    to_short_sev(a.severity),
                                    a.get_date('last_receive_time',
                                               'short'), a.duplicate_count,
                                    a.customer or '-', a.environment,
                                    ','.join(a.service), a.resource, a.event,
                                    a.value, a.text, self.max_x - 106), color)
                    except curses.error as e:
                        print(e)
                        sys.exit(1)
                    if i == self.max_y - 3:
                        break