示例#1
0
    def get_point(
            self, metric_id, period=None, with_meta=True, timestamp=None
    ):
        """Get the closest point before input timestamp. Add meta informations
        if with_meta.
        """

        if timestamp is None:
            timestamp = time()

        timewindow = get_offset_timewindow(timestamp)

        period = self.get_period(metric_id, period=period)

        result = self[PerfData.PERFDATA_STORAGE].get(
            data_id=metric_id, timewindow=timewindow, period=period,
            limit=1
        )

        if with_meta is not None:

            meta = self[PerfData.META_STORAGE].get(
                data_id=metric_id, timewindow=timewindow
            )

            result = result, meta

        return result
示例#2
0
    def get_current_alarm(self, alarm_id):
        """
        Get current unresolved alarm.

        :param alarm_id: Alarm entity ID
        :type alarm_id: str

        :returns: Alarm as dict if found, else None
        """

        storage = self[Alerts.ALARM_STORAGE]

        result = storage.get(
            alarm_id,
            timewindow=get_offset_timewindow(),
            _filter={
                'resolved': None
            },
            limit=1
        )

        if result is not None:
            result = result[0]
            result[storage.DATA_ID] = alarm_id

        return result
示例#3
0
    def get_current_alarm(self, alarm_entity_id):
        """
        Get current unresolved alarm.

        :param alarm_id: Alarm entity ID
        :type alarm_id: str

        :returns: Alarm as dict if found, else None
        """
        storage = self.alerts_storage

        result = storage.get(
            alarm_entity_id,
            timewindow=get_offset_timewindow(),
            _filter={
                AlarmField.resolved.value: None
            },
            limit=1
        )

        if result is not None:
            result = result[0]
            result[storage.DATA_ID] = alarm_entity_id

        return result
示例#4
0
    def test_resolve_alarms(self):
        storage = self.manager[Alerts.ALARM_STORAGE]

        alarm_id = '/fake/alarm/id'
        self.manager.make_alarm(alarm_id, {'timestamp': 0})

        alarm = self.manager.get_current_alarm(alarm_id)
        self.assertIsNotNone(alarm)

        value = alarm[storage.VALUE]
        value['status'] = {
            't': 0,
            'val': OFF
        }

        self.manager.update_current_alarm(alarm, value)
        self.manager.resolve_alarms()

        alarm = self.manager.get_current_alarm(alarm_id)
        self.assertIsNone(alarm)

        alarm = storage.get(
            alarm_id,
            timewindow=get_offset_timewindow(),
            _filter={
                'resolved': {'$exists': True}
            },
            limit=1
        )
        self.assertTrue(alarm)
        alarm = alarm[0]
        value = alarm[storage.VALUE]

        self.assertEqual(value['resolved'], value['status']['t'])
示例#5
0
    def get_current_alarm(self, alarm_entity_id):
        """
        Get current unresolved alarm.

        :param alarm_id: Alarm entity ID
        :type alarm_id: str

        :returns: Alarm as dict if found, else None
        """
        storage = self.alerts_storage

        result = storage.get(
            alarm_entity_id,
            timewindow=get_offset_timewindow(),
            _filter={
                AlarmField.resolved.value: None
            },
            limit=1
        )

        if result is not None:
            result = result[0]
            result[storage.DATA_ID] = alarm_entity_id

        return result
示例#6
0
    def test_resolve_stealthy(self):
        storage = self.manager.alerts_storage
        now = int(time()) - self.manager.stealthy_interval - 1

        alarm_id = '/fake/alarm/id'
        alarm = self.manager.make_alarm(
            alarm_id,
            {
                'connector': 'ut-connector',
                'connector_name': 'ut-connector0',
                'component': 'c',
                'timestamp': now
            }
        )
        self.assertIsNotNone(alarm)

        # Init stealthy state
        value = alarm[storage.VALUE]
        value[AlarmField.status.value] = {
            't': now,
            'val': STEALTHY
        }
        value[AlarmField.state.value] = {
            't': now,
            'val': Check.OK
        }
        value[AlarmField.steps.value] = [
            {
                '_t': 'stateinc',
                't': now - 1,
                'a': 'test',
                'm': 'test',
                'val': Check.CRITICAL
            },
            {
                '_t': 'statedec',
                't': now,
                'a': 'test',
                'm': 'test',
                'val': Check.OK
            }
        ]
        self.manager.update_current_alarm(alarm, value)
        unresolved_alarms = self.manager.get_alarms(resolved=False)
        self.manager.resolve_stealthy(unresolved_alarms)

        alarm = storage.get(
            alarm_id,
            timewindow=get_offset_timewindow(),
            _filter={
                AlarmField.resolved.value: {'$exists': True}
            },
            limit=1
        )
        self.assertTrue(alarm)
        alarm = alarm[0]
        value = alarm[storage.VALUE]

        self.assertEqual(value[AlarmField.status.value]['val'], OFF)
