diff --git a/README.md b/README.md index fce07d5..99546db 100644 --- a/README.md +++ b/README.md @@ -90,25 +90,34 @@ app.listen(3000, () => { const Hapi = require('hapi'); const epimetheus = require('epimetheus'); -const server = new Hapi.Server(); +const server = Hapi.Server({ + port: 8002 +}) -server.connection({ - port: 3000 -}); +async function init() { + try { + await epithemeus.instrument(server); -epimetheus.instrument(this.server); + server.route({ + method: 'GET', + path: '/', + handler: async (request, h) => { + return h.response() + } + }) + + await server.start() + + console.log(`Hapi ${server.version} server listening on port 8002`) -server.route({ - method: 'GET', - path: '/', - handler: (req, resp) => { - resp(); + } catch(err) { + console.log('Error', err); + process.exit(1); } -}); -server.start(() => { - console.log('hapi server listening on port 3000'); -}); +} + +init(); ``` # Restify ``` diff --git a/examples/hapi/Dockerfile b/examples/hapi/Dockerfile index abd022a..de84e14 100644 --- a/examples/hapi/Dockerfile +++ b/examples/hapi/Dockerfile @@ -7,4 +7,4 @@ RUN cd /src; npm install --production EXPOSE 8002 -CMD ["node", "/src/hapi.js"] +CMD ["node", "/src/hapi.js"] \ No newline at end of file diff --git a/examples/hapi/hapi.js b/examples/hapi/hapi.js index c548a36..ef4a789 100644 --- a/examples/hapi/hapi.js +++ b/examples/hapi/hapi.js @@ -1,22 +1,31 @@ const Hapi = require('hapi') const epithemeus = require('epimetheus') -const server = new Hapi.Server() - -server.connection({ - port: 8002 +const server = Hapi.Server({ + port: 8002 }) -epithemeus.instrument(server) +async function init() { + try { + await epithemeus.instrument(server); + + server.route({ + method: 'GET', + path: '/', + handler: async (request, h) => { + return h.response() + } + }) + + await server.start() + + console.log(`hapi ${server.version} server listening on port 8002`) -server.route({ - method: 'GET', - path: '/', - handler: (req, resp) => { - resp() + } catch(err) { + console.log('Error', err); + process.exit(1); } -}) -server.start(() => { - console.log('hapi server listening on port 8002') -}) +} + +init(); \ No newline at end of file diff --git a/examples/hapi/package-lock.json b/examples/hapi/package-lock.json new file mode 100644 index 0000000..1cece83 --- /dev/null +++ b/examples/hapi/package-lock.json @@ -0,0 +1,306 @@ +{ + "name": "hapi-example", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accept": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/accept/-/accept-3.0.2.tgz", + "integrity": "sha512-bghLXFkCOsC1Y2TZ51etWfKDs6q249SAoHTZVfzWWdlZxoij+mgkj9AmUJWQpDY48TfnrTDIe43Xem4zdMe7mQ==", + "requires": { + "boom": "7.x.x", + "hoek": "5.x.x" + } + }, + "ammo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.1.tgz", + "integrity": "sha512-4UqoM8xQjwkQ78oiU4NbBK0UgYqeKMAKmwE4ec7Rz3rGU8ZEBFxzgF2sUYKOAlqIXExBDYLN6y1ShF5yQ4hwLQ==", + "requires": { + "hoek": "5.x.x" + } + }, + "b64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/b64/-/b64-4.0.0.tgz", + "integrity": "sha512-EhmUQodKB0sdzPPrbIWbGqA5cQeTWxYrAgNeeT1rLZWtD3tbNTnphz8J4vkXI3cPgBNlXBjzEbzDzq0Nwi4f9A==" + }, + "big-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/big-time/-/big-time-2.0.1.tgz", + "integrity": "sha1-aMffjcMPl+lT8lpnp2rJcTwWyd4=" + }, + "bintrees": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", + "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" + }, + "boom": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-7.2.0.tgz", + "integrity": "sha1-K/8kpVVldn/ehp7ICDF+sQxI6WY=", + "requires": { + "hoek": "5.x.x" + } + }, + "bounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.0.tgz", + "integrity": "sha512-8syCGe8B2/WC53118/F/tFy5aW00j+eaGPXmAUP7iBhxc+EBZZxS1vKelWyBCH6IqojgS2t1gF0glH30qAJKEw==", + "requires": { + "boom": "7.x.x", + "hoek": "5.x.x" + } + }, + "call": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/call/-/call-5.0.1.tgz", + "integrity": "sha512-ollfFPSshiuYLp7AsrmpkQJ/PxCi6AzV81rCjBwWhyF2QGyUY/vPDMzoh4aUcWyucheRglG2LaS5qkIEfLRh6A==", + "requires": { + "boom": "7.x.x", + "hoek": "5.x.x" + } + }, + "catbox": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/catbox/-/catbox-10.0.3.tgz", + "integrity": "sha512-qwus6RnVctHXYwfxvvDwvlMWHwCjQdIpQQbtyHnRF0JpwmxbQJ/UIZi9y8O6DpphKCdfO9gpxgb2ne9ZDx39BQ==", + "requires": { + "boom": "7.x.x", + "hoek": "5.x.x", + "joi": "13.x.x" + } + }, + "catbox-memory": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-3.1.2.tgz", + "integrity": "sha512-lhWtutLVhsq3Mucxk2McxBPPibJ34WcHuWFz3xqub9u9Ve/IQYpZv3ijLhQXfQped9DXozURiaq9O3aZpP91eg==", + "requires": { + "big-time": "2.x.x", + "boom": "7.x.x", + "hoek": "5.x.x" + } + }, + "content": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/content/-/content-4.0.5.tgz", + "integrity": "sha512-wDP6CTWDpwCf791fNxlCCkZGRkrNzSEU/8ju9Hnr3Uc5mF/gFR5W+fcoGm6zUSlVPdSXYn5pCbySADKj7YM4Cg==", + "requires": { + "boom": "7.x.x" + } + }, + "cryptiles": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.2.tgz", + "integrity": "sha512-U2ALcoAHvA1oO2xOreyHvtkQ+IELqDG2WVWRI1GH/XEmmfGIOalnM5MU5Dd2ITyWfr3m6kNqXiy8XuYyd4wKJw==", + "requires": { + "boom": "7.x.x" + } + }, + "epimetheus": { + "version": "1.0.92", + "resolved": "https://registry.npmjs.org/epimetheus/-/epimetheus-1.0.92.tgz", + "integrity": "sha512-rZqoUT63Xu3z5wPpTFPWkrIileJ9deOx/k/0ZPTiMSKBtPmJ9RzNrlo/M2UWvky7h8clrgc/s2uciq2mfruKrA==", + "requires": { + "prom-client": "^10.0.0" + } + }, + "hapi": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/hapi/-/hapi-17.6.0.tgz", + "integrity": "sha512-GSHjE1hJExluAukrT/QuYSk96irmbYBDd3wOgywiHsPoR2QeKgDnIttD+dB6NbADEmSdb9MS5gTUIVq0uHTdkA==", + "requires": { + "accept": "3.x.x", + "ammo": "3.x.x", + "boom": "7.x.x", + "bounce": "1.x.x", + "call": "5.x.x", + "catbox": "10.x.x", + "catbox-memory": "3.x.x", + "heavy": "6.x.x", + "hoek": "5.x.x", + "joi": "13.x.x", + "mimos": "4.x.x", + "podium": "3.x.x", + "shot": "4.x.x", + "statehood": "6.x.x", + "subtext": "6.x.x", + "teamwork": "3.x.x", + "topo": "3.x.x" + } + }, + "heavy": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/heavy/-/heavy-6.1.0.tgz", + "integrity": "sha512-TKS9DC9NOTGulHQI31Lx+bmeWmNOstbJbGMiN3pX6bF+Zc2GKSpbbym4oasNnB6yPGkqJ9TQXXYDGohqNSJRxA==", + "requires": { + "boom": "7.x.x", + "hoek": "5.x.x", + "joi": "13.x.x" + } + }, + "hoek": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", + "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==" + }, + "iron": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/iron/-/iron-5.0.4.tgz", + "integrity": "sha512-7iQ5/xFMIYaNt9g2oiNiWdhrOTdRUMFaWENUd0KghxwPUhrIH8DUY8FEyLNTTzf75jaII+jMexLdY/2HfV61RQ==", + "requires": { + "boom": "7.x.x", + "cryptiles": "4.x.x", + "hoek": "5.x.x" + } + }, + "isemail": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.1.3.tgz", + "integrity": "sha512-5xbsG5wYADIcB+mfLsd+nst1V/D+I7EU7LEZPo2GOIMu4JzfcRs5yQoypP4avA7QtUqgxYLKBYNv4IdzBmbhdw==", + "requires": { + "punycode": "2.x.x" + } + }, + "joi": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", + "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", + "requires": { + "hoek": "5.x.x", + "isemail": "3.x.x", + "topo": "3.x.x" + } + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" + }, + "mimos": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimos/-/mimos-4.0.0.tgz", + "integrity": "sha512-JvlvRLqGIlk+AYypWrbrDmhsM+6JVx/xBM5S3AMwTBz1trPCEoPN/swO2L4Wu653fL7oJdgk8DMQyG/Gq3JkZg==", + "requires": { + "hoek": "5.x.x", + "mime-db": "1.x.x" + } + }, + "nigel": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nigel/-/nigel-3.0.1.tgz", + "integrity": "sha512-kCVtUG9JyD//tsYrZY+/Y+2gUrANVSba8y23QkM5Znx0FOxlnl9Z4OVPBODmstKWTOvigfTO+Va1VPOu3eWSOQ==", + "requires": { + "hoek": "5.x.x", + "vise": "3.x.x" + } + }, + "pez": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pez/-/pez-4.0.2.tgz", + "integrity": "sha512-HuPxmGxHsEFPWhdkwBs2gIrHhFqktIxMtudISTFN95RQ85ZZAOl8Ki6u3nnN/X8OUaGlIGldk/l8p2IR4/i76w==", + "requires": { + "b64": "4.x.x", + "boom": "7.x.x", + "content": "4.x.x", + "hoek": "5.x.x", + "nigel": "3.x.x" + } + }, + "podium": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/podium/-/podium-3.1.2.tgz", + "integrity": "sha512-18VrjJAduIdPv7d9zWsfmKxTj3cQTYC5Pv5gtKxcWujYBpGbV+mhNSPYhlHW5xeWoazYyKfB9FEsPT12r5rY1A==", + "requires": { + "hoek": "5.x.x", + "joi": "13.x.x" + } + }, + "prom-client": { + "version": "10.2.3", + "resolved": "http://registry.npmjs.org/prom-client/-/prom-client-10.2.3.tgz", + "integrity": "sha512-Xboq5+TdUwuQtSSDRZRNnb5NprINlgQN999VqUjZxnLKydUNLeIPx6Eiahg6oJua3XBg2TGnh5Cth1s4I6+r7g==", + "requires": { + "tdigest": "^0.1.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "shot": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/shot/-/shot-4.0.5.tgz", + "integrity": "sha1-x+dFXRHWD2ts08Q+FaO0McF+VWY=", + "requires": { + "hoek": "5.x.x", + "joi": "13.x.x" + } + }, + "statehood": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/statehood/-/statehood-6.0.6.tgz", + "integrity": "sha512-jR45n5ZMAkasw0xoE9j9TuLmJv4Sa3AkXe+6yIFT6a07kXYHgSbuD2OVGECdZGFxTmvNqLwL1iRIgvq6O6rq+A==", + "requires": { + "boom": "7.x.x", + "bounce": "1.x.x", + "cryptiles": "4.x.x", + "hoek": "5.x.x", + "iron": "5.x.x", + "joi": "13.x.x" + } + }, + "subtext": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/subtext/-/subtext-6.0.7.tgz", + "integrity": "sha512-IcJUvRjeR+NB437Iq+LORFNJW4L6Knqkj3oQrBrkdhIaS2VKJvx/9aYEq7vi+PEx5/OuehOL/40SkSZotLi/MA==", + "requires": { + "boom": "7.x.x", + "content": "4.x.x", + "hoek": "5.x.x", + "pez": "4.x.x", + "wreck": "14.x.x" + } + }, + "tdigest": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz", + "integrity": "sha1-Ljyyw56kSeVdHmzZEReszKRYgCE=", + "requires": { + "bintrees": "1.0.1" + } + }, + "teamwork": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/teamwork/-/teamwork-3.0.1.tgz", + "integrity": "sha512-hEkJIpDOfOYe9NYaLFk00zQbzZeKNCY8T2pRH3I13Y1mJwxaSQ6NEsjY5rCp+11ezCiZpWGoGFTbOuhg4qKevQ==" + }, + "topo": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.0.tgz", + "integrity": "sha512-Tlu1fGlR90iCdIPURqPiufqAlCZYzLjHYVVbcFWDMcX7+tK8hdZWAfsMrD/pBul9jqHHwFjNdf1WaxA9vTRRhw==", + "requires": { + "hoek": "5.x.x" + } + }, + "vise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vise/-/vise-3.0.0.tgz", + "integrity": "sha512-kBFZLmiL1Vm3rHXphkhvvAcsjgeQXRrOFCbJb0I50YZZP4HGRNH+xGzK3matIMcpbsfr3I02u9odj4oCD0TWgA==", + "requires": { + "hoek": "5.x.x" + } + }, + "wreck": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-14.1.0.tgz", + "integrity": "sha512-y/iwFhwdGoM8Hk1t1I4LbuLhM3curVD8STd5NcFI0c/4b4cQAMLcnCRxXX9sLQAggDC8dXYSaQNsT64hga6lvA==", + "requires": { + "boom": "7.x.x", + "hoek": "5.x.x" + } + } + } +} diff --git a/examples/hapi/package.json b/examples/hapi/package.json index 89fdc2b..33424e0 100644 --- a/examples/hapi/package.json +++ b/examples/hapi/package.json @@ -10,6 +10,6 @@ "license": "ISC", "dependencies": { "epimetheus": "*", - "hapi": "*" + "hapi": "^17.x.x" } } diff --git a/lib/hapi.js b/lib/hapi.js index bc3f3e5..71f3086 100644 --- a/lib/hapi.js +++ b/lib/hapi.js @@ -1,42 +1,35 @@ const metrics = require('./metrics') -function plugin (options) { - var plugin = { - register: (server, o, done) => { +function plugin (server, options) { + return { + name: 'epimetheus', + version: '1.0.0', + register: (server, o) => { server.route({ method: 'GET', path: options.url, - handler: (req, reply) => { - const response = reply(metrics.summary()) - response.type('text/plain') + handler: async (request, h) => { + return h.response(metrics.summary()).type('text/plain') } }) - server.ext('onRequest', (request, reply) => { + server.ext('onRequest', async (request, h) => { request.epimetheus = { start: process.hrtime() } - return reply.continue() + + return h.continue; }) - server.on('response', (response) => { + server.events.on('response', (response) => { metrics.observe(response.method, response.path, response.response.statusCode, response.epimetheus.start) }) - - return done() } } - - plugin.register.attributes = { - name: 'epimetheus', - version: '1.0.0' - } - - return plugin } function instrument (server, options) { - server.register(plugin(options), () => {}) + return server.register([plugin(server, options)]) } function instrumentable (server) { diff --git a/package.json b/package.json index 71ddc94..49bc861 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,12 @@ }, "devDependencies": { "chai": "^4.0.2", - "coveralls": "^2.13.1", + "coveralls": "^3.0.2", "express": "^4.15.3", "git-pre-hooks": "^1.2.0", - "hapi": "^16.4.3", - "istanbul": "^0.4.5", - "mocha": "^3.4.2", + "hapi": "^17.6.0", + "istanbul": "^1.1.0-alpha.1", + "mocha": "^5.2.0", "request": "^2.81.0", "restify": "^5.0.0", "sinon": "^2.3.6" diff --git a/test/hapi.js b/test/hapi.js index 04031ef..f74169b 100644 --- a/test/hapi.js +++ b/test/hapi.js @@ -7,31 +7,33 @@ const assertExpectations = require('./assert-expectations') function setup (options) { return describe('hapi ' + options.url, () => { - before((done) => { - this.server = new Hapi.Server() - this.server.connection({ - port: 3000 - }) - epithemeus.instrument(this.server, options) + before(async () => { + this.server = Hapi.Server({ port: 3000 }) + + await epithemeus.instrument(this.server, options) + this.server.route({ method: 'GET', path: '/', - handler: (req, resp) => { - resp() + handler: async (request, h) => { + return h.response() } }) + this.server.route({ method: 'GET', path: '/resource/101', - handler: (req, resp) => { - resp() + handler: async (request, h) => { + return h.response() } }) - this.server.start(done) + + return await this.server.start() + }) - after((done) => { - return this.server.stop(done) + after(async () => { + return await this.server.stop() }) assertExpectations(options)