alarms.chart.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. class Service(UrlService):
  34. def __init__(self, configuration=None, name=None):
  35. UrlService.__init__(self, configuration=configuration, name=name)
  36. self.sm = self.configuration.get('status_map', DEFAULT_STATUS_MAP)
  37. self.alarm_status_chart_type = self.configuration.get('alarm_status_chart_type', DEFAULT_ALARM_STATUS_CHART_TYPE)
  38. self.order, self.definitions = charts_template(self.sm, self.alarm_status_chart_type)
  39. self.url = self.configuration.get('url', DEFAULT_URL)
  40. self.collect_alarm_values = bool(self.configuration.get('collect_alarm_values', DEFAULT_COLLECT_ALARM_VALUES))
  41. self.collected_dims = {'alarms': set(), 'values': set()}
  42. def _get_data(self):
  43. raw_data = self._get_raw_data()
  44. if raw_data is None:
  45. return None
  46. raw_data = loads(raw_data)
  47. alarms = raw_data.get('alarms', {})
  48. data = {a: self.sm[alarms[a]['status']] for a in alarms if alarms[a]['status'] in self.sm}
  49. self.update_charts('alarms', data)
  50. data['alarms_num'] = len(data)
  51. if self.collect_alarm_values:
  52. 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}
  53. self.update_charts('values', data_values, divisor=100)
  54. data.update(data_values)
  55. return data
  56. def update_charts(self, chart, data, algorithm='absolute', multiplier=1, divisor=1):
  57. if not self.charts:
  58. return
  59. for dim in data:
  60. if dim not in self.collected_dims[chart]:
  61. self.collected_dims[chart].add(dim)
  62. self.charts[chart].add_dimension([dim, dim, algorithm, multiplier, divisor])
  63. for dim in list(self.collected_dims[chart]):
  64. if dim not in data:
  65. self.collected_dims[chart].remove(dim)
  66. self.charts[chart].del_dimension(dim, hide=False)