@cryptotaxi247 / netdata-1 / commits / 9e771293f

initial support for chart variables added

lgz committed Oct 18, 2017 at 13:33 UTC 9e771293f02883fdd7d24c42de74f88ba94195f3
2 files changed +75 -6
python.d/python_modules/bases/FrameworkServices/SimpleService.py
+27 -5
@@ -108,23 +108,33 @@ class SimpleService(Thread, PythonDLimitedLogger, OldVersionCompatibility, objec
108 def create(self):
109 for chart_name in self.order:
110 chart_config = self.definitions.get(chart_name)
111 +
112 if not chart_config:
113 self.debug("create() 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)
120
119 - for line in chart_config['lines']:
120 - self.charts[chart_name].add_dimension(line)
121 + # add dimensions to chart
122 + for dimension in chart_config['lines']:
123 + self.charts[chart_name].add_dimension(dimension)
124 +
125 + # add variables to chart
126 + if 'variables' in chart_config:
127 + for variable in chart_config['variables']:
128 + self.charts[chart_name].add_variable(variable)
129
130 del self.order
131 del self.definitions
132
133 + # push charts to netdata
134 for chart in self.charts:
135 safe_print(chart.create())
136
137 + # True if job has at least 1 chart else False
138 return bool(self.charts)
139
140 def run(self):
@@ -190,18 +200,30 @@ class SimpleService(Thread, PythonDLimitedLogger, OldVersionCompatibility, objec
200 self.error('chart "{0}" was removed due to non updating'.format(chart.name))
201
202 for chart in self.charts:
193 - dimension_updated = str()
203 + dimension_updated, variables_updated = str(), str()
204 +
205 for dimension in chart:
206 try:
207 value = int(data[dimension.params['id']])
208 except (KeyError, TypeError):
209 continue
199 - dimension_updated += dimension.set(value)
210 + else:
211 + dimension_updated += dimension.set(value)
212 +
213 + for var in chart.variables:
214 + try:
215 + value = int(data[var.params['id']])
216 + except (KeyError, TypeError):
217 + continue
218 + else:
219 + variables_updated += var.set(value)
220
221 if dimension_updated:
222 charts_updated = True
223 safe_print(''.join([chart.begin(since_last=interval),
204 - dimension_updated, 'END\n']))
224 + dimension_updated,
225 + variables_updated,
226 + 'END\n']))
227 else:
228 chart.penalty += 1
229
python.d/python_modules/bases/charts.py
+48 -1
@@ -6,6 +6,8 @@ from bases.collection import safe_print
6
7 CHART_PARAMS = ['type', 'id', 'name', 'title', 'units', 'family', 'context', 'chart_type']
8 DIMENSION_PARAMS = ['id', 'name', 'algorithm', 'multiplier', 'divisor']
9 +VARIABLE_PARAMS = ['id', 'value']
10 +
11 CHART_TYPES = ['line', 'area', 'stacked']
12 DIMENSION_ALGORITHMS = ['absolute', 'incremental', 'percentage-of-absolute-row', 'percentage-of-incremental-row']
13
@@ -19,6 +21,8 @@ CHART_OBSOLETE = "CHART {type}.{id} '{name}' '{title}' '{units}' '{family}' '{co
21 DIMENSION_CREATE = "DIMENSION '{id}' '{name}' {algorithm} {multiplier} {divisor} '{hidden}'\n"
22 DIMENSION_SET = "SET '{id}' = {value}\n"
23
24 +CHART_VARIABLE_SET = "VARIABLE CHART '{id}' = {value}\n"
25 +
26 RUNTIME_CHART_CREATE = "CHART netdata.runtime_{job_name} '' 'Execution time for {job_name}' 'ms' 'python.d' " \
27 "netdata.pythond_runtime line 145000 {update_every}\n" \
28 "DIMENSION run_time 'run time' absolute 1 1\n"
@@ -119,6 +123,7 @@ class Chart:
123 self.params['chart_type'] = 'absolute'
124
125 self.dimensions = list()
126 + self.variables = set()
127 self.penalty = 0
128
129 def __repr__(self):
@@ -133,6 +138,13 @@ class Chart:
138 def __contains__(self, item):
139 return item in [repr(d) for d in self.dimensions]
140
141 + def add_variable(self, variable):
142 + """
143 + :param variable: <list>
144 + :return:
145 + """
146 + self.variables.add(ChartVariable(variable))
147 +
148 def add_dimension(self, dimension):
149 """
150 :param dimension: <list>
@@ -163,9 +175,11 @@ class Chart:
175 chart = CHART_CREATE.format(**self.params)
176 if not dimension:
177 dimensions = ''.join([dimension.create() for dimension in self.dimensions])
178 + variables = ''.join([var.set(var.params['value']) for var in self.variables if var])
179 + return chart + dimensions + variables
180 else:
181 dimensions = dimension.create()
168 - return chart + dimensions
182 + return chart + dimensions
183
184 def begin(self, since_last):
185 """
@@ -212,3 +226,36 @@ class Dimension:
226 """
227 return DIMENSION_SET.format(id=self.params['id'],
228 value=value)
229 +
230 +
231 +class ChartVariable:
232 + def __init__(self, params):
233 + """
234 + :param params: <list>
235 + """
236 + if not (params and isinstance(params, list)):
237 + raise ValueError('Variable params must be a not empty list')
238 +
239 + self.params = dict(zip(VARIABLE_PARAMS, params))
240 + self.params.setdefault('value', None)
241 +
242 + def __bool__(self):
243 + return self.params['value'] is not None
244 +
245 + def __nonzero__(self):
246 + return self.__bool__()
247 +
248 + def __repr__(self):
249 + return 'ChartVariable({0})'.format(self.params['id'])
250 +
251 + def __eq__(self, other):
252 + if isinstance(other, ChartVariable):
253 + return self.params['id'] == other.params['id']
254 + return False
255 +
256 + def __hash__(self):
257 + return hash(repr(self))
258 +
259 + def set(self, value):
260 + return CHART_VARIABLE_SET.format(id=self.params['id'],
261 + value=value)