Beyond Profilers: 
Tracing Node.js Transactions 
TR Jordan 
October 2014
users 
users’ data
users 
browser 
internet 
webserver 
application 
database cache 
external API
users 
browser 
internet 
webserver 
application 
database cache 
external API
Throughput vs. Network Capacity
users 
browser 
internet 
webserver 
application 
database cache 
external API
users 
browser 
internet 
webserver 
application 
database cache 
external API
Request ID 
+ 
Operation IDs 
+ 
Other Stuff™
Code
var http = require('http'); 
var shimmer = require('shimmer'); 
shimmer.wrap(http, 'request', function 
(original) { 
return function () { 
console.log("Starting request!"); 
var returned = original.apply(this, 
arguments) 
console.log("Done setting up request"); 
return returned; 
}; 
});
shimmer.wrap(collection.prototype, 'update', 
function (fn) { 
return function (query, doc, options, callback) { 
if (typeof options === 'function') { 
callback = options 
options = {} 
} 
var run = fn.bind(this, query, doc, options) 
return attempt(run, this.collectionName, 
this.db, { 
QueryOp: 'update', 
Query: JSON.stringify(query), 
Update_Document: JSON.stringify(doc) 
}, callback) 
} 
})
Challenges
Initial Function 
Callback 
Callback 
Callback 
Callback 
User
Initial Function 
Callback 
Callback 
Callback 
Callback 
User
Node 
Work Queue Callback
C++ Node OS 
Work Queue Callback
Initial Function 
Callback 
Callback 
Callback 
Callback 
User
Tracelyzer via UDP
Tracelyzer via UDP 
5 
0 
0
Thanks! 
Connect. 
@_tr 
tjordan@appneta.com 
Read. 
• On the Blog: 
happneta.com/blog/x-trace-introduction/ 
• On GitHub: 
github.com/appneta/node-traceview 
We’re Hiring!

Beyond Profilers: Tracing Node.js Transactions