@cryptotaxi247 / netdata-1 / commits / 29bd09a8a

add custom exceptions to "charts" module, catch them in create()

lgz committed Oct 18, 2017 at 23:05 UTC 29bd09a8aa121f21fbab7c40a2a164a1b58eca7b
2 files changed +45 -27
python.d/python_modules/bases/FrameworkServices/SimpleService.py
+21 -6
@@ -10,7 +10,7 @@ try:
10 except ImportError:
11 from time import sleep, time
12
13 -from bases.charts import Charts, create_runtime_chart
13 +from bases.charts import Charts, ChartError, create_runtime_chart
14 from bases.collection import OldVersionCompatibility, safe_print
15 from bases.loggers import PythonDLimitedLogger
16
@@ -110,22 +110,37 @@ class SimpleService(Thread, PythonDLimitedLogger, OldVersionCompatibility, objec
110 chart_config = self.definitions.get(chart_name)
111
112 if not chart_config:
113 - self.debug("create() chart '{chart_name}' not in definitions. "
113 + self.debug("create() => [NOT ADDED] chart '{chart_name}' not in definitions. "
114 "Skipping it.".format(chart_name=chart_name))
115 continue
116
117 # create chart
118 chart_params = [chart_name] + chart_config['options']
119 - self.charts.add_chart(params=chart_params)
119 + try:
120 + self.charts.add_chart(params=chart_params)
121 + except ChartError as error:
122 + self.error("create() => [NOT ADDED] (chart '{chart}': {error})".format(chart=chart_name,
123 + error=error))
124 + continue
125
126 # add dimensions to chart
127 for dimension in chart_config['lines']:
123 - self.charts[chart_name].add_dimension(dimension)
128 + try:
129 + self.charts[chart_name].add_dimension(dimension)
130 + except ChartError as error:
131 + self.error("create() => [NOT ADDED] (dimension '{dimension}': {error})".format(dimension=dimension,
132 + error=error))
133 + continue
134
135 # add variables to chart
136 if 'variables' in chart_config:
137 for variable in chart_config['variables']:
128 - self.charts[chart_name].add_variable(variable)
138 + try:
139 + self.charts[chart_name].add_variable(variable)
140 + except ChartError as error:
141 + self.error("create() => [NOT ADDED] (variable '{var}': {error})".format(var=variable,
142 + error=error))
143 + continue
144
145 del self.order
146 del self.definitions
@@ -197,7 +212,7 @@ class SimpleService(Thread, PythonDLimitedLogger, OldVersionCompatibility, objec
212 for chart in self.charts.penalty_exceeded(penalty_max=CHART_OBSOLETE_PENALTY):
213 safe_print(chart.obsolete())
214 del self.charts[chart.params['id']]
200 - self.error('chart "{0}" was removed due to non updating'.format(chart.name))
215 + self.error("chart '{0}' was removed due to non updating".format(chart.name))
216
217 for chart in self.charts:
218 dimension_updated, variables_updated = str(), str()
python.d/python_modules/bases/charts.py
+24 -21
@@ -53,12 +53,16 @@ class ChartError(Exception):
53 """Base-class for all exceptions raised by this module"""
54
55
56 -class DuplicateChartError(ChartError):
57 - """Raised when user re-adds a chart that has already been added"""
56 +class DuplicateItemError(ChartError):
57 + """Occurs when user re-adds a chart or a dimension that has already been added"""
58
59
60 -class DuplicateDimensionError(ChartError):
61 - """Raised when user re-adds a dimension that has already been added"""
60 +class ItemTypeError(ChartError):
61 + """Occurs when user passes value of wrong type to Chart, Dimension or ChartVariable class"""
62 +
63 +
64 +class ItemValueError(ChartError):
65 + """Occurs when user passes inappropriate value to Chart, Dimension or ChartVariable class"""
66
67
68 class Charts:
@@ -120,7 +124,7 @@ class Charts:
124 params = [self.job_name()] + params
125 chart_id = params[1]
126 if chart_id in self.charts:
123 - raise DuplicateChartError('{chart} already in charts'.format(chart=chart_id))
127 + raise DuplicateItemError("'{chart}' already in charts".format(chart=chart_id))
128 else:
129 new_chart = Chart(params)
130 new_chart.params['update_every'] = self.update_every
@@ -137,9 +141,9 @@ class Chart:
141 :param params: <list>
142 """
143 if not isinstance(params, list):
140 - raise TypeError("'chart' must be a list type")
144 + raise ItemTypeError("'chart' must be a list type")
145 if not len(params) >= 8:
142 - raise ValueError('invalid value for "chart", must be {0}'.format(CHART_PARAMS))
146 + raise ItemValueError("invalid value for 'chart', must be {0}".format(CHART_PARAMS))
147
148 self.params = dict(zip(CHART_PARAMS, (p or str() for p in params)))
149 self.name = '{type}.{id}'.format(type=self.params['type'],
@@ -175,26 +179,25 @@ class Chart:
179 :param dimension: <list>
180 :return:
181 """
178 - if dimension[0] in [repr(d) for d in self.dimensions]:
179 - raise DuplicateDimensionError('{dimension} already in {chart} dimensions'.format(dimension=dimension[0],
180 - chart=self.name))
182 + dim = Dimension(dimension)
183 +
184 + if dim.params['id'] in self:
185 + raise DuplicateItemError("'{dimension}' already in '{chart}' dimensions".format(dimension=dim.params['id'],
186 + chart=self.name))
187 self.dimensions.append(Dimension(dimension))
188 + return dim
189
190 def add_dimension_and_push_chart(self, dimension):
191 """
192 :param dimension: <list>
193 :return:
194 """
188 - if dimension[0] in [repr(d) for d in self.dimensions]:
189 - raise DuplicateDimensionError('{dimension} already in {chart} dimensions'.format(dimension=dimension[0],
190 - chart=self.name))
191 - dimension = Dimension(dimension)
192 - self.dimensions.append(dimension)
193 - safe_print(self.create(dimension))
195 + dim = self.add_dimension(dimension)
196 + safe_print(self.create(dim))
197
198 def create(self, dimension=None):
199 """
197 - :param dimension: <list>
200 + :param dimension: Dimension
201 :return:
202 """
203 chart = CHART_CREATE.format(**self.params)
@@ -226,9 +229,9 @@ class Dimension:
229 :param params: <list>
230 """
231 if not isinstance(params, list):
229 - raise TypeError("'dimension' must be a list type")
232 + raise ItemTypeError("'dimension' must be a list type")
233 if not params:
231 - raise ValueError('invalid value for "dimension", must be {0}'.format(DIMENSION_PARAMS))
234 + raise ItemValueError("invalid value for 'dimension', must be {0}".format(DIMENSION_PARAMS))
235
236 self.params = dict(zip(DIMENSION_PARAMS, (p or str() for p in params)))
237 self.params['name'] = self.params.get('name') or self.params['id']
@@ -263,9 +266,9 @@ class ChartVariable:
266 :param params: <list>
267 """
268 if not isinstance(params, list):
266 - raise TypeError("'variable' must be a list type")
269 + raise ItemTypeError("'variable' must be a list type")
270 if not params:
268 - raise ValueError('invalid value for "variable", must be: {0}'.format(VARIABLE_PARAMS))
271 + raise ItemValueError("invalid value for 'variable' must be: {0}".format(VARIABLE_PARAMS))
272
273 self.params = dict(zip(VARIABLE_PARAMS, params))
274 self.params.setdefault('value', None)