cloudcms-server
Version:
Cloud CMS Application Server Module
200 lines (155 loc) • 5.65 kB
JavaScript
var path = require('path');
var fs = require('fs');
var http = require('http');
var util = require("../../util/util");
var cluster = require("cluster");
// REMOVE HEAPDUMP UNTIL BETTER SUPPORTED
// //"heapdump": "^0.3.7",
//var heapdump = require('heapdump');
/**
* Debug middleware.
*
* @type {Function}
*/
exports = module.exports = function()
{
var logGlobalTimings = false;
var logGlobalTimingsFn = function() {
setTimeout(function() {
if (logGlobalTimings)
{
var timings = util.getGlobalTimings();
if (timings && Object.keys(timings).length > 0)
{
console.log("Global Timings");
for (var k in timings)
{
console.log(" -> " + k + ", average: " + timings[k].avg);
}
}
}
logGlobalTimingsFn();
}, 5000)
};
logGlobalTimingsFn();
var logMemory = true;
var MB = 1024*1024;
var oldHeapTotal = 0;
var shuttingDown = false;
var logFn = function() {
setTimeout(function() {
if (shuttingDown)
{
return;
}
util.countOpenHandles(function(err, openHandleCount) {
if (!err || !openHandleCount)
{
openHandleCount = "unknown";
}
var memUsage = process.memoryUsage();
var newRss = (memUsage.rss / MB).toFixed(2);
var newHeap = (memUsage.heapUsed / MB).toFixed(2);
var newHeapTotal = (memUsage.heapTotal / MB).toFixed(2);
var deltaHeapTotal = (newHeapTotal - oldHeapTotal).toFixed(2);
if (newHeapTotal - oldHeapTotal !== 0)
{
// only master process reports
if (cluster.isMaster)
{
console.log('Open Files: ' + openHandleCount + ', RSS: ' + newRss + ' MB, Heap Used: ' + newHeap + ' MB, Heap Total: ' + newHeapTotal + ' MB, Heap Total Change: ' + deltaHeapTotal + ' MB');
}
}
oldHeapTotal = newHeapTotal;
logFn();
});
}, 30000);
};
logFn();
// listen for kill or interrupt so that we can shut down cleanly
process.on('SIGINT', function() {
shuttingDown = true;
});
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// RESULTING OBJECT
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
var r = {};
/**
* Handles debug mode.
*
* @return {Function}
*/
r.handler = function()
{
if (process.configuration)
{
if (process.configuration.debug)
{
if (typeof(process.configuration.debug.logGlobalTimings) !== "undefined")
{
logGlobalTimings = process.configuration.debug.logGlobalTimings;
}
if (typeof(process.configuration.debug.logMemory) !== "undefined")
{
logMemory = process.configuration.debug.logMemory;
}
}
}
return util.createHandler("debug", function(req, res, next, stores, cache, configuration) {
var handled = false;
if (req.method.toLowerCase() === "get") {
if (req.url.indexOf("/_debug/timings") === 0)
{
var timings = util.getGlobalTimings();
res.status(200).json({
"ok": true,
"timings": timings
});
handled = true;
}
// REMOVE HEAPDUMP UNTIL BETTER SUPPORTED
/*
// captures and downloads a snapshot file
if (req.url.indexOf("/_debug/heap/snapshot") === 0)
{
// writes a snapshot
var filename = Date.now() + ".heapsnapshot";
var filepath = "/tmp/" + filename;
heapdump.writeSnapshot(filepath);
util.setHeader(res, "Content-disposition", "attachment; filename=" + filename);
util.setHeader(res, "Content-Type", "text/heapsnapshot");
var filestream = fs.createReadStream(filepath);
filestream.pipe(res);
handled = true;
}
*/
}
// REMOVE HEAPDUMP UNTIL BETTER SUPPORTED
/*
if (req.method.toLowerCase() === "post") {
// captures a heap snapshot file
// or do this: kill -USR2 <pid>
if (req.url.indexOf("/_debug/heap/snapshot") === 0)
{
// writes a snapshot
var filename = Date.now() + ".heapsnapshot";
var filepath = "/tmp/" + filename;
heapdump.writeSnapshot(filepath);
res.status(200).json({
"ok": true,
"snapshot": filepath
});
handled = true;
}
}
*/
if (!handled)
{
next();
}
});
};
return r;
}();