opsgenie
Version:
A module for sending heartbeats to OpsGenie
109 lines (86 loc) • 2.79 kB
JavaScript
;
var util = require('util');
var https = require('https');
var os = require('os');
var EventEmitter = require('events').EventEmitter;
var httpsOptions = {
hostname: 'api.opsgenie.com',
path: '/v1/json/heartbeat/send',
method: 'POST'
};
var OpsGenie = function () {};
util.inherits(OpsGenie, EventEmitter);
OpsGenie.prototype.heartbeat = start;
OpsGenie.prototype._error = error;
OpsGenie.prototype._config = config;
OpsGenie.prototype._sendHeartbeat = sendHeartbeat;
OpsGenie.prototype._queueHeartbeat = queueHeartbeat;
var opsgenie = module.exports = exports = new OpsGenie();
// auto-configure using environment variables
process.nextTick(function () {
if (opsgenie._configuration) return;
opsgenie.heartbeat();
});
function start(options) {
if (!opsgenie._config(options)) {
console.warn('[opsgenie] could not find API key - heartbeat agent disabled!');
return;
}
opsgenie._queueHeartbeat();
}
function config(options) {
if (!options) options = {};
// `source` and `OPSGENIE_SOURCE` below is there for backwards compatibility
opsgenie._configuration = {
apiKey: options.apiKey || process.env.OPSGENIE_API_KEY,
name: options.name || options.source || process.env.OPSGENIE_NAME || process.env.OPSGENIE_SOURCE || os.hostname()
};
return !!opsgenie._configuration.apiKey;
}
function error(err) {
if (opsgenie.listeners('error').length)
opsgenie.emit('error', err);
opsgenie._queueHeartbeat();
}
function sendHeartbeat() {
var req = https.request(httpsOptions, function (res) {
var data = '';
res.setEncoding('utf8');
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
var json = {};
if (data) {
try {
json = JSON.parse(data);
} catch (err) {
error(err);
return;
}
opsgenie._response = json;
}
if (res.statusCode !== 200 || json.code !== 200)
error(new Error('Unexpected OpsGenie response (code: ' + res.statusCode + ', msg: ' + json.status + ')'));
if (data)
opsgenie.emit('heartbeat', json);
opsgenie._queueHeartbeat();
});
});
req.on('error', error);
req.end(JSON.stringify({
apiKey: opsgenie._configuration.apiKey,
name: opsgenie._configuration.name
}));
}
// If the current heartbeat exprires in 10 minutes, send the next heartbeat in 5
function queueHeartbeat() {
var now = new Date().getTime(),
expires = opsgenie._response && opsgenie._response.willExpireAt || now,
diff = expires - now,
next = diff / 2;
// avoid DoS'ing OpsGenie
if (next < 1000) next = 1000;
clearTimeout(opsgenie._queue);
opsgenie._queue = setTimeout(opsgenie._sendHeartbeat, next);
}