示例#7
0
    def get_meta(
            self, metric_id, timewindow=None, limit=0, sort=None
    ):
        """Get the meta data related to input data_id and timewindow."""

        if timewindow is None:
            timewindow = get_offset_timewindow()

        result = self[PerfData.META_STORAGE].get(
            data_ids=metric_id,
            timewindow=timewindow,
            limit=limit,
            sort=sort
        )

        return result
示例#8
0
    def test_resolve_stealthy(self):
        storage = self.manager.alerts_storage
        now = int(time()) - self.manager.stealthy_interval - 1

        alarm_id = '/fake/alarm/id'
        alarm = self.manager.make_alarm(
            alarm_id, {
                'connector': 'ut-connector',
                'connector_name': 'ut-connector0',
                'component': 'c',
                'timestamp': now
            })
        self.assertIsNotNone(alarm)

        # Init stealthy state
        value = alarm[storage.VALUE]
        value[AlarmField.status.value] = {'t': now, 'val': STEALTHY}
        value[AlarmField.state.value] = {'t': now, 'val': Check.OK}
        value[AlarmField.steps.value] = [{
            '_t': 'stateinc',
            't': now - 1,
            'a': 'test',
            'm': 'test',
            'val': Check.CRITICAL
        }, {
            '_t': 'statedec',
            't': now,
            'a': 'test',
            'm': 'test',
            'val': Check.OK
        }]
        self.manager.update_current_alarm(alarm, value)
        unresolved_alarms = self.manager.get_alarms(resolved=False)
        self.manager.resolve_stealthy(unresolved_alarms)

        alarm = storage.get(
            alarm_id,
            timewindow=get_offset_timewindow(),
            _filter={AlarmField.resolved.value: {
                '$exists': True
            }},
            limit=1)
        self.assertTrue(alarm)
        alarm = alarm[0]
        value = alarm[storage.VALUE]

        self.assertEqual(value[AlarmField.status.value]['val'], OFF)
示例#9
0
    def get_point(self, metric_id, with_meta=True, timestamp=None, meta=None):
        """Get the closest point before input timestamp. Add tags informations
        if with_tags.
        """

        data_id, tags = self._data_id_tags(metric_id, meta)

        if timestamp is None:
            timestamp = time()

        timewindow = get_offset_timewindow(timestamp)

        result = self[PerfData.PERFDATA_STORAGE].get(
            data_id=data_id, timewindow=timewindow,
            limit=1, tags=tags, with_tags=with_meta
        )

        return result
示例#10
0
    def test_resolve_alarms(self):
        storage = self.manager.alerts_storage

        alarm_id = '/fake/alarm/id'
        alarm = self.manager.make_alarm(
            alarm_id,
            {
                'connector': 'ut-connector',
                'connector_name': 'ut-connector0',
                'component': 'c',
                'timestamp': 0
            }
        )

        self.assertIsNotNone(alarm)

        value = alarm[storage.VALUE]
        value[AlarmField.status.value] = {
            't': 0,
            'val': OFF
        }

        self.manager.update_current_alarm(alarm, value)
        unresolved_alarms = self.manager.get_alarms(resolved=False)
        self.manager.resolve_alarms(unresolved_alarms)

        alarm = self.manager.get_current_alarm(alarm_id)
        self.assertIsNone(alarm)

        alarm = storage.get(
            alarm_id,
            timewindow=get_offset_timewindow(),
            _filter={
                AlarmField.resolved.value: {'$exists': True}
            },
            limit=1
        )
        self.assertTrue(alarm)
        alarm = alarm[0]
        value = alarm[storage.VALUE]

        self.assertEqual(value[AlarmField.resolved.value],
                         value[AlarmField.status.value]['t'])
示例#11
0
文件: timed.py 项目: Anhmike/canopsis
    def put(self, data_id, value, timestamp, *args, **kwargs):

        timewindow = get_offset_timewindow(offset=timestamp)

        data = self.get(
            data_ids=[data_id], timewindow=timewindow, limit=1)

        data_value = None

        if data:
            data_value = data[data_id][0][TimedStorage.VALUE]

        if value != data_value:  # new entry to insert

            values_to_insert = {
                    MongoTimedStorage.Key.DATA_ID: data_id,
                    MongoTimedStorage.Key.TIMESTAMP: timestamp,
                    MongoTimedStorage.Key.VALUE: value
            }
            self._insert(document=values_to_insert)
示例#12
0
    def put(self, data_id, value, timestamp, cache=False, *args, **kwargs):

        timewindow = get_offset_timewindow(offset=timestamp)

        data = self.get(
            data_ids=data_id, timewindow=timewindow, limit=1
        )

        data_value = None

        if data:
            data = data[0]
            data_value = data[PeriodicalStorage.VALUE]

        if value != data_value:  # new entry to insert

            document = {
                MongoPeriodicalStorage.Key.DATA_ID: data_id,
                MongoPeriodicalStorage.Key.TIMESTAMP: timestamp,
                MongoPeriodicalStorage.Key.VALUE: value
            }

            if data and data[PeriodicalStorage.TIMESTAMP] == timestamp:
                spec = {
                    MongoPeriodicalStorage.Key.DATA_ID: data_id,
                    MongoPeriodicalStorage.Key.TIMESTAMP: timestamp
                }

                self._update(
                    spec=spec,
                    document=document,
                    cache=cache,
                    multi=False,
                    upsert=False
                )

            else:
                self._insert(document=document, cache=cache)
示例#13
0
    def put(self, data_id, value, timestamp, cache=False, *args, **kwargs):

        timewindow = get_offset_timewindow(offset=timestamp)

        data = self.get(
            data_ids=data_id, timewindow=timewindow, limit=1
        )

        data_value = None

        if data:
            data = data[0]
            data_value = data[PeriodicalStorage.VALUE]

        if value != data_value:  # new entry to insert

            document = {
                MongoPeriodicalStorage.Key.DATA_ID: data_id,
                MongoPeriodicalStorage.Key.TIMESTAMP: timestamp,
                MongoPeriodicalStorage.Key.VALUE: value
            }

            if data and data[PeriodicalStorage.TIMESTAMP] == timestamp:
                spec = {
                    MongoPeriodicalStorage.Key.DATA_ID: data_id,
                    MongoPeriodicalStorage.Key.TIMESTAMP: timestamp
                }

                self._update(
                    spec=spec,
                    document=document,
                    cache=cache,
                    multi=False,
                    upsert=False
                )

            else:
                self._insert(document=document, cache=cache)
示例#14
0
    def test_resolve_alarms(self):
        storage = self.manager.alerts_storage

        alarm_id = '/fake/alarm/id'
        alarm = self.manager.make_alarm(
            alarm_id, {
                'connector': 'ut-connector',
                'connector_name': 'ut-connector0',
                'component': 'c',
                'timestamp': 0
            })

        self.assertIsNotNone(alarm)

        value = alarm[storage.VALUE]
        value[AlarmField.status.value] = {'t': 0, 'val': OFF}

        self.manager.update_current_alarm(alarm, value)
        unresolved_alarms = self.manager.get_alarms(resolved=False)
        self.manager.resolve_alarms(unresolved_alarms)

        alarm = self.manager.get_current_alarm(alarm_id)
        self.assertIsNone(alarm)

        alarm = storage.get(
            alarm_id,
            timewindow=get_offset_timewindow(),
            _filter={AlarmField.resolved.value: {
                '$exists': True
            }},
            limit=1)
        self.assertTrue(alarm)
        alarm = alarm[0]
        value = alarm[storage.VALUE]

        self.assertEqual(value[AlarmField.resolved.value],
                         value[AlarmField.status.value]['t'])
示例#15
0
    def test_put_get_data(self):

        timewindow = TimeWindow()

        metric_id = 'test_manager'

        self.perfdata.remove(metric_id=metric_id, with_meta=True)

        count = self.perfdata.count(metric_id=metric_id)
        self.assertEqual(count, 0)

        tv0 = (int(timewindow.start()), None)
        tv1 = (int(timewindow.start() + 1), 0)
        tv2 = (int(timewindow.stop()), 2)
        tv3 = (int(timewindow.stop() + 1000000), 3)

        # set values with timestamp without order
        points = [tv0, tv2, tv1, tv3]

        meta = {'plop': None}

        self.perfdata.put(
            metric_id=metric_id,
            points=points,
            meta=meta
        )

        data, _meta = self.perfdata.get(
            metric_id=metric_id,
            timewindow=timewindow,
            with_meta=True
        )

        self.assertEqual(meta, _meta[0][PerfData.META_VALUE])

        self.assertEqual([tv0, tv1, tv2], data)

        # remove 1 data at stop point
        _timewindow = get_offset_timewindow(timewindow.stop())

        self.perfdata.remove(
            metric_id=metric_id,
            timewindow=_timewindow
        )

        data, _meta = self.perfdata.get(
            metric_id=metric_id,
            timewindow=timewindow,
            with_meta=True
        )

        self.assertEqual(meta, _meta[0][PerfData.META_VALUE])

        self.assertEqual(data, [tv0, tv1])

        # get data on timewindow
        data, _meta = self.perfdata.get(
            metric_id=metric_id,
            timewindow=timewindow,
            with_meta=True
        )

        self.assertEqual(meta, _meta[0][PerfData.META_VALUE])

        # get all data
        data, _meta = self.perfdata.get(
            metric_id=metric_id,
            with_meta=True
        )

        self.assertEqual(meta, _meta[0][PerfData.META_VALUE])

        self.assertEqual(len(data), 3)

        # remove all data
        self.perfdata.remove(
            metric_id=metric_id,
            with_meta=True
        )

        data, _meta = self.perfdata.get(
            metric_id=metric_id,
            with_meta=True
        )

        self.assertIsNone(_meta)

        self.assertEqual(len(data), 0)