@cryptotaxi247 / netdata-1 / commits / 6e0b9c97b

python.d/alarms: add alarms obsoletion and disable by default (#10375)

Ilya Mashchenko committed Dec 12, 2020 at 00:00 UTC 6e0b9c97bafdd1bda8e501792c608da8d5328220
1 file changed +43 -22
collectors/python.d.plugin/alarms/alarms.chart.py
+43 -22
@@ -8,43 +8,64 @@ from json import loads
8 from bases.FrameworkServices.UrlService import UrlService
9
10 update_every = 10
11 -disabled_by_default = False
11 +disabled_by_default = True
12
13 -DEFAULT_STATUS_MAP = {'CLEAR': 0, 'WARNING': 1, 'CRITICAL': 2}
13
15 -ORDER = [
16 - 'alarms',
17 -]
14 +def charts_template(sm):
15 + order = [
16 + 'alarms',
17 + ]
18 +
19 + mappings = ', '.join(['{0}={1}'.format(k, v) for k, v in sm.items()])
20 + charts = {
21 + 'alarms': {
22 + 'options': [None, 'Alarms ({0})'.format(mappings), 'status', 'alarms', 'alarms.status', 'line'],
23 + 'lines': [],
24 + 'variables': [
25 + ['alarms_num'],
26 + ]
27 + }
28 + }
29 + return order, charts
30 +
31 +
32 +DEFAULT_STATUS_MAP = {'CLEAR': 0, 'WARNING': 1, 'CRITICAL': 2}
33
19 -CHARTS = {
20 -}
34 +DEFAULT_URL = 'http://127.0.0.1:19999/api/v1/alarms?all'
35
36
37 class Service(UrlService):
38 def __init__(self, configuration=None, name=None):
39 UrlService.__init__(self, configuration=configuration, name=name)
26 - self.order = ORDER
27 - self.definitions = CHARTS
28 - self.url = self.configuration.get('url', 'http://127.0.0.1:19999/api/v1/alarms?all')
29 - self.status_map = self.configuration.get('status_map', DEFAULT_STATUS_MAP)
30 - self.chart_title = f"Alarms ({', '.join([f'{k}={self.status_map[k]}' for k in self.status_map])})"
31 -
32 - def validate_charts(self, name, data, algorithm='absolute', multiplier=1, divisor=1):
33 - for dim in data:
34 - if name not in self.charts:
35 - chart_params = [name] + ['alarms', self.chart_title, 'status', 'alarms', 'alarms.status', 'line']
36 - self.charts.add_chart(params=chart_params)
37 - if dim not in self.charts[name]:
38 - self.charts[name].add_dimension([dim, dim, algorithm, multiplier, divisor])
40 + self.sm = self.configuration.get('status_map', DEFAULT_STATUS_MAP)
41 + self.order, self.definitions = charts_template(self.sm)
42 + self.url = self.configuration.get('url', DEFAULT_URL)
43 + self.collected_alarms = set()
44
45 def _get_data(self):
46 raw_data = self._get_raw_data()
47 if raw_data is None:
48 return None
49 +
50 raw_data = loads(raw_data)
51 alarms = raw_data.get('alarms', {})
46 - data = {a: self.status_map[alarms[a]['status']] for a in alarms if alarms[a]['status'] in self.status_map}
47 - self.validate_charts('alarms', data)
52 +
53 + data = {a: self.sm[alarms[a]['status']] for a in alarms if alarms[a]['status'] in self.sm}
54 data['alarms_num'] = len(data)
55 + self.update_charts(alarms, data)
56
57 return data
58 +
59 + def update_charts(self, alarms, data):
60 + if not self.charts:
61 + return
62 +
63 + for a in data:
64 + if a not in self.collected_alarms:
65 + self.collected_alarms.add(a)
66 + self.charts['alarms'].add_dimension([a, a, 'absolute', '1', '1'])
67 +
68 + for a in list(self.collected_alarms):
69 + if a not in alarms:
70 + self.collected_alarms.remove(a)
71 + self.charts['alarms'].del_dimension(a, hide=False)