@cryptotaxi247 / netdata-1 / commits / 2d6768e41

better error handling

Costa Tsaousis (ktsaou) committed Jan 7, 2016 at 10:23 UTC 2d6768e41abd5d26b0dba36a440c2009114969d6
1 file changed +46 -20
plugins.d/sma_webbox.plugin
+46 -20
@@ -144,6 +144,7 @@ function getSMAData(server, callback) {
144 if(typeof(server.last_updated) === 'undefined')
145 server.last_updated = 0;
146
147 + // create an agent for keep-alive
148 if(typeof(server.agent) === 'undefined') {
149 server.agent = new http.Agent({
150 keepAlive: true,
@@ -153,18 +154,22 @@ function getSMAData(server, callback) {
154 });
155 }
156
157 + // create the charts, if we haven't already
158 if(typeof(server.created) === 'undefined') {
159 netdata('CHART sma_webbox_' + server.name + '.current "" "Solar Power Production of ' + server.name + '" "Watts" sma_webbox_' + server.name + ' "" area 15000 ' + Math.round(UPDATE_EVERY / 1000));
160 netdata('DIMENSION GriPwr power absolute 1 1');
161 +
162 netdata('CHART sma_webbox_' + server.name + '.today "" "Today\'s Solar Power Production of ' + server.name + '" "kWatts" sma_webbox_' + server.name + ' "" area 15001 ' + Math.round(UPDATE_EVERY / 1000));
163 netdata('DIMENSION GriEgyTdy today absolute 1 1000');
164 +
165 netdata('CHART sma_webbox_' + server.name + '.total "" "Total Solar Power Production of ' + server.name + '" "kWatts" sma_webbox_' + server.name + ' "" area 15001 ' + Math.round(UPDATE_EVERY / 1000));
166 netdata('DIMENSION GriEgyTot total absolute 1 1000');
167 +
168 server.created = true;
169 }
170
166 - server.error = 500;
167 - server.success = false;
171 + // initialize our metrics to null
172 + // so that we will know if we read them or not
173 server.data = {
174 'GriPwr': {
175 unit: null,
@@ -197,24 +202,38 @@ function getSMAData(server, callback) {
202 agent: server.agent
203 };
204
205 + server.error = 0;
206 + server.success = false;
207 server.response = '';
208 server.request = http.request(options, function(res) {
209 res.setEncoding('utf8');
203 - server.error = 0;
204 -
210 server.response_code = res.statusCode;
211
212 // check if we got HTTP/200
213 if(server.response_code !== 200) {
209 - debug('Server responded with ' + server.response_code + ', failed to get data.');
210 - server.error = 503;
211 - server.running = false;
212 - server.success = false;
213 - if(typeof(callback) === 'function')
214 - callback(server);
214 + // if this request is in error and we have
215 + // handled it, don't do anything more
216 + if(server.error === 0) {
217 + debug('Server responded with ' + server.response_code + ', failed to get data.');
218 + server.error = 503;
219 + server.success = false;
220 + server.running = false;
221 + if(typeof(callback) === 'function')
222 + callback(server);
223 + }
224 }
225
226 + res.on('data', function(chunk) {
227 + // read more data, only if there is no error
228 + if(server.error === 0)
229 + server.response += chunk;
230 + });
231 +
232 res.on('error', function() {
233 + // do we have already handled this error?
234 + if(server.error !== 0)
235 + return;
236 +
237 debug('Received HTTP read error, failed to get data.');
238 server.error = 504;
239 server.success = false;
@@ -223,11 +242,9 @@ function getSMAData(server, callback) {
242 callback(server);
243 });
244
226 - res.on('data', function(chunk) {
227 - server.response += chunk;
228 - });
229 -
245 res.on('end', function() {
246 + // if there is an error we have handled
247 + // don't do anything
248 if(server.error !== 0)
249 return;
250
@@ -250,8 +267,6 @@ function getSMAData(server, callback) {
267 server.data[e.meta].unit = e.unit;
268 }
269 }
253 - server.error = 0;
254 - server.last_updated = t;
270
271 if(server.data['GriPwr'].value !== null) {
272 netdata('BEGIN sma_webbox_' + server.name + '.current ' + ((server.dt)?server.dt*1000:'').toString());
@@ -270,26 +285,37 @@ function getSMAData(server, callback) {
285 netdata('SET GriEgyTot = ' + Math.round(server.data['GriEgyTot'].value * 1000));
286 netdata('END');
287 }
288 +
289 + server.error = 0;
290 + server.success = true;
291 + server.last_updated = t;
292 }
293 catch(e) {
294 server.error = 501;
295 + server.success = false;
296 server.failure_message = e.message;
297 error('FAILED TO PARSE DATA: ' + e.message);
298 }
299
300 server.running = false;
281 - if(typeof(callback) === 'function') {
282 - server.success = true;
301 + if(typeof(callback) === 'function')
302 callback(server);
284 - }
303 });
304 });
305
306 server.request.on('error', function(e) {
289 - server.running = false;
307 + // do we have already handled this error?
308 + if(server.error !== 0)
309 + return;
310 +
311 server.error = 502;
312 + server.success = false;
313 + server.running = false;
314 server.failure_message = e.message;
315 error('problem with request to ' + server.hostname + ': ' + e.message);
316 +
317 + if(typeof(callback) === 'function')
318 + callback(server);
319 });
320
321 // write data to request body