Skip to content

Commit

Permalink
Adding winston mongodb, mail, and console logging in place of 'errorH…
Browse files Browse the repository at this point in the history
…andler', make it configurable in config.json, add uncaughtException handler in api
  • Loading branch information
Ryan Fink committed Feb 21, 2013
1 parent 05a9b1f commit e96f7b1
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 39 deletions.
36 changes: 33 additions & 3 deletions example/config.json
Expand Up @@ -11,7 +11,30 @@
"masterExternalPort": 16162,
"masterInternalPort": 31242,
"slaveInternalPort": 31243,
"jobKillPort": 31244
"jobKillPort": 31244,
"logging": {
"mail": {
"level": "error",
"to": "nobody@nowhere.com"
},
"console": {
"level": "info",
"json": true
},
"mongodb": {
"level": [ "warn", "error" ],
"db": "Tock",
"collection": "logs",
"host": "localhost",
"port": 27017,
"username": null,
"password": null
}
},
"transports": [
"Mail",
"MongoDB"
]
},
"development": {
"mongo": {
Expand All @@ -20,7 +43,11 @@
"user": null,
"password": null,
"dbName": "Tock"
}
},
"transports": [
"Console",
"Mail"
]
},
"test": {
"mongo": {
Expand All @@ -29,6 +56,9 @@
"user": null,
"password": null,
"dbName": "TockTest"
}
},
"transports": [
"Console"
]
}
}
21 changes: 18 additions & 3 deletions lib/api.js
Expand Up @@ -16,8 +16,8 @@ var debug = require('debug')('tock-api')
, mongoose = require(__dirname + '/mongocommon')
, Job = require('./model/job')
, JobSchedule = require(__dirname + '/model/jobschedule')
, errorHandler = require(__dirname + '/errorhandler')
, Tock = require('./tock');
, Tock = require('./tock')
, logger = require(__dirname + '/logger');

var tock = new Tock()
, dbClient = mongoose.connection.db
Expand Down Expand Up @@ -367,7 +367,7 @@ app.get('/', function(req, res, next) {

app.use(function(err, req, res, next) {

errorHandler(errorHandler.ERROR_WARN, err);
logger.warn(err, req);

return res.json(500, {
error: err.toString(),
Expand All @@ -376,5 +376,20 @@ app.use(function(err, req, res, next) {

});

/**
* All-else-fails exception handler, at least log that junk
*/

process.on('uncaughtException', function(err) {

logger.error(err.toString(), err.stack);
process.nextTick(function() {
setTimeout(function() { process.exit(1); }, 100);
});

});

throw new Error('Fuck it!');

server.listen(config.masterExternalPort);
tock.start();
15 changes: 0 additions & 15 deletions lib/errorhandler.js

This file was deleted.

18 changes: 18 additions & 0 deletions lib/logger.js
@@ -0,0 +1,18 @@

/* ~ Application dependencies ~ */

var envcfg = require('envcfg')
, config = envcfg(__dirname + '/config.json')
, winston = require('winston')
, winstonMail = require('winston-mail')
, winstonMongoDB = require('winston-mongodb');

var logTransports = [];

(config.transports || []).forEach(function(transport) {
logTransports.push(new winston.transports[ transport ](config.logging[ transport.toLowerCase() ]));
});

var logger = exports = module.exports = new (winston.Logger)({
transports: logTransports
});
33 changes: 17 additions & 16 deletions lib/tock.js
Expand Up @@ -13,7 +13,7 @@ var debug = require('debug')('tock-master')
, JobSchedule = require('./model/jobschedule')
, SingleJob = require('./model/singlejob')
, EventEmitter = require('events').EventEmitter
, errorHandler = require('./errorhandler');
, logger = require('./logger');

var dbClient = mongoose.connection.db
, GridStore = mongoose.mongo.GridStore;
Expand Down Expand Up @@ -55,7 +55,7 @@ Tock.prototype.router = function(message) {
};

if (routes[ message.event ]) return routes[ message.event ](message.data);
else return errorHandler(errorHandler.ERROR_WARNING, new Error('Route ' + message.event + ' not found'));
else return logger.warn(new Error('Route ' + message.event + ' not found'));

return this;

Expand All @@ -71,7 +71,7 @@ Tock.prototype.onJobCompleted = function(data) {

return this.getJobById(data.id, function(err, job) {

if (err) return errorHandler(errorHandler.ERROR_WARNING, err);
if (err) return logger.warn(err);

// Close our gridfs files
job.stdOutStream.close(function() {});
Expand All @@ -83,7 +83,7 @@ Tock.prototype.onJobCompleted = function(data) {

job.jobModel.save(function(err) {

if (err) return errorHandler(errorHandler.ERROR_CRITICAL, err);
if (err) return logger.error(err);

// Delete our running job entry
delete self.runningJobs[ data.id ];
Expand Down Expand Up @@ -118,10 +118,10 @@ Tock.prototype.onJobStdOut = function(data) {

return this.getJobById(data.id, function(err, job) {

if (err) return errorHandler(errorHandler.ERROR_WARNING, err);
if (err) return logger.warn(err);

job.stdOutStream.write(data.stdOut, function(err) {
if (err) return errorHandler(errorHandler.ERROR_WARNING, JSON.stringify(err));
if (err) return logger.warn(err);
});

self.emit('job:stdOut', data);
Expand All @@ -140,10 +140,10 @@ Tock.prototype.onJobStdErr = function(data) {

return this.getJobById(data.id, function(err, job) {

if (err) return errorHandler(errorHandler.ERROR_WARNING, err);
if (err) return logger.warn(err);

job.stdErrStream.write(data.stdErr, function(err) {
if (err) return errorHandler(errorHandler.ERROR_WARNING, JSON.stringify(err));
if (err) return logger.warn(err);
});

self.emit('job:stdErr', data);
Expand All @@ -162,11 +162,11 @@ Tock.prototype.onJobError = function(data) {

return this.getJobById(data.id, function(err, job) {

if (err) return errorHandler(errorHandler.ERROR_WARNING, err);
if (err) return logger.warn(err);

job.jobModel.errorCode = data.errorCode;
self.emit('job:error', data);
return errorHandler(errorHandler.ERROR_WARNING, data.errorCode);
return logger.warn(new Error('Job error'), data);

});

Expand Down Expand Up @@ -306,7 +306,7 @@ Tock.prototype.spawnJob = function(job) {

if (!this.publisherSocket.socks.length) {
this.emit('job:error', new Error('No clients available'));
return errorHandler(errorHandler.ERROR_WARNING, new Error('No clients!!'));
return logger.warn(new Error('No clients!!'));
}

// Create job model, populate, save
Expand All @@ -320,19 +320,19 @@ Tock.prototype.spawnJob = function(job) {

if (err) {
self.emit('job:error', err);
return errorHandler(errorHandler.ERROR_CRITICAL, err);
return logger.error(err);
}

self.getFileStreams(jobModel, function(err, streams) {

if (err) {
self.emit('job:error', err);
return errorHandler(errorHandler.ERROR_CRITICAL, JSON.stringify(err));
return logger.error(err);
}

// Save our job model to persist the stdOut and stdErr file names
jobModel.save(function(err) {
if (err) return errorHandler(errorHandler.ERROR_WARNING, err);
if (err) return logger.error(err);
});

self.runningJobs[ jobModel._id ] = {
Expand Down Expand Up @@ -412,7 +412,7 @@ Tock.prototype.getFileStreams = function(jobModel, callback) {
Tock.prototype.killJob = function(jobId) {

var job = this.runningJobs[ jobId ];
if (!job) return errorHandler(errorHandler.ERROR_WARNING, 'Attempted to kill a non-running job');
if (!job) return logger.warn(new Error('Attempted to kill a non-running job'), { id: jobId });
this.jobKillerSocket.send('job:kill', { id: jobId });

return this;
Expand All @@ -439,6 +439,7 @@ Tock.prototype.dispatch = function() {
self.spawnJob(job);
} else {
debug('Job ' + job._id + ' exceeded maximum concurrency, you got tock-blocked!');
self.emit('job:max:concurrency', { date: new Date(), id: job._id });
}
});
});
Expand Down Expand Up @@ -536,7 +537,7 @@ Tock.prototype.spawnSingleJob = function(request, callback) {
singleJobModel.save(function(err) {
if (err) {
callback(err);
return errorHandler(errorHandler.ERROR_CRITICAL, err);
return logger.error(err);
}
callback(null, singleJobModel);
if (request.job.runSync) {
Expand Down
1 change: 0 additions & 1 deletion lib/worker.js
Expand Up @@ -6,7 +6,6 @@ var debug = require('debug')('tock-worker')
, config = envcfg(__dirname + '/config.json')
, child_process = require('child_process')
, axon = require('axon')
, errorHandler = require(__dirname + '/errorhandler')
, EventEmitter = require('events').EventEmitter
, hostname = require('os').hostname()
, workerId = process.env.TOCK_WORKER_ID || (hostname + ':' + process.pid);
Expand Down
5 changes: 4 additions & 1 deletion package.json
Expand Up @@ -29,7 +29,10 @@
"envcfg": "0.0.x",
"debug": "0.7.x",
"consolidate": "0.8.x",
"connect-flash": "0.1.x"
"connect-flash": "0.1.x",
"winston": "0.6.x",
"winston-mail": "0.2.x",
"winston-mongodb": "0.4.x"
},
"devDependencies": {
"should": "*",
Expand Down

0 comments on commit e96f7b1

Please sign in to comment.