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