Raven
Node v0.9 compatible
Log errors and stack traces in Sentry from within your Node.js applications. Includes middleware support for Connect/Express.
All processing and sending happens asynchronously to not slow things down if/when Sentry is down or slow.
Compatibility
- 0.6.x
- 0.8.x
- 0.9.x (latest unstable)
Installation
$ npm install raven
Basic Usage
var raven = require('raven');
var client = new raven.Client('{{ SENTRY_DSN }}');
client.captureMessage('Hello, world!');
Run with:
$ NODE_ENV=production node script.js
Logging an error
client.captureError(new Error('Broke!'));
Logging a query
client.captureQuery('SELECT * FROM `awesome`', 'mysql');
Sentry Identifier
client.captureMessage('Hello, world!', function(result) {
console.log(client.getIdent(result));
});
client.captureError(new Error('Broke!'), function(result) {
console.log(client.getIdent(result));
});
Note: client.captureMessage
will also return the result directly without the need for a callback, such as: var result = client.captureMessage('Hello, world!');
Events
If you really care if the event was logged or errored out, Client emits two events, logged
and error
:
client.on('logged', function(){
console.log('Yay, it worked!');
});
client.on('error', function(e){
console.log('oh well, Sentry is broke.');
})
client.captureMessage('Boom');
Error Event
The event error is augmented with the original Sentry response object as well as the response body and statusCode for easier debugging.
client.on('error', function(e){
console.log(e.responseBody);
console.log(e.statusCode);
console.log(e.response);
});
Environment variables
NODE_ENV
NODE_ENV
must be set to production
for Sentry to actually work. Without being in production, a warning is issued and logging disabled.
SENTRY_DSN
Optionally declare the DSN to use for the client through the environment. Initializing the client in your app won't require setting the DSN.
SENTRY_NAME
Optionally set the name for the client to use. What is name?
SENTRY_SITE
Optionally set the site for the client to use. What is site?
Catching global errors
For those times when you don't catch all errors in your application. ;)
client.patchGlobal();
raven.patchGlobal(client);
raven.patchGlobal('{{ SENTRY_DSN }}');
It is recommended that you don't leave the process running after receiving an uncaughtException
(http://nodejs.org/api/process.html#process_event_uncaughtexception), so an optional callback is provided to allow you to hook in something like:
client.patchGlobal(function() {
console.log('Bye, bye, world.')
process.exit(1);
});
The callback is called after the event has been sent to the Sentry server.
Methods
new raven.Client(dsn[, options])
client.captureMessage(string[,callback])
client.captureError(Error[,callback])
client.captureQuery(string, string[,callback])
Integrations
Connect/Express middleware
The Raven middleware can be used as-is with either Connect or Express in the same way. Take note that in your middlewares, Raven must appear after your main handler to pick up any errors that may result from handling a request.
Connect
var connect = require('connect');
function mainHandler(req, res) {
throw new Error('Broke!');
}
function onError(err, req, res, next) {
res.statusCode = 500;
res.end(res.sentry+'\n');
}
connect(
connect.bodyParser(),
connect.cookieParser(),
mainHandler,
raven.middleware.connect('{{ SENTRY_DSN }}'),
onError,
).listen(3000);
Express
var app = require('express').createServer();
app.use(raven.middleware.express('{{ SENTRY_DSN }}'));
app.use(onError);
app.get('/', function mainHandler(req, res) {
throw new Error('Broke!');
});
app.listen(3000);
Note: raven.middleware.express
or raven.middleware.connect
must be added to the middleware stack before any other error handling middlewares or there's a chance that the error will never get to Sentry.
Support
You can find me on IRC. I troll in #sentry
on freenode
.