]> git.cworth.org Git - obsolete/notmuch-web/blob - node_modules/express/node_modules/connect/lib/middleware/profiler.js
Install the "express" node module via npm
[obsolete/notmuch-web] / node_modules / express / node_modules / connect / lib / middleware / profiler.js
1
2 /*!
3  * Connect - profiler
4  * Copyright(c) 2011 TJ Holowaychuk
5  * MIT Licensed
6  */
7
8 /**
9  * Profile the duration of a request.
10  *
11  * Typically this middleware should be utilized
12  * _above_ all others, as it proxies the `res.end()`
13  * method, being first allows it to encapsulate all
14  * other middleware.
15  *
16  * Example Output:
17  *
18  *      GET /
19  *      response time 2ms
20  *      memory rss 52.00kb
21  *      memory vsize 2.07mb
22  *      heap before 3.76mb / 8.15mb
23  *      heap after 3.80mb / 8.15mb
24  *
25  * @api public
26  */
27
28 module.exports = function profiler(){
29   return function(req, res, next){
30     var end = res.end
31       , start = snapshot();
32
33     // state snapshot
34     function snapshot() {
35       return {
36           mem: process.memoryUsage()
37         , time: new Date
38       };
39     }
40
41     // proxy res.end()
42     res.end = function(data, encoding){
43       res.end = end;
44       res.end(data, encoding);
45       compare(req, start, snapshot())
46     };
47
48     next();
49   }
50 };
51
52 /**
53  * Compare `start` / `end` snapshots.
54  *
55  * @param {IncomingRequest} req
56  * @param {Object} start
57  * @param {Object} end
58  * @api private
59  */
60
61 function compare(req, start, end) {
62   console.log();
63   row(req.method, req.url);
64   row('response time:', (end.time - start.time) + 'ms');
65   row('memory rss:', formatBytes(end.mem.rss - start.mem.rss));
66   row('memory vsize:', formatBytes(end.mem.vsize - start.mem.vsize));
67   row('heap before:', formatBytes(start.mem.heapUsed) + ' / ' + formatBytes(start.mem.heapTotal));
68   row('heap after:', formatBytes(end.mem.heapUsed) + ' / ' + formatBytes(end.mem.heapTotal));
69   console.log();
70 }
71
72 /**
73  * Row helper
74  *
75  * @param {String} key
76  * @param {String} val
77  * @api private
78  */
79
80 function row(key, val) {
81   console.log('  \033[90m%s\033[0m \033[36m%s\033[0m', key, val);
82 }
83
84 /**
85  * Format byte-size.
86  *
87  * @param {Number} bytes
88  * @return {String}
89  * @api private
90  */
91
92 function formatBytes(bytes) {
93   var kb = 1024
94     , mb = 1024 * kb
95     , gb = 1024 * mb;
96   if (bytes < kb) return bytes + 'b';
97   if (bytes < mb) return (bytes / kb).toFixed(2) + 'kb';
98   if (bytes < gb) return (bytes / mb).toFixed(2) + 'mb';
99   return (bytes / gb).toFixed(2) + 'gb';
100 };