X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fevaluator%2Fevaluator.py;h=24e8e43f0adbda6793cdbae672ee2cfd684800fe;hb=refs%2Fchanges%2F00%2F7400%2F2;hp=76881b95fd3b2d56e3a3a205c5a1898ea1915736;hpb=5ac7c081ca13495185ecf6bdf302c16c25a4b759;p=osm%2FMON.git diff --git a/osm_mon/evaluator/evaluator.py b/osm_mon/evaluator/evaluator.py index 76881b9..24e8e43 100644 --- a/osm_mon/evaluator/evaluator.py +++ b/osm_mon/evaluator/evaluator.py @@ -24,6 +24,7 @@ import asyncio import logging import multiprocessing import time +from enum import Enum import peewee import requests @@ -39,7 +40,14 @@ from osm_mon.core.response import ResponseBuilder log = logging.getLogger(__name__) +class AlarmStatus(Enum): + ALARM = 'alarm' + OK = 'ok' + INSUFFICIENT = 'insufficient-data' + + class Evaluator: + def __init__(self, config: Config, loop=None): self.conf = config if not loop: @@ -69,17 +77,23 @@ class Evaluator: json_response = r.json() if json_response['status'] == 'success': result = json_response['data']['result'] - if len(result): + if result: metric_value = float(result[0]['value'][1]) log.info("Metric value: %s", metric_value) if alarm.operation.upper() == 'GT': if metric_value > alarm.threshold: - self.queue.put(alarm) + self.queue.put((alarm, AlarmStatus.ALARM)) + else: + self.queue.put((alarm, AlarmStatus.OK)) elif alarm.operation.upper() == 'LT': if metric_value < alarm.threshold: - self.queue.put(alarm) + self.queue.put((alarm, AlarmStatus.ALARM)) + else: + self.queue.put((alarm, AlarmStatus.OK)) else: log.warning("No metric result for alarm %s", alarm.id) + self.queue.put((alarm, AlarmStatus.INSUFFICIENT)) + else: log.warning("Prometheus response is not success. Got status %s", json_response['status']) else: @@ -155,20 +169,24 @@ class Evaluator: for process in processes: process.join(timeout=10) - triggered_alarms = [] + alarms_tuples = [] while not self.queue.empty(): - triggered_alarms.append(self.queue.get()) - for alarm in triggered_alarms: + alarms_tuples.append(self.queue.get()) + for alarm, status in alarms_tuples: p = multiprocessing.Process(target=self.notify_alarm, - args=(alarm,)) + args=(alarm, status)) p.start() - def notify_alarm(self, alarm: Alarm): + def notify_alarm(self, alarm: Alarm, status: AlarmStatus): log.debug("notify_alarm") + resp_message = self._build_alarm_response(alarm, status) + log.info("Sent alarm notification: %s", resp_message) + self.loop.run_until_complete(self.msg_bus.aiowrite('alarm_response', 'notify_alarm', resp_message)) + + def _build_alarm_response(self, alarm: Alarm, status: AlarmStatus): response = ResponseBuilder() now = time.strftime("%d-%m-%Y") + " " + time.strftime("%X") - # Generate and send response - resp_message = response.generate_response( + return response.generate_response( 'notify_alarm', alarm_id=alarm.uuid, vdu_name=alarm.vdur_name, @@ -178,7 +196,5 @@ class Evaluator: operation=alarm.operation, threshold_value=alarm.threshold, sev=alarm.severity, - status='alarm', + status=status.value, date=now) - self.loop.run_until_complete(self.msg_bus.aiowrite('alarm_response', 'notify_alarm', resp_message)) - log.info("Sent alarm notification: %s", resp_message)