From 6e0b9c97bafdd1bda8e501792c608da8d5328220 Mon Sep 17 00:00:00 2001 From: Ilya Mashchenko Date: Sat, 12 Dec 2020 00:00:01 +0300 Subject: python.d/alarms: add alarms obsoletion and disable by default (#10375) --- collectors/python.d.plugin/alarms/alarms.chart.py | 65 +++++++++++++++-------- 1 file changed, 43 insertions(+), 22 deletions(-) (limited to 'collectors') diff --git a/collectors/python.d.plugin/alarms/alarms.chart.py b/collectors/python.d.plugin/alarms/alarms.chart.py index 39b2cfc5cf..4cc8525c24 100644 --- a/collectors/python.d.plugin/alarms/alarms.chart.py +++ b/collectors/python.d.plugin/alarms/alarms.chart.py @@ -8,43 +8,64 @@ from json import loads from bases.FrameworkServices.UrlService import UrlService update_every = 10 -disabled_by_default = False +disabled_by_default = True -DEFAULT_STATUS_MAP = {'CLEAR': 0, 'WARNING': 1, 'CRITICAL': 2} -ORDER = [ - 'alarms', -] +def charts_template(sm): + order = [ + 'alarms', + ] + + mappings = ', '.join(['{0}={1}'.format(k, v) for k, v in sm.items()]) + charts = { + 'alarms': { + 'options': [None, 'Alarms ({0})'.format(mappings), 'status', 'alarms', 'alarms.status', 'line'], + 'lines': [], + 'variables': [ + ['alarms_num'], + ] + } + } + return order, charts + + +DEFAULT_STATUS_MAP = {'CLEAR': 0, 'WARNING': 1, 'CRITICAL': 2} -CHARTS = { -} +DEFAULT_URL = 'http://127.0.0.1:19999/api/v1/alarms?all' class Service(UrlService): def __init__(self, configuration=None, name=None): UrlService.__init__(self, configuration=configuration, name=name) - self.order = ORDER - self.definitions = CHARTS - self.url = self.configuration.get('url', 'http://127.0.0.1:19999/api/v1/alarms?all') - self.status_map = self.configuration.get('status_map', DEFAULT_STATUS_MAP) - self.chart_title = f"Alarms ({', '.join([f'{k}={self.status_map[k]}' for k in self.status_map])})" - - def validate_charts(self, name, data, algorithm='absolute', multiplier=1, divisor=1): - for dim in data: - if name not in self.charts: - chart_params = [name] + ['alarms', self.chart_title, 'status', 'alarms', 'alarms.status', 'line'] - self.charts.add_chart(params=chart_params) - if dim not in self.charts[name]: - self.charts[name].add_dimension([dim, dim, algorithm, multiplier, divisor]) + self.sm = self.configuration.get('status_map', DEFAULT_STATUS_MAP) + self.order, self.definitions = charts_template(self.sm) + self.url = self.configuration.get('url', DEFAULT_URL) + self.collected_alarms = set() def _get_data(self): raw_data = self._get_raw_data() if raw_data is None: return None + raw_data = loads(raw_data) alarms = raw_data.get('alarms', {}) - data = {a: self.status_map[alarms[a]['status']] for a in alarms if alarms[a]['status'] in self.status_map} - self.validate_charts('alarms', data) + + data = {a: self.sm[alarms[a]['status']] for a in alarms if alarms[a]['status'] in self.sm} data['alarms_num'] = len(data) + self.update_charts(alarms, data) return data + + def update_charts(self, alarms, data): + if not self.charts: + return + + for a in data: + if a not in self.collected_alarms: + self.collected_alarms.add(a) + self.charts['alarms'].add_dimension([a, a, 'absolute', '1', '1']) + + for a in list(self.collected_alarms): + if a not in alarms: + self.collected_alarms.remove(a) + self.charts['alarms'].del_dimension(a, hide=False) -- cgit v1.2.3