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)