@cryptotaxi247 / netdata-1 / commits / 2001025a1

convert identation to spaces

Costa Tsaousis (ktsaou) committed Nov 19, 2016 at 18:38 UTC 2001025a1f4f5c73f5be69a690cf83f0bfe240e3
1 file changed +610 -610
node.d/node_modules/netdata.js
+610 -610
@@ -13,622 +13,622 @@ var util = require('util');
13 var netdata = require('netdata');
14
15 var example_chart = {
16 - id: 'id', // the unique id of the chart
17 - name: 'name', // the name of the chart
18 - title: 'title', // the title of the chart
19 - units: 'units', // the units of the chart dimensions
20 - family: 'family', // the family of the chart
21 - context: 'context', // the context of the chart
22 - type: netdata.chartTypes.line, // the type of the chart
23 - priority: 0, // the priority relative to others in the same family
24 - update_every: 1, // the expected update frequency of the chart
25 - dimensions: {
26 - 'dim1': {
27 - id: 'dim1', // the unique id of the dimension
28 - name: 'name', // the name of the dimension
29 - algorithm: netdata.chartAlgorithms.absolute, // the id of the netdata algorithm
30 - multiplier: 1, // the multiplier
31 - divisor: 1, // the divisor
32 - hidden: false, // is hidden (boolean)
33 - },
34 - 'dim2': {
35 - id: 'dim2', // the unique id of the dimension
36 - name: 'name', // the name of the dimension
37 - algorithm: 'absolute', // the id of the netdata algorithm
38 - multiplier: 1, // the multiplier
39 - divisor: 1, // the divisor
40 - hidden: false, // is hidden (boolean)
41 - }
42 - // add as many dimensions as needed
43 - }
16 + id: 'id', // the unique id of the chart
17 + name: 'name', // the name of the chart
18 + title: 'title', // the title of the chart
19 + units: 'units', // the units of the chart dimensions
20 + family: 'family', // the family of the chart
21 + context: 'context', // the context of the chart
22 + type: netdata.chartTypes.line, // the type of the chart
23 + priority: 0, // the priority relative to others in the same family
24 + update_every: 1, // the expected update frequency of the chart
25 + dimensions: {
26 + 'dim1': {
27 + id: 'dim1', // the unique id of the dimension
28 + name: 'name', // the name of the dimension
29 + algorithm: netdata.chartAlgorithms.absolute, // the id of the netdata algorithm
30 + multiplier: 1, // the multiplier
31 + divisor: 1, // the divisor
32 + hidden: false, // is hidden (boolean)
33 + },
34 + 'dim2': {
35 + id: 'dim2', // the unique id of the dimension
36 + name: 'name', // the name of the dimension
37 + algorithm: 'absolute', // the id of the netdata algorithm
38 + multiplier: 1, // the multiplier
39 + divisor: 1, // the divisor
40 + hidden: false, // is hidden (boolean)
41 + }
42 + // add as many dimensions as needed
43 + }
44 };
45 */
46
47 var netdata = {
48 - options: {
49 - filename: __filename,
50 - DEBUG: false,
51 - update_every: 1,
52 - },
53 -
54 - chartAlgorithms: {
55 - incremental: 'incremental',
56 - absolute: 'absolute',
57 - percentage_of_absolute_row: 'percentage-of-absolute-row',
58 - percentage_of_incremental_row: 'percentage-of-incremental-row'
59 - },
60 -
61 - chartTypes: {
62 - line: 'line',
63 - area: 'area',
64 - stacked: 'stacked'
65 - },
66 -
67 - services: new Array(),
68 - modules_configuring: 0,
69 - charts: {},
70 -
71 -
72 - processors: {
73 - http: {
74 - name: 'http',
75 -
76 - process: function(service, callback) {
77 - if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': making ' + this.name + ' request: ' + netdata.stringify(service.request));
78 -
79 - var req = http.request(service.request, function(response) {
80 - if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': got server response...');
81 -
82 - var end = false;
83 - var data = '';
84 - response.setEncoding('utf8');
85 -
86 - if(response.statusCode !== 200) {
87 - if(end === false) {
88 - service.error('Got HTTP code ' + response.statusCode + ', failed to get data.');
89 - end = true;
90 - callback(null);
91 - }
92 - }
93 -
94 - response.on('data', function(chunk) {
95 - if(end === false) data += chunk;
96 - });
97 -
98 - response.on('error', function() {
99 - if(end === false) {
100 - service.error(': Read error, failed to get data.');
101 - end = true;
102 - callback(null);
103 - }
104 - });
105 -
106 - response.on('end', function() {
107 - if(end === false) {
108 - if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': read completed.');
109 - end = true;
110 - callback(data);
111 - }
112 - });
113 - });
114 -
115 - req.on('error', function(e) {
116 - if(netdata.options.DEBUG === true) netdata.debug('Failed to make request: ' + netdata.stringify(service.request) + ', message: ' + e.message);
117 - service.error('Failed to make request, message: ' + e.message);
118 - callback(null);
119 - });
120 -
121 - // write data to request body
122 - if(typeof service.postData !== 'undefined' && service.request.method === 'POST') {
123 - if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': posting data: ' + service.postData);
124 - req.write(service.postData);
125 - }
126 -
127 - req.end();
128 - }
129 - }
130 - },
131 -
132 - stringify: function(obj) {
133 - return util.inspect(obj, {depth: 10});
134 - },
135 -
136 - zeropad2: function(s) {
137 - if(typeof s !== 'string')
138 - s = s.toString();
139 -
140 - switch(s.length) {
141 - case 0: return '00';
142 - case 1: return '0' + s;
143 - default: return s;
144 - }
145 - },
146 -
147 - logdate: function(d) {
148 - if(typeof d === 'undefined') d = new Date();
149 - return this.zeropad2(d.getFullYear()) + '-' + this.zeropad2(d.getMonth()) + '-' + this.zeropad2(d.getDay())
150 - + ' ' + this.zeropad2(d.getHours()) + ':' + this.zeropad2(d.getMinutes()) + ':' + this.zeropad2(d.getSeconds());
151 - },
152 -
153 - // show debug info, if debug is enabled
154 - debug: function(msg) {
155 - if(this.options.DEBUG === true) {
156 - console.error(this.logdate() + ': ' + netdata.options.filename + ': DEBUG: ' + ((typeof(msg) === 'object')?netdata.stringify(msg):msg).toString());
157 - }
158 - },
159 -
160 - // log an error
161 - error: function(msg) {
162 - console.error(this.logdate() + ': ' + netdata.options.filename + ': ERROR: ' + ((typeof(msg) === 'object')?netdata.stringify(msg):msg).toString());
163 - },
164 -
165 - // send data to netdata
166 - send: function(msg) {
167 - console.log(msg.toString());
168 - },
169 -
170 - service: function(service) {
171 - if(typeof service === 'undefined')
172 - service = {};
173 -
174 - var now = new Date().getTime();
175 -
176 - service._current_chart = null; // the current chart we work on
177 - service._queue = ''; // data to be sent to netdata
178 -
179 - service.error_reported = false; // error log flood control
180 -
181 - service.added = false; // added to netdata.services
182 - service.enabled = true;
183 - service.updates = 0;
184 - service.running = false;
185 - service.started = 0;
186 - service.ended = 0;
187 -
188 - if(typeof service.module === 'undefined') {
189 - service.module = { name: 'not-defined-module' };
190 - service.error('Attempted to create service without a module.');
191 - service.enabled = false;
192 - }
193 -
194 - if(typeof service.name === 'undefined') {
195 - service.name = 'unnamed@' + service.module.name + '/' + now;
196 - }
197 -
198 - if(typeof service.processor === 'undefined')
199 - service.processor = netdata.processors.http;
200 -
201 - if(typeof service.update_every === 'undefined')
202 - service.update_every = service.module.update_every;
203 -
204 - if(typeof service.update_every === 'undefined')
205 - service.update_every = netdata.options.update_every;
206 -
207 - if(service.update_every < netdata.options.update_every)
208 - service.update_every = netdata.options.update_every;
209 -
210 - // align the runs
211 - service.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
212 -
213 - service.commit = function() {
214 - if(this.added !== true) {
215 - this.added = true;
216 -
217 - var now = new Date().getTime();
48 + options: {
49 + filename: __filename,
50 + DEBUG: false,
51 + update_every: 1,
52 + },
53 +
54 + chartAlgorithms: {
55 + incremental: 'incremental',
56 + absolute: 'absolute',
57 + percentage_of_absolute_row: 'percentage-of-absolute-row',
58 + percentage_of_incremental_row: 'percentage-of-incremental-row'
59 + },
60 +
61 + chartTypes: {
62 + line: 'line',
63 + area: 'area',
64 + stacked: 'stacked'
65 + },
66 +
67 + services: new Array(),
68 + modules_configuring: 0,
69 + charts: {},
70 +
71 +
72 + processors: {
73 + http: {
74 + name: 'http',
75 +
76 + process: function(service, callback) {
77 + if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': making ' + this.name + ' request: ' + netdata.stringify(service.request));
78 +
79 + var req = http.request(service.request, function(response) {
80 + if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': got server response...');
81 +
82 + var end = false;
83 + var data = '';
84 + response.setEncoding('utf8');
85 +
86 + if(response.statusCode !== 200) {
87 + if(end === false) {
88 + service.error('Got HTTP code ' + response.statusCode + ', failed to get data.');
89 + end = true;
90 + callback(null);
91 + }
92 + }
93 +
94 + response.on('data', function(chunk) {
95 + if(end === false) data += chunk;
96 + });
97 +
98 + response.on('error', function() {
99 + if(end === false) {
100 + service.error(': Read error, failed to get data.');
101 + end = true;
102 + callback(null);
103 + }
104 + });
105 +
106 + response.on('end', function() {
107 + if(end === false) {
108 + if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': read completed.');
109 + end = true;
110 + callback(data);
111 + }
112 + });
113 + });
114 +
115 + req.on('error', function(e) {
116 + if(netdata.options.DEBUG === true) netdata.debug('Failed to make request: ' + netdata.stringify(service.request) + ', message: ' + e.message);
117 + service.error('Failed to make request, message: ' + e.message);
118 + callback(null);
119 + });
120 +
121 + // write data to request body
122 + if(typeof service.postData !== 'undefined' && service.request.method === 'POST') {
123 + if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': posting data: ' + service.postData);
124 + req.write(service.postData);
125 + }
126 +
127 + req.end();
128 + }
129 + }
130 + },
131 +
132 + stringify: function(obj) {
133 + return util.inspect(obj, {depth: 10});
134 + },
135 +
136 + zeropad2: function(s) {
137 + if(typeof s !== 'string')
138 + s = s.toString();
139 +
140 + switch(s.length) {
141 + case 0: return '00';
142 + case 1: return '0' + s;
143 + default: return s;
144 + }
145 + },
146 +
147 + logdate: function(d) {
148 + if(typeof d === 'undefined') d = new Date();
149 + return this.zeropad2(d.getFullYear()) + '-' + this.zeropad2(d.getMonth()) + '-' + this.zeropad2(d.getDay())
150 + + ' ' + this.zeropad2(d.getHours()) + ':' + this.zeropad2(d.getMinutes()) + ':' + this.zeropad2(d.getSeconds());
151 + },
152 +
153 + // show debug info, if debug is enabled
154 + debug: function(msg) {
155 + if(this.options.DEBUG === true) {
156 + console.error(this.logdate() + ': ' + netdata.options.filename + ': DEBUG: ' + ((typeof(msg) === 'object')?netdata.stringify(msg):msg).toString());
157 + }
158 + },
159 +
160 + // log an error
161 + error: function(msg) {
162 + console.error(this.logdate() + ': ' + netdata.options.filename + ': ERROR: ' + ((typeof(msg) === 'object')?netdata.stringify(msg):msg).toString());
163 + },
164 +
165 + // send data to netdata
166 + send: function(msg) {
167 + console.log(msg.toString());
168 + },
169 +
170 + service: function(service) {
171 + if(typeof service === 'undefined')
172 + service = {};
173 +
174 + var now = new Date().getTime();
175 +
176 + service._current_chart = null; // the current chart we work on
177 + service._queue = ''; // data to be sent to netdata
178 +
179 + service.error_reported = false; // error log flood control
180 +
181 + service.added = false; // added to netdata.services
182 + service.enabled = true;
183 + service.updates = 0;
184 + service.running = false;
185 + service.started = 0;
186 + service.ended = 0;
187 +
188 + if(typeof service.module === 'undefined') {
189 + service.module = { name: 'not-defined-module' };
190 + service.error('Attempted to create service without a module.');
191 + service.enabled = false;
192 + }
193 +
194 + if(typeof service.name === 'undefined') {
195 + service.name = 'unnamed@' + service.module.name + '/' + now;
196 + }
197 +
198 + if(typeof service.processor === 'undefined')
199 + service.processor = netdata.processors.http;
200 +
201 + if(typeof service.update_every === 'undefined')
202 + service.update_every = service.module.update_every;
203 +
204 + if(typeof service.update_every === 'undefined')
205 + service.update_every = netdata.options.update_every;
206 +
207 + if(service.update_every < netdata.options.update_every)
208 + service.update_every = netdata.options.update_every;
209 +
210 + // align the runs
211 + service.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
212 +
213 + service.commit = function() {
214 + if(this.added !== true) {
215 + this.added = true;
216 +
217 + var now = new Date().getTime();
218 this.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
219
220 - netdata.services.push(this);
221 - if(netdata.options.DEBUG === true) netdata.debug(this.module.name + ': ' + this.name + ': service committed.');
222 - }
223 - };
224 -
225 - service.execute = function(callback) {
226 - if(service.enabled === false) {
227 - callback(null);
228 - return;
229 - }
230 -
231 - this.module.active++;
232 - this.running = true;
233 - this.started = new Date().getTime();
234 - this.updates++;
235 -
236 - if(netdata.options.DEBUG === true)
237 - netdata.debug(this.module.name + ': ' + this.name + ': making ' + this.processor.name + ' request: ' + netdata.stringify(this));
238 -
239 - this.processor.process(this, function(response) {
240 - service.ended = new Date().getTime();
241 - service.duration = service.ended - service.started;
242 -
243 - if(typeof response === 'undefined')
244 - response = null;
245 -
246 - if(response !== null)
247 - service.errorClear();
248 -
249 - if(netdata.options.DEBUG === true)
250 - netdata.debug(service.module.name + ': ' + service.name + ': processing ' + service.processor.name + ' response (received in ' + (service.ended - service.started).toString() + ' ms)');
251 -
252 - callback(service, response);
253 -
254 - service.running = false;
255 - service.module.active--;
256 - if(service.module.active < 0) {
257 - service.module.active = 0;
258 - if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': active module counter below zero.');
259 - }
260 -
261 - if(service.module.active === 0) {
262 - // check if we run under configure
263 - if(service.module.configure_callback !== null) {
264 - if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': configuration finish callback called from processResponse().');
265 - var ccallback = service.module.configure_callback;
266 - service.module.configure_callback = null;
267 - ccallback();
268 - }
269 - }
270 - });
271 - };
272 -
273 - service.update = function() {
274 - if(netdata.options.DEBUG === true) netdata.debug(this.module.name + ': ' + this.name + ': starting data collection...');
275 -
276 - this.module.update(this, function() {
277 - if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': data collection ended in ' + service.duration.toString() + ' ms.');
278 - });
279 - };
280 -
281 - service.error = function(message) {
282 - if(this.error_reported === false) {
283 - netdata.error(this.module.name + ': ' + this.name + ': ' + message);
284 - this.error_reported = true;
285 - }
286 - else if(netdata.options.DEBUG === true)
287 - netdata.debug(this.module.name + ': ' + this.name + ': ' + message);
288 - };
289 -
290 - service.errorClear = function() {
291 - this.error_reported = false;
292 - };
293 -
294 - service.queue = function(txt) {
295 - this._queue += txt + '\n';
296 - };
297 -
298 - service._send_chart_to_netdata = function(chart) {
299 - // internal function to send a chart to netdata
300 - this.queue('CHART "' + chart.id + '" "' + chart.name + '" "' + chart.title + '" "' + chart.units + '" "' + chart.family + '" "' + chart.context + '" "' + chart.type + '" ' + chart.priority.toString() + ' ' + chart.update_every.toString());
301 -
302 - for(var dim in chart.dimensions) {
303 - var d = chart.dimensions[dim];
304 -
305 - this.queue('DIMENSION "' + d.id + '" "' + d.name + '" "' + d.algorithm + '" ' + d.multiplier.toString() + ' ' + d.divisor.toString() + ' ' + ((d.hidden === true)?'hidden':'').toString());
306 - d._created = true;
307 - d._updated = false;
308 - }
309 -
310 - chart._created = true;
311 - chart._updated = false;
312 - };
313 -
314 - // begin data collection for a chart
315 - service.begin = function(chart) {
316 - if(this._current_chart !== null && this._current_chart !== chart) {
317 - this.error('Called begin() for chart ' + chart.id + ' while chart ' + this._current_chart.id + ' is still open. Closing it.');
318 - this.end();
319 - }
320 -
321 - if(typeof(chart.id) === 'undefined' || netdata.charts[chart.id] != chart) {
322 - this.error('Called begin() for chart ' + chart.id + ' that is not mine. Where did you find it? Ignoring it.');
323 - return false;
324 - }
325 -
326 - if(netdata.options.DEBUG === true) netdata.debug('setting current chart to ' + chart.id);
327 - this._current_chart = chart;
328 - this._current_chart._began = true;
329 -
330 - if(this._current_chart._dimensions_count !== 0) {
331 - if(this._current_chart._created === false || this._current_chart._updated === true)
332 - this._send_chart_to_netdata(this._current_chart);
333 -
334 - var now = this.ended;
335 - this.queue('BEGIN ' + this._current_chart.id + ' ' + ((this._current_chart._last_updated > 0)?((now - this._current_chart._last_updated) * 1000):'').toString());
336 - }
337 - // else this.error('Called begin() for chart ' + chart.id + ' which is empty.');
338 -
339 - this._current_chart._last_updated = now;
340 - this._current_chart._began = true;
341 - this._current_chart._counter++;
342 -
343 - return true;
344 - };
345 -
346 - // set a collected value for a chart
347 - // we do most things on the first value we attempt to set
348 - service.set = function(dimension, value) {
349 - if(this._current_chart === null) {
350 - this.error('Called set(' + dimension + ', ' + value + ') without an open chart.');
351 - return false;
352 - }
353 -
354 - if(typeof(this._current_chart.dimensions[dimension]) === 'undefined') {
355 - this.error('Called set(' + dimension + ', ' + value + ') but dimension "' + dimension + '" does not exist in chart "' + this._current_chart.id + '".');
356 - return false;
357 - }
358 -
359 - if(typeof value === 'undefined' || value === null)
360 - return false;
361 -
362 - if(this._current_chart._dimensions_count !== 0) {
363 - if (value instanceof Buffer)
364 - this.queue('SET ' + dimension + ' = 0x' + value.toString('hex'));
365 - else
366 - this.queue('SET ' + dimension + ' = ' + value.toString());
367 - }
368 -
369 - return true;
370 - };
371 -
372 - // end data collection for the current chart - after calling begin()
373 - service.end = function() {
374 - if(this._current_chart !== null && this._current_chart._began === false) {
375 - this.error('Called end() without an open chart.');
376 - return false;
377 - }
378 -
379 - if(this._current_chart._dimensions_count !== 0) {
380 - this.queue('END');
381 - netdata.send(this._queue);
382 - }
383 -
384 - this._queue = '';
385 - this._current_chart._began = false;
386 - if(netdata.options.DEBUG === true) netdata.debug('sent chart ' + this._current_chart.id);
387 - this._current_chart = null;
388 - return true;
389 - };
390 -
391 - // discard the collected values for the current chart - after calling begin()
392 - service.flush = function() {
393 - if(this._current_chart === null || this._current_chart._began === false) {
394 - this.error('Called flush() without an open chart.');
395 - return false;
396 - }
397 -
398 - this._queue = '';
399 - this._current_chart._began = false;
400 - this._current_chart = null;
401 - return true;
402 - };
403 -
404 - // create a netdata chart
405 - service.chart = function(id, chart) {
406 - if(typeof(netdata.charts[id]) === 'undefined') {
407 - netdata.charts[id] = {
408 - _created: false,
409 - _updated: true,
410 - _began: false,
411 - _counter: 0,
412 - _last_updated: 0,
413 - _dimensions_count: 0,
414 - id: id,
415 - name: id,
416 - title: 'untitled chart',
417 - units: 'a unit',
418 - family: '',
419 - context: '',
420 - type: netdata.chartTypes.line,
421 - priority: 50000,
422 - update_every: netdata.options.update_every,
423 - dimensions: {}
424 - };
425 - }
426 -
427 - var c = netdata.charts[id];
428 -
429 - if(typeof(chart.name) !== 'undefined' && chart.name !== c.name) {
430 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its name');
431 - c.name = chart.name;
432 - c._updated = true;
433 - }
434 -
435 - if(typeof(chart.title) !== 'undefined' && chart.title !== c.title) {
436 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its title');
437 - c.title = chart.title;
438 - c._updated = true;
439 - }
440 -
441 - if(typeof(chart.units) !== 'undefined' && chart.units !== c.units) {
442 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its units');
443 - c.units = chart.units;
444 - c._updated = true;
445 - }
446 -
447 - if(typeof(chart.family) !== 'undefined' && chart.family !== c.family) {
448 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its family');
449 - c.family = chart.family;
450 - c._updated = true;
451 - }
452 -
453 - if(typeof(chart.context) !== 'undefined' && chart.context !== c.context) {
454 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its context');
455 - c.context = chart.context;
456 - c._updated = true;
457 - }
458 -
459 - if(typeof(chart.type) !== 'undefined' && chart.type !== c.type) {
460 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its type');
461 - c.type = chart.type;
462 - c._updated = true;
463 - }
464 -
465 - if(typeof(chart.priority) !== 'undefined' && chart.priority !== c.priority) {
466 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its priority');
467 - c.priority = chart.priority;
468 - c._updated = true;
469 - }
470 -
471 - if(typeof(chart.update_every) !== 'undefined' && chart.update_every !== c.update_every) {
472 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its update_every from ' + c.update_every + ' to ' + chart.update_every);
473 - c.update_every = chart.update_every;
474 - c._updated = true;
475 - }
476 -
477 - if(typeof(chart.dimensions) !== 'undefined') {
478 - for(var x in chart.dimensions) {
479 - if(typeof(c.dimensions[x]) === 'undefined') {
480 - c._dimensions_count++;
481 -
482 - c.dimensions[x] = {
483 - _created: false,
484 - _updated: false,
485 - id: x, // the unique id of the dimension
486 - name: x, // the name of the dimension
487 - algorithm: netdata.chartAlgorithms.absolute, // the id of the netdata algorithm
488 - multiplier: 1, // the multiplier
489 - divisor: 1, // the divisor
490 - hidden: false, // is hidden (boolean)
491 - };
492 -
493 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' created dimension ' + x);
494 - c._updated = true;
495 - }
496 -
497 - var dim = chart.dimensions[x];
498 - var d = c.dimensions[x];
499 -
500 - if(typeof(dim.name) !== 'undefined' && d.name !== dim.name) {
501 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its name');
502 - d.name = dim.name;
503 - d._updated = true;
504 - }
505 -
506 - if(typeof(dim.algorithm) !== 'undefined' && d.algorithm !== dim.algorithm) {
507 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its algorithm from ' + d.algorithm + ' to ' + dim.algorithm);
508 - d.algorithm = dim.algorithm;
509 - d._updated = true;
510 - }
511 -
512 - if(typeof(dim.multiplier) !== 'undefined' && d.multiplier !== dim.multiplier) {
513 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its multiplier');
514 - d.multiplier = dim.multiplier;
515 - d._updated = true;
516 - }
517 -
518 - if(typeof(dim.divisor) !== 'undefined' && d.divisor !== dim.divisor) {
519 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its divisor');
520 - d.divisor = dim.divisor;
521 - d._updated = true;
522 - }
523 -
524 - if(typeof(dim.hidden) !== 'undefined' && d.hidden !== dim.hidden) {
525 - if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its hidden status');
526 - d.hidden = dim.hidden;
527 - d._updated = true;
528 - }
529 -
530 - if(d._updated) c._updated = true;
531 - }
532 - }
533 -
534 - //if(netdata.options.DEBUG === true) netdata.debug(netdata.charts);
535 - return netdata.charts[id];
536 - };
537 -
538 - return service;
539 - },
540 -
541 - runAllServices: function() {
542 - if(netdata.options.DEBUG === true) netdata.debug('runAllServices()');
543 -
544 - var now = new Date().getTime();
545 - var len = netdata.services.length;
546 - while(len--) {
547 - var service = netdata.services[len];
548 -
549 - if(service.enabled === false || service.running === true) continue;
550 - if(now <= service.next_run) continue;
551 -
552 - service.update();
553 -
554 - now = new Date().getTime();
555 - service.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
556 - }
557 -
558 - // 1/10th of update_every in pause
559 - setTimeout(netdata.runAllServices, netdata.options.update_every * 100);
560 - },
561 -
562 - start: function() {
563 - if(netdata.options.DEBUG === true) this.debug('started, services: ' + netdata.stringify(this.services));
564 -
565 - if(this.services.length === 0) {
566 - this.disableNodePlugin();
567 - process.exit(1);
568 - }
569 - else this.runAllServices();
570 - },
571 -
572 - // disable the whole node.js plugin
573 - disableNodePlugin: function() {
574 - this.send('DISABLE');
575 - process.exit(1);
576 - },
577 -
578 - requestFromParams: function(protocol, hostname, port, path, method) {
579 - return {
580 - protocol: protocol,
581 - hostname: hostname,
582 - port: port,
583 - path: path,
584 - //family: 4,
585 - method: method,
586 - headers: {
587 - 'Content-Type': 'application/x-www-form-urlencoded',
588 - 'Connection': 'keep-alive'
589 - },
590 - agent: new http.Agent({
591 - keepAlive: true,
592 - keepAliveMsecs: netdata.options.update_every * 1000,
593 - maxSockets: 2, // it must be 2 to work
594 - maxFreeSockets: 1
595 - })
596 - };
597 - },
598 -
599 - requestFromURL: function(a_url) {
600 - var u = url.parse(a_url);
601 - return netdata.requestFromParams(u.protocol, u.hostname, u.port, u.path, 'GET');
602 - },
603 -
604 - configure: function(module, config, callback) {
605 - if(netdata.options.DEBUG === true) this.debug(module.name + ': configuring (update_every: ' + this.options.update_every + ')...');
606 -
607 - module.active = 0;
608 - module.update_every = this.options.update_every;
609 -
610 - if(typeof config.update_every !== 'undefined')
611 - module.update_every = config.update_every;
612 -
613 - module.enable_autodetect = (config.enable_autodetect)?true:false;
614 -
615 - if(typeof(callback) === 'function')
616 - module.configure_callback = callback;
617 - else
618 - module.configure_callback = null;
619 -
620 - var added = module.configure(config);
621 -
622 - if(netdata.options.DEBUG === true) this.debug(module.name + ': configured, reporting ' + added + ' eligible services.');
623 -
624 - if(module.configure_callback !== null && added === 0) {
625 - if(netdata.options.DEBUG === true) this.debug(module.name + ': configuration finish callback called from configure().');
626 - module.configure_callback = null;
627 - callback();
628 - }
629 -
630 - return added;
631 - }
220 + netdata.services.push(this);
221 + if(netdata.options.DEBUG === true) netdata.debug(this.module.name + ': ' + this.name + ': service committed.');
222 + }
223 + };
224 +
225 + service.execute = function(callback) {
226 + if(service.enabled === false) {
227 + callback(null);
228 + return;
229 + }
230 +
231 + this.module.active++;
232 + this.running = true;
233 + this.started = new Date().getTime();
234 + this.updates++;
235 +
236 + if(netdata.options.DEBUG === true)
237 + netdata.debug(this.module.name + ': ' + this.name + ': making ' + this.processor.name + ' request: ' + netdata.stringify(this));
238 +
239 + this.processor.process(this, function(response) {
240 + service.ended = new Date().getTime();
241 + service.duration = service.ended - service.started;
242 +
243 + if(typeof response === 'undefined')
244 + response = null;
245 +
246 + if(response !== null)
247 + service.errorClear();
248 +
249 + if(netdata.options.DEBUG === true)
250 + netdata.debug(service.module.name + ': ' + service.name + ': processing ' + service.processor.name + ' response (received in ' + (service.ended - service.started).toString() + ' ms)');
251 +
252 + callback(service, response);
253 +
254 + service.running = false;
255 + service.module.active--;
256 + if(service.module.active < 0) {
257 + service.module.active = 0;
258 + if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': active module counter below zero.');
259 + }
260 +
261 + if(service.module.active === 0) {
262 + // check if we run under configure
263 + if(service.module.configure_callback !== null) {
264 + if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': configuration finish callback called from processResponse().');
265 + var ccallback = service.module.configure_callback;
266 + service.module.configure_callback = null;
267 + ccallback();
268 + }
269 + }
270 + });
271 + };
272 +
273 + service.update = function() {
274 + if(netdata.options.DEBUG === true) netdata.debug(this.module.name + ': ' + this.name + ': starting data collection...');
275 +
276 + this.module.update(this, function() {
277 + if(netdata.options.DEBUG === true) netdata.debug(service.module.name + ': ' + service.name + ': data collection ended in ' + service.duration.toString() + ' ms.');
278 + });
279 + };
280 +
281 + service.error = function(message) {
282 + if(this.error_reported === false) {
283 + netdata.error(this.module.name + ': ' + this.name + ': ' + message);
284 + this.error_reported = true;
285 + }
286 + else if(netdata.options.DEBUG === true)
287 + netdata.debug(this.module.name + ': ' + this.name + ': ' + message);
288 + };
289 +
290 + service.errorClear = function() {
291 + this.error_reported = false;
292 + };
293 +
294 + service.queue = function(txt) {
295 + this._queue += txt + '\n';
296 + };
297 +
298 + service._send_chart_to_netdata = function(chart) {
299 + // internal function to send a chart to netdata
300 + this.queue('CHART "' + chart.id + '" "' + chart.name + '" "' + chart.title + '" "' + chart.units + '" "' + chart.family + '" "' + chart.context + '" "' + chart.type + '" ' + chart.priority.toString() + ' ' + chart.update_every.toString());
301 +
302 + for(var dim in chart.dimensions) {
303 + var d = chart.dimensions[dim];
304 +
305 + this.queue('DIMENSION "' + d.id + '" "' + d.name + '" "' + d.algorithm + '" ' + d.multiplier.toString() + ' ' + d.divisor.toString() + ' ' + ((d.hidden === true)?'hidden':'').toString());
306 + d._created = true;
307 + d._updated = false;
308 + }
309 +
310 + chart._created = true;
311 + chart._updated = false;
312 + };
313 +
314 + // begin data collection for a chart
315 + service.begin = function(chart) {
316 + if(this._current_chart !== null && this._current_chart !== chart) {
317 + this.error('Called begin() for chart ' + chart.id + ' while chart ' + this._current_chart.id + ' is still open. Closing it.');
318 + this.end();
319 + }
320 +
321 + if(typeof(chart.id) === 'undefined' || netdata.charts[chart.id] != chart) {
322 + this.error('Called begin() for chart ' + chart.id + ' that is not mine. Where did you find it? Ignoring it.');
323 + return false;
324 + }
325 +
326 + if(netdata.options.DEBUG === true) netdata.debug('setting current chart to ' + chart.id);
327 + this._current_chart = chart;
328 + this._current_chart._began = true;
329 +
330 + if(this._current_chart._dimensions_count !== 0) {
331 + if(this._current_chart._created === false || this._current_chart._updated === true)
332 + this._send_chart_to_netdata(this._current_chart);
333 +
334 + var now = this.ended;
335 + this.queue('BEGIN ' + this._current_chart.id + ' ' + ((this._current_chart._last_updated > 0)?((now - this._current_chart._last_updated) * 1000):'').toString());
336 + }
337 + // else this.error('Called begin() for chart ' + chart.id + ' which is empty.');
338 +
339 + this._current_chart._last_updated = now;
340 + this._current_chart._began = true;
341 + this._current_chart._counter++;
342 +
343 + return true;
344 + };
345 +
346 + // set a collected value for a chart
347 + // we do most things on the first value we attempt to set
348 + service.set = function(dimension, value) {
349 + if(this._current_chart === null) {
350 + this.error('Called set(' + dimension + ', ' + value + ') without an open chart.');
351 + return false;
352 + }
353 +
354 + if(typeof(this._current_chart.dimensions[dimension]) === 'undefined') {
355 + this.error('Called set(' + dimension + ', ' + value + ') but dimension "' + dimension + '" does not exist in chart "' + this._current_chart.id + '".');
356 + return false;
357 + }
358 +
359 + if(typeof value === 'undefined' || value === null)
360 + return false;
361 +
362 + if(this._current_chart._dimensions_count !== 0) {
363 + if (value instanceof Buffer)
364 + this.queue('SET ' + dimension + ' = 0x' + value.toString('hex'));
365 + else
366 + this.queue('SET ' + dimension + ' = ' + value.toString());
367 + }
368 +
369 + return true;
370 + };
371 +
372 + // end data collection for the current chart - after calling begin()
373 + service.end = function() {
374 + if(this._current_chart !== null && this._current_chart._began === false) {
375 + this.error('Called end() without an open chart.');
376 + return false;
377 + }
378 +
379 + if(this._current_chart._dimensions_count !== 0) {
380 + this.queue('END');
381 + netdata.send(this._queue);
382 + }
383 +
384 + this._queue = '';
385 + this._current_chart._began = false;
386 + if(netdata.options.DEBUG === true) netdata.debug('sent chart ' + this._current_chart.id);
387 + this._current_chart = null;
388 + return true;
389 + };
390 +
391 + // discard the collected values for the current chart - after calling begin()
392 + service.flush = function() {
393 + if(this._current_chart === null || this._current_chart._began === false) {
394 + this.error('Called flush() without an open chart.');
395 + return false;
396 + }
397 +
398 + this._queue = '';
399 + this._current_chart._began = false;
400 + this._current_chart = null;
401 + return true;
402 + };
403 +
404 + // create a netdata chart
405 + service.chart = function(id, chart) {
406 + if(typeof(netdata.charts[id]) === 'undefined') {
407 + netdata.charts[id] = {
408 + _created: false,
409 + _updated: true,
410 + _began: false,
411 + _counter: 0,
412 + _last_updated: 0,
413 + _dimensions_count: 0,
414 + id: id,
415 + name: id,
416 + title: 'untitled chart',
417 + units: 'a unit',
418 + family: '',
419 + context: '',
420 + type: netdata.chartTypes.line,
421 + priority: 50000,
422 + update_every: netdata.options.update_every,
423 + dimensions: {}
424 + };
425 + }
426 +
427 + var c = netdata.charts[id];
428 +
429 + if(typeof(chart.name) !== 'undefined' && chart.name !== c.name) {
430 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its name');
431 + c.name = chart.name;
432 + c._updated = true;
433 + }
434 +
435 + if(typeof(chart.title) !== 'undefined' && chart.title !== c.title) {
436 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its title');
437 + c.title = chart.title;
438 + c._updated = true;
439 + }
440 +
441 + if(typeof(chart.units) !== 'undefined' && chart.units !== c.units) {
442 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its units');
443 + c.units = chart.units;
444 + c._updated = true;
445 + }
446 +
447 + if(typeof(chart.family) !== 'undefined' && chart.family !== c.family) {
448 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its family');
449 + c.family = chart.family;
450 + c._updated = true;
451 + }
452 +
453 + if(typeof(chart.context) !== 'undefined' && chart.context !== c.context) {
454 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its context');
455 + c.context = chart.context;
456 + c._updated = true;
457 + }
458 +
459 + if(typeof(chart.type) !== 'undefined' && chart.type !== c.type) {
460 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its type');
461 + c.type = chart.type;
462 + c._updated = true;
463 + }
464 +
465 + if(typeof(chart.priority) !== 'undefined' && chart.priority !== c.priority) {
466 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its priority');
467 + c.priority = chart.priority;
468 + c._updated = true;
469 + }
470 +
471 + if(typeof(chart.update_every) !== 'undefined' && chart.update_every !== c.update_every) {
472 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' updated its update_every from ' + c.update_every + ' to ' + chart.update_every);
473 + c.update_every = chart.update_every;
474 + c._updated = true;
475 + }
476 +
477 + if(typeof(chart.dimensions) !== 'undefined') {
478 + for(var x in chart.dimensions) {
479 + if(typeof(c.dimensions[x]) === 'undefined') {
480 + c._dimensions_count++;
481 +
482 + c.dimensions[x] = {
483 + _created: false,
484 + _updated: false,
485 + id: x, // the unique id of the dimension
486 + name: x, // the name of the dimension
487 + algorithm: netdata.chartAlgorithms.absolute, // the id of the netdata algorithm
488 + multiplier: 1, // the multiplier
489 + divisor: 1, // the divisor
490 + hidden: false, // is hidden (boolean)
491 + };
492 +
493 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ' created dimension ' + x);
494 + c._updated = true;
495 + }
496 +
497 + var dim = chart.dimensions[x];
498 + var d = c.dimensions[x];
499 +
500 + if(typeof(dim.name) !== 'undefined' && d.name !== dim.name) {
501 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its name');
502 + d.name = dim.name;
503 + d._updated = true;
504 + }
505 +
506 + if(typeof(dim.algorithm) !== 'undefined' && d.algorithm !== dim.algorithm) {
507 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its algorithm from ' + d.algorithm + ' to ' + dim.algorithm);
508 + d.algorithm = dim.algorithm;
509 + d._updated = true;
510 + }
511 +
512 + if(typeof(dim.multiplier) !== 'undefined' && d.multiplier !== dim.multiplier) {
513 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its multiplier');
514 + d.multiplier = dim.multiplier;
515 + d._updated = true;
516 + }
517 +
518 + if(typeof(dim.divisor) !== 'undefined' && d.divisor !== dim.divisor) {
519 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its divisor');
520 + d.divisor = dim.divisor;
521 + d._updated = true;
522 + }
523 +
524 + if(typeof(dim.hidden) !== 'undefined' && d.hidden !== dim.hidden) {
525 + if(netdata.options.DEBUG === true) netdata.debug('chart ' + id + ', dimension ' + x + ' updated its hidden status');
526 + d.hidden = dim.hidden;
527 + d._updated = true;
528 + }
529 +
530 + if(d._updated) c._updated = true;
531 + }
532 + }
533 +
534 + //if(netdata.options.DEBUG === true) netdata.debug(netdata.charts);
535 + return netdata.charts[id];
536 + };
537 +
538 + return service;
539 + },
540 +
541 + runAllServices: function() {
542 + if(netdata.options.DEBUG === true) netdata.debug('runAllServices()');
543 +
544 + var now = new Date().getTime();
545 + var len = netdata.services.length;
546 + while(len--) {
547 + var service = netdata.services[len];
548 +
549 + if(service.enabled === false || service.running === true) continue;
550 + if(now <= service.next_run) continue;
551 +
552 + service.update();
553 +
554 + now = new Date().getTime();
555 + service.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
556 + }
557 +
558 + // 1/10th of update_every in pause
559 + setTimeout(netdata.runAllServices, netdata.options.update_every * 100);
560 + },
561 +
562 + start: function() {
563 + if(netdata.options.DEBUG === true) this.debug('started, services: ' + netdata.stringify(this.services));
564 +
565 + if(this.services.length === 0) {
566 + this.disableNodePlugin();
567 + process.exit(1);
568 + }
569 + else this.runAllServices();
570 + },
571 +
572 + // disable the whole node.js plugin
573 + disableNodePlugin: function() {
574 + this.send('DISABLE');
575 + process.exit(1);
576 + },
577 +
578 + requestFromParams: function(protocol, hostname, port, path, method) {
579 + return {
580 + protocol: protocol,
581 + hostname: hostname,
582 + port: port,
583 + path: path,
584 + //family: 4,
585 + method: method,
586 + headers: {
587 + 'Content-Type': 'application/x-www-form-urlencoded',
588 + 'Connection': 'keep-alive'
589 + },
590 + agent: new http.Agent({
591 + keepAlive: true,
592 + keepAliveMsecs: netdata.options.update_every * 1000,
593 + maxSockets: 2, // it must be 2 to work
594 + maxFreeSockets: 1
595 + })
596 + };
597 + },
598 +
599 + requestFromURL: function(a_url) {
600 + var u = url.parse(a_url);
601 + return netdata.requestFromParams(u.protocol, u.hostname, u.port, u.path, 'GET');
602 + },
603 +
604 + configure: function(module, config, callback) {
605 + if(netdata.options.DEBUG === true) this.debug(module.name + ': configuring (update_every: ' + this.options.update_every + ')...');
606 +
607 + module.active = 0;
608 + module.update_every = this.options.update_every;
609 +
610 + if(typeof config.update_every !== 'undefined')
611 + module.update_every = config.update_every;
612 +
613 + module.enable_autodetect = (config.enable_autodetect)?true:false;
614 +
615 + if(typeof(callback) === 'function')
616 + module.configure_callback = callback;
617 + else
618 + module.configure_callback = null;
619 +
620 + var added = module.configure(config);
621 +
622 + if(netdata.options.DEBUG === true) this.debug(module.name + ': configured, reporting ' + added + ' eligible services.');
623 +
624 + if(module.configure_callback !== null && added === 0) {
625 + if(netdata.options.DEBUG === true) this.debug(module.name + ': configuration finish callback called from configure().');
626 + module.configure_callback = null;
627 + callback();
628 + }
629 +
630 + return added;
631 + }
632 };
633
634 if(netdata.options.DEBUG === true) netdata.debug('loaded netdata from: ' + __filename);