Skip to content

Commit

Permalink
beta version of instrumenting render steps for express, hapi, koa
Browse files Browse the repository at this point in the history
  • Loading branch information
goenning committed Jun 9, 2016
1 parent 13d0fb1 commit 6f60050
Show file tree
Hide file tree
Showing 11 changed files with 190 additions and 53 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ Node.js implementation of Stack Exchange's MiniProfiler
![Dependencies](https://david-dm.org/MiniProfiler/node.svg)
![devDependencies](https://david-dm.org/MiniProfiler/node/dev-status.svg#info=devDependencies)

## Demonstration

Visit [http://miniprofiler-demo.herokuapp.com](http://miniprofiler-demo.herokuapp.com) for a live demonstration.

## Installation (via [npm](https://npmjs.org/package/miniprofiler))

```bash
Expand Down
8 changes: 8 additions & 0 deletions lib/middlewares/express.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ module.exports = {
handleRequest(f, req, res).then((handled) => {
res.locals.miniprofiler = req.miniprofiler;

var render = res.render;
res.render = function() {
var renderArguments = arguments;
req.miniprofiler.step(`Render: ${arguments[0]}`, function() {
render.apply(res, renderArguments);
});
};

if (!handled)
next();
}).catch(next);
Expand Down
12 changes: 12 additions & 0 deletions lib/middlewares/hapi.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,18 @@ module.exports = {
version: require('../../package.json').version
};

//That's a bad monkey patch, didn't like it, needs refactor...
plugin.vision = (server) => {
var view = server._replier._decorations['view'];

server._replier._decorations['view'] = function(template, context, options) {
var viewArguments = arguments;
this.request.raw.req.miniprofiler.step(`Render: ${template}`, () => {
return view.apply(this, viewArguments);
});
};
};

return plugin;
}
};
11 changes: 11 additions & 0 deletions lib/middlewares/koa.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,17 @@ module.exports = {
return function *(next) {
var handled = yield handleRequest(f, this.req, this.res);
this.state.miniprofiler = this.req.miniprofiler;

if (this.render) {
var render = this.render;
this.render = function*() {
var renderArguments = arguments;
this.req.miniprofiler.step(`Render: ${arguments[0]}`, function() {
render.apply(this, renderArguments);
});
};
}

if (!handled)
yield next;
};
Expand Down
2 changes: 0 additions & 2 deletions lib/miniprofiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,11 @@ var storage = function(id, json) {
}

allResults.push({ id: id, json: json });

return;
}

for(var i = 0; i < allResults.length; i++) {
var res = allResults[i];

if(res.id == id) return res.json;
}

Expand Down
104 changes: 53 additions & 51 deletions package.json
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,51 +1,53 @@
{
"name": "miniprofiler",
"version": "0.2.4",
"description": "A simple but effective mini-profiler.",
"main": "lib/miniprofiler.js",
"scripts": {
"lint": "eslint .",
"test": "mocha tests/ -c",
"coverage": "istanbul cover ./node_modules/mocha/bin/_mocha -- tests/ -R spec",
"check-coverage": "istanbul check-coverage --statements 95 --branches 95 --functions 95 --lines 95",
"update-coveralls": "cat coverage/lcov.info | node ./node_modules/coveralls/bin/coveralls.js"
},
"repository": {
"type": "git",
"url": "https://github.com/MiniProfiler/node.git"
},
"bugs": {
"url": "http://github.com/MiniProfiler/node/issues"
},
"author": "Guilherme Oenning <oenning.ti@gmail.com> (http://goenning.net/)",
"contributors": [
"Matt Jibson <matt.jibson@gmail.com> (https://mattjibson.com/)",
"Kevin Montrose"
],
"license": "Apache-2.0",
"readmeFilename": "README.md",
"dependencies": {
"debug": "^2.2.0",
"node-uuid": "^1.4.7",
"underscore": "^1.8.3"
},
"tags": [
"profiler",
"performance",
"profiling",
"timing"
],
"devDependencies": {
"chai": "^3.5.0",
"coveralls": "^2.11.9",
"eslint": "^2.11.1",
"express": "^4.13.4",
"hapi": "^13.4.1",
"istanbul": "^0.4.3",
"koa": "^1.2.0",
"koa-route": "^2.4.2",
"mocha": "^2.5.3",
"pug": "^2.0.0-alpha7",
"request": "^2.72.0"
}
}
{
"name": "miniprofiler",
"version": "0.2.5",
"description": "A simple but effective mini-profiler.",
"main": "lib/miniprofiler.js",
"scripts": {
"lint": "eslint .",
"test": "mocha tests/ -c",
"coverage": "istanbul cover ./node_modules/mocha/bin/_mocha -- tests/ -R spec",
"check-coverage": "istanbul check-coverage --statements 95 --branches 95 --functions 95 --lines 95",
"update-coveralls": "cat coverage/lcov.info | node ./node_modules/coveralls/bin/coveralls.js"
},
"repository": {
"type": "git",
"url": "https://github.com/MiniProfiler/node.git"
},
"bugs": {
"url": "http://github.com/MiniProfiler/node/issues"
},
"author": "Guilherme Oenning <oenning.ti@gmail.com> (http://goenning.net/)",
"contributors": [
"Matt Jibson <matt.jibson@gmail.com> (https://mattjibson.com/)",
"Kevin Montrose"
],
"license": "Apache-2.0",
"readmeFilename": "README.md",
"dependencies": {
"debug": "^2.2.0",
"node-uuid": "^1.4.7",
"underscore": "^1.8.3"
},
"tags": [
"profiler",
"performance",
"profiling",
"timing"
],
"devDependencies": {
"chai": "^3.5.0",
"coveralls": "^2.11.9",
"eslint": "^2.11.1",
"express": "^4.13.4",
"hapi": "^13.4.1",
"istanbul": "^0.4.3",
"koa": "^1.2.0",
"koa-route": "^2.4.2",
"koa-views": "^4.1.0",
"mocha": "^2.5.3",
"pug": "^2.0.0-beta2",
"request": "^2.72.0",
"vision": "^4.1.0"
}
}
31 changes: 31 additions & 0 deletions tests/render-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
'use strict';

var expect = require('chai').expect;

module.exports = function(server) {

describe('Render Tests', function() {
before(server.setUp.bind(null, 'render'));
after(server.tearDown);

it('Should add Render step', function(done) {
server.get('/', (err, response) => {
var ids = JSON.parse(response.headers['x-miniprofiler-ids']);
expect(ids).to.have.lengthOf(1);

server.post('/mini-profiler-resources/results', { id: ids[0], popup: 1 }, (err, response, body) => {
var result = JSON.parse(body);
expect(result.Id).to.equal(ids[0]);
expect(result.Name).to.equal('/');
expect(result.Root.Children).to.have.lengthOf(1);

expect(result.Root.Children[0].Name).to.equal('Render: index');
expect(result.Root.Children[0].Children).to.be.empty;

done();
});
});
});
});

};
16 changes: 16 additions & 0 deletions tests/servers/express/render.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
'use strict';

var miniprofiler = require('../../../lib/miniprofiler.js');
var express = require('express');

var app = express();

app.use(miniprofiler.express());
app.set('view engine', 'pug');
app.set('views', './tests/servers/views');

app.get('/', (req, res) => {
res.render('index', { title: 'Hey', message: 'Hello there!' });
});

module.exports = app;
33 changes: 33 additions & 0 deletions tests/servers/hapi/render.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict';

var miniprofiler = require('../../../lib/miniprofiler.js');
const Hapi = require('hapi');
const vision = require('vision');

const server = new Hapi.Server();
server.connection({ port: 8083 });

server.register(miniprofiler.hapi(), (err) => {
if (err) throw (err);
});

server.register(vision, (err) => {
if (err) throw (err);

server.views({
engines: { pug: require('pug') },
path: './tests/servers/views'
});

miniprofiler.hapi().vision(server);
});

server.route({
method: 'GET',
path:'/',
handler: function(request, reply) {
reply.view('index', { title: 'Hey', message: 'Hello there!' });
}
});

module.exports = server;
17 changes: 17 additions & 0 deletions tests/servers/koa/render.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
'use strict';

var miniprofiler = require('../../../lib/miniprofiler.js');
var koa = require('koa');
var route = require('koa-route');
var views = require('koa-views');
var app = koa();

app.use(views('./tests/servers/views', { extension: 'pug' }));

app.use(miniprofiler.koa());

app.use(route.get('/', function *(){
yield this.render('index', { title: 'Hey', message: 'Hello there!' });
}));

module.exports = app;
5 changes: 5 additions & 0 deletions tests/servers/views/index.pug
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
html
head
title= title
body
h1= message

0 comments on commit 6f60050

Please sign in to comment.