alarms.chart.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. # -*- coding: utf-8 -*-
  2. # Description: alarms netdata python.d module
  3. # Author: andrewm4894
  4. # SPDX-License-Identifier: GPL-3.0-or-later
  5. from json import loads
  6. from bases.FrameworkServices.UrlService import UrlService
  7. update_every = 10
  8. disabled_by_default = True
  9. def charts_template(sm, alarm_status_chart_type='line'):
  10. order = [
  11. 'alarms',
  12. 'values'
  13. ]
  14. mappings = ', '.join(['{0}={1}'.format(k, v) for k, v in sm.items()])
  15. charts = {
  16. 'alarms': {
  17. 'options': [None, 'Alarms ({0})'.format(mappings), 'status', 'status', 'alarms.status', alarm_status_chart_type],
  18. 'lines': [],
  19. 'variables': [
  20. ['alarms_num'],
  21. ]
  22. },
  23. 'values': {
  24. 'options': [None, 'Alarm Values', 'value', 'value', 'alarms.value', 'line'],
  25. 'lines': [],
  26. }
  27. }
  28. return order, charts
  29. DEFAULT_STATUS_MAP = {'CLEAR': 0, 'WARNING': 1, 'CRITICAL': 2}
  30. DEFAULT_URL = 'http://127.0.0.1:19999/api/v1/alarms?all'
  31. DEFAULT_COLLECT_ALARM_VALUES = False
  32. DEFAULT_ALARM_STATUS_CHART_TYPE = 'line'
  33. DEFAULT_ALARM_CONTAINS_WORDS = ''
  34. class Service(UrlService):
  35. def __init__(self, configuration=None, name=None):
  36. UrlService.__init__(self, configuration=configuration, name=name)
  37. self.sm = self.configuration.get('status_map', DEFAULT_STATUS_MAP)
  38. self.alarm_status_chart_type = self.configuration.get('alarm_status_chart_type', DEFAULT_ALARM_STATUS_CHART_TYPE)
  39. self.order, self.definitions = charts_template(self.sm, self.alarm_status_chart_type)
  40. self.url = self.configuration.get('url', DEFAULT_URL)
  41. self.collect_alarm_values = bool(self.configuration.get('collect_alarm_values', DEFAULT_COLLECT_ALARM_VALUES))
  42. self.collected_dims = {'alarms': set(), 'values': set()}
  43. self.alarm_contains_words = self.configuration.get('alarm_contains_words', DEFAULT_ALARM_CONTAINS_WORDS)
  44. self.alarm_contains_words_list = [alarm_contains_word.lstrip(' ').rstrip(' ') for alarm_contains_word in self.alarm_contains_words.split(',')]
  45. def _get_data(self):
  46. raw_data = self._get_raw_data()
  47. if raw_data is None:
  48. return None
  49. raw_data = loads(raw_data)
  50. alarms = raw_data.get('alarms', {})
  51. if self.alarm_contains_words != '':
  52. alarms = {alarm_name: alarms[alarm_name] for alarm_name in alarms for alarm_contains_word in
  53. self.alarm_contains_words_list if alarm_contains_word in alarm_name}
  54. data = {a: self.sm[alarms[a]['status']] for a in alarms if alarms[a]['status'] in self.sm}
  55. self.update_charts('alarms', data)
  56. data['alarms_num'] = len(data)
  57. if self.collect_alarm_values:
  58. data_values = {'{}_value'.format(a): alarms[a]['value'] * 100 for a in alarms if 'value' in alarms[a] and alarms[a]['value'] is not None}
  59. self.update_charts('values', data_values, divisor=100)
  60. data.update(data_values)
  61. return data
  62. def update_charts(self, chart, data, algorithm='absolute', multiplier=1, divisor=1):
  63. if not self.charts:
  64. return
  65. for dim in data:
  66. if dim not in self.collected_dims[chart]:
  67. self.collected_dims[chart].add(dim)
  68. self.charts[chart].add_dimension([dim, dim, algorithm, multiplier, divisor])
  69. for dim in list(self.collected_dims[chart]):
  70. if dim not in data:
  71. self.collected_dims[chart].remove(dim)
  72. self.charts[chart].del_dimension(dim, hide=False)