From ba0bd0dd055fb2b4562774dd648f9b916bbad240 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Thu, 26 Nov 2020 11:33:36 +0200 Subject: [PATCH 01/11] Enable calculating id based on http request --- README.md | 3 ++- index.d.ts | 2 +- src/rtracer.js | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e1ddba0..cce16b1 100644 --- a/README.md +++ b/README.md @@ -295,8 +295,9 @@ These are the available config options for the middleware/plugin functions. All // Used if useHeader/echoHeader is set to true. headerName: 'X-Request-Id', // A custom function to generate your request ids (default: UUID v1). + // Optionaly, request could be used to calculate the id. // Ignored if useHeader is set to true. - requestIdFactory: () => 'Your request id', + requestIdFactory: (req) => 'Your request id', // Use request id generated by Fastify instead of generating a new id. // Only available for the Fastify plugin. useFastifyRequestId: false, diff --git a/index.d.ts b/index.d.ts index 96f012f..658633e 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,6 +1,6 @@ import { IncomingMessage, ServerResponse } from 'http' -export type RequestIdFactory = () => unknown +export type RequestIdFactory = (req?: IncomingMessage) => unknown export interface IOptions { // Default: false diff --git a/src/rtracer.js b/src/rtracer.js index cf54be1..8f540b0 100644 --- a/src/rtracer.js +++ b/src/rtracer.js @@ -50,7 +50,7 @@ const expressMiddleware = (setResHeaderFn) => { if (useHeader) { requestId = req.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory() + requestId = requestId || requestIdFactory(req) if (echoHeader) { setResHeaderFn(res, headerName, requestId) @@ -96,7 +96,7 @@ const fastifyPlugin = (fastify, options, next) => { if (useFastifyRequestId) { requestId = requestId || request.id } - requestId = requestId || requestIdFactory() + requestId = requestId || requestIdFactory(request) if (echoHeader) { reply.header(headerName, requestId) @@ -137,7 +137,7 @@ const koaMiddleware = ({ if (useHeader) { requestId = ctx.request.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory() + requestId = requestId || requestIdFactory(ctx.request) if (echoHeader) { ctx.set(headerName, requestId) @@ -174,7 +174,7 @@ const koaV1Middleware = ({ if (useHeader) { requestId = this.request.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory() + requestId = requestId || requestIdFactory(this.request) if (echoHeader) { this.response.set(headerName, requestId) @@ -211,7 +211,7 @@ const hapiPlugin = ({ if (useHeader) { requestId = request.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory() + requestId = requestId || requestIdFactory(request) als.enterWith(requestId) wrapHttpEmitters(request.raw.req, request.raw.res) From 6fd93a5da110012ee27f385d052b53032c8f4991 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Thu, 26 Nov 2020 11:36:13 +0200 Subject: [PATCH 02/11] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cce16b1..1665f6a 100644 --- a/README.md +++ b/README.md @@ -295,7 +295,7 @@ These are the available config options for the middleware/plugin functions. All // Used if useHeader/echoHeader is set to true. headerName: 'X-Request-Id', // A custom function to generate your request ids (default: UUID v1). - // Optionaly, request could be used to calculate the id. + // Optionally, request could be used to calculate the id. // Ignored if useHeader is set to true. requestIdFactory: (req) => 'Your request id', // Use request id generated by Fastify instead of generating a new id. From 9dc361bec059f47519f64241a54af516e8df36f3 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Thu, 26 Nov 2020 16:35:21 +0200 Subject: [PATCH 03/11] It's better be more precise --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1665f6a..528159f 100644 --- a/README.md +++ b/README.md @@ -295,7 +295,7 @@ These are the available config options for the middleware/plugin functions. All // Used if useHeader/echoHeader is set to true. headerName: 'X-Request-Id', // A custom function to generate your request ids (default: UUID v1). - // Optionally, request could be used to calculate the id. + // Framework-specific request object is passed as the argument, so it could be optionally used to calculate the id. // Ignored if useHeader is set to true. requestIdFactory: (req) => 'Your request id', // Use request id generated by Fastify instead of generating a new id. From fa25780882d5008788b28dfea8ad91a4cda68e75 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Thu, 26 Nov 2020 16:48:16 +0200 Subject: [PATCH 04/11] It's better to use generics here --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index 658633e..5c23377 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,6 +1,6 @@ import { IncomingMessage, ServerResponse } from 'http' -export type RequestIdFactory = (req?: IncomingMessage) => unknown +export type RequestIdFactory = (req?: IncomingMessage|any) => unknown export interface IOptions { // Default: false From 8557d9c15af67cbeac11a339da52ff7dcc88d9b9 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Wed, 2 Dec 2020 12:38:18 +0200 Subject: [PATCH 05/11] do not pass the request object to uuid generator --- src/rtracer.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/rtracer.js b/src/rtracer.js index 8f540b0..47065d0 100644 --- a/src/rtracer.js +++ b/src/rtracer.js @@ -42,7 +42,7 @@ const expressMiddleware = (setResHeaderFn) => { return ({ useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = uuidv1, + requestIdFactory = null, echoHeader = false } = {}) => { return (req, res, next) => { @@ -50,7 +50,7 @@ const expressMiddleware = (setResHeaderFn) => { if (useHeader) { requestId = req.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory(req) + requestId = requestId || (requestIdFactory ? requestIdFactory(req) : uuidv1()) if (echoHeader) { setResHeaderFn(res, headerName, requestId) @@ -84,7 +84,7 @@ const fastifyPlugin = (fastify, options, next) => { useHeader = false, headerName = 'X-Request-Id', useFastifyRequestId = false, - requestIdFactory = uuidv1, + requestIdFactory = null, echoHeader = false } = options @@ -96,7 +96,7 @@ const fastifyPlugin = (fastify, options, next) => { if (useFastifyRequestId) { requestId = requestId || request.id } - requestId = requestId || requestIdFactory(request) + requestId = requestId || (requestIdFactory ? requestIdFactory(request) : uuidv1()) if (echoHeader) { reply.header(headerName, requestId) @@ -129,7 +129,7 @@ fastifyPlugin[Symbol.for('fastify.display-name')] = pluginName const koaMiddleware = ({ useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = uuidv1, + requestIdFactory = null, echoHeader = false } = {}) => { return (ctx, next) => { @@ -137,7 +137,7 @@ const koaMiddleware = ({ if (useHeader) { requestId = ctx.request.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory(ctx.request) + requestId = requestId || (requestIdFactory ? requestIdFactory(ctx.request) : uuidv1()) if (echoHeader) { ctx.set(headerName, requestId) @@ -166,7 +166,7 @@ const koaMiddleware = ({ const koaV1Middleware = ({ useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = uuidv1, + requestIdFactory = null, echoHeader = false } = {}) => { return function * (next) { @@ -174,7 +174,7 @@ const koaV1Middleware = ({ if (useHeader) { requestId = this.request.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory(this.request) + requestId = requestId || (requestIdFactory ? requestIdFactory(this.request) : uuidv1()) if (echoHeader) { this.response.set(headerName, requestId) @@ -202,7 +202,7 @@ const hapiPlugin = ({ const { useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = uuidv1, + requestIdFactory = null, echoHeader = false } = options @@ -211,7 +211,7 @@ const hapiPlugin = ({ if (useHeader) { requestId = request.headers[headerName.toLowerCase()] } - requestId = requestId || requestIdFactory(request) + requestId = requestId || (requestIdFactory ? requestIdFactory(request) : uuidv1()) als.enterWith(requestId) wrapHttpEmitters(request.raw.req, request.raw.res) From a799fb03fb99bb4a5d3aa95f5499344a2e8bfa46 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Wed, 2 Dec 2020 13:13:49 +0200 Subject: [PATCH 06/11] se raw request for fastify --- src/rtracer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rtracer.js b/src/rtracer.js index 47065d0..087bd88 100644 --- a/src/rtracer.js +++ b/src/rtracer.js @@ -96,7 +96,7 @@ const fastifyPlugin = (fastify, options, next) => { if (useFastifyRequestId) { requestId = requestId || request.id } - requestId = requestId || (requestIdFactory ? requestIdFactory(request) : uuidv1()) + requestId = requestId || (requestIdFactory ? requestIdFactory(request.raw) : uuidv1()) if (echoHeader) { reply.header(headerName, requestId) From 8cc4a1cf99577faf4adaf3abaadcd78948ea8249 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Wed, 2 Dec 2020 13:13:55 +0200 Subject: [PATCH 07/11] unit tests --- tests/express.test.js | 22 ++++++++++++++++++++++ tests/fastify.test.js | 22 ++++++++++++++++++++++ tests/fastifyv2.test.js | 24 ++++++++++++++++++++++++ tests/hapi.test.js | 24 ++++++++++++++++++++++++ tests/koa.test.js | 23 +++++++++++++++++++++++ tests/koav1.test.js | 23 +++++++++++++++++++++++ 6 files changed, 138 insertions(+) diff --git a/tests/express.test.js b/tests/express.test.js index 5927494..87fa523 100644 --- a/tests/express.test.js +++ b/tests/express.test.js @@ -71,6 +71,28 @@ describe('cls-rtracer for Express', () => { }) }) + test('calls request id factory with req', () => { + const app = express() + const idFactory = req => req + + app.use(rTracer.expressMiddleware({ + requestIdFactory: idFactory + })) + + app.get('/test', (req, res) => { + if (req === rTracer.id()) { + res.end() + } else { + res.status(500).end() + } + }) + + return request(app).get('/test') + .then(res => { + expect(res.statusCode).toBe(200) + }) + }) + test('ignores header by default', () => { const app = express() app.use(rTracer.expressMiddleware()) diff --git a/tests/fastify.test.js b/tests/fastify.test.js index 0781779..da33002 100644 --- a/tests/fastify.test.js +++ b/tests/fastify.test.js @@ -71,6 +71,28 @@ describe('cls-rtracer for Fastify', () => { }) }) + test('calls request id factory with req', () => { + const app = Fastify() + const idFactory = req => req + + app.register(rTracer.fastifyPlugin, { + requestIdFactory: idFactory + }) + + app.get('/test', async (request, reply) => { + if (request.raw === rTracer.id()) { + reply.send({}) + } else { + reply.status(500) + } + }) + + return app.ready().then(() => request(app.server).get('/test')) + .then(res => { + expect(res.statusCode).toBe(200) + }) + }) + test('ignores header by default', () => { const app = Fastify() app.register(rTracer.fastifyPlugin) diff --git a/tests/fastifyv2.test.js b/tests/fastifyv2.test.js index b0af021..2936674 100644 --- a/tests/fastifyv2.test.js +++ b/tests/fastifyv2.test.js @@ -86,6 +86,30 @@ for (const type of types) { }) }) + test('calls request id factory with req', () => { + const app = Fastify() + const idFactory = req => req + + register(type, app, { + requestIdFactory: idFactory + }) + + app.get('/test', async (request, reply) => { + // console.log('request', request) + if (request.raw === rTracer.id()) { + reply.send({}) + } + else { + throw new Error('Invalid') + } + }) + + return app.ready().then(() => request(app.server).get('/test')) + .then(res => { + expect(res.statusCode).toBe(200) + }) + }) + test('ignores header by default', () => { const app = Fastify() register(type, app) diff --git a/tests/hapi.test.js b/tests/hapi.test.js index 1632cec..72f96d2 100644 --- a/tests/hapi.test.js +++ b/tests/hapi.test.js @@ -104,6 +104,30 @@ describe('cls-rtracer for Hapi', () => { expect(res.result.id).toEqual(idFactory()) }) + test('calls request id factory with req', async () => { + const idFactory = req => req + + server = await setupServer({ + options: { + requestIdFactory: idFactory + }, + handler: request => { + if (request === rTracer.id()) { + return 'OK' + } else { + throw new Error('Not OK') + } + } + }) + + const res = await server.inject({ + method: 'get', + url: '/' + }) + + expect(res.statusCode).toBe(200) + }) + test('ignores header by default', async () => { const idInHead = 'id-from-header' let id diff --git a/tests/koa.test.js b/tests/koa.test.js index 11473b3..7f55cb1 100644 --- a/tests/koa.test.js +++ b/tests/koa.test.js @@ -71,6 +71,29 @@ describe('cls-rtracer for Koa', () => { }) }) + test('calls request id factory with req', () => { + const app = new Koa() + const idFactory = req => req + + app.use(rTracer.koaMiddleware({ + requestIdFactory: idFactory + })) + + app.use((ctx) => { + if (ctx.request === rTracer.id()) { + ctx.body = 'OK' + } + else { + throw new Error('Not OK') + } + }) + + return request(app.callback()).get('/') + .then(res => { + expect(res.statusCode).toBe(200) + }) + }) + test('ignores header by default', () => { const app = new Koa() app.use(rTracer.koaMiddleware()) diff --git a/tests/koav1.test.js b/tests/koav1.test.js index 794ae04..5ca81d3 100644 --- a/tests/koav1.test.js +++ b/tests/koav1.test.js @@ -70,6 +70,29 @@ describe('cls-rtracer for Koa v1', () => { }) }) + test('calls request id factory with req', () => { + const app = new Koa() + const idFactory = req => req + app.use(rTracer.koaV1Middleware({ + requestIdFactory: idFactory + })) + + app.use(function * () { + if (this.request === rTracer.id()) { + this.body = 'OK' + } + else { + throw new Error('Not OK') + } + }) + + return request(app.callback()).get('/') + .then(res => { + expect(res.statusCode).toBe(200) + expect(res.body.id).toEqual(idFactory()) + }) + }) + test('ignores header by default', () => { const app = new Koa() app.use(rTracer.koaV1Middleware()) From 699b0760eef98073472c90c30a5b4b79ca34e6f3 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Tue, 8 Dec 2020 20:53:49 +0200 Subject: [PATCH 08/11] leftover --- tests/fastifyv2.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fastifyv2.test.js b/tests/fastifyv2.test.js index 2936674..548701b 100644 --- a/tests/fastifyv2.test.js +++ b/tests/fastifyv2.test.js @@ -95,7 +95,6 @@ for (const type of types) { }) app.get('/test', async (request, reply) => { - // console.log('request', request) if (request.raw === rTracer.id()) { reply.send({}) } From 6d268b42b19ef664c4d1fa9b98db8665da4cec8a Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Tue, 8 Dec 2020 20:54:10 +0200 Subject: [PATCH 09/11] suggested change --- src/rtracer.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/rtracer.js b/src/rtracer.js index 087bd88..42da5c7 100644 --- a/src/rtracer.js +++ b/src/rtracer.js @@ -42,7 +42,7 @@ const expressMiddleware = (setResHeaderFn) => { return ({ useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = null, + requestIdFactory, echoHeader = false } = {}) => { return (req, res, next) => { @@ -84,7 +84,7 @@ const fastifyPlugin = (fastify, options, next) => { useHeader = false, headerName = 'X-Request-Id', useFastifyRequestId = false, - requestIdFactory = null, + requestIdFactory, echoHeader = false } = options @@ -129,7 +129,7 @@ fastifyPlugin[Symbol.for('fastify.display-name')] = pluginName const koaMiddleware = ({ useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = null, + requestIdFactory, echoHeader = false } = {}) => { return (ctx, next) => { @@ -166,7 +166,7 @@ const koaMiddleware = ({ const koaV1Middleware = ({ useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = null, + requestIdFactory, echoHeader = false } = {}) => { return function * (next) { @@ -202,7 +202,7 @@ const hapiPlugin = ({ const { useHeader = false, headerName = 'X-Request-Id', - requestIdFactory = null, + requestIdFactory, echoHeader = false } = options From bdabd62496efcdd1d545054ae0ebc86af85c579d Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Tue, 8 Dec 2020 20:55:09 +0200 Subject: [PATCH 10/11] else should start on the previous line --- tests/fastifyv2.test.js | 3 +-- tests/koa.test.js | 3 +-- tests/koav1.test.js | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/fastifyv2.test.js b/tests/fastifyv2.test.js index 548701b..8bd7dba 100644 --- a/tests/fastifyv2.test.js +++ b/tests/fastifyv2.test.js @@ -97,8 +97,7 @@ for (const type of types) { app.get('/test', async (request, reply) => { if (request.raw === rTracer.id()) { reply.send({}) - } - else { + } else { throw new Error('Invalid') } }) diff --git a/tests/koa.test.js b/tests/koa.test.js index 7f55cb1..ecadbf4 100644 --- a/tests/koa.test.js +++ b/tests/koa.test.js @@ -82,8 +82,7 @@ describe('cls-rtracer for Koa', () => { app.use((ctx) => { if (ctx.request === rTracer.id()) { ctx.body = 'OK' - } - else { + } else { throw new Error('Not OK') } }) diff --git a/tests/koav1.test.js b/tests/koav1.test.js index 5ca81d3..42935b6 100644 --- a/tests/koav1.test.js +++ b/tests/koav1.test.js @@ -80,8 +80,7 @@ describe('cls-rtracer for Koa v1', () => { app.use(function * () { if (this.request === rTracer.id()) { this.body = 'OK' - } - else { + } else { throw new Error('Not OK') } }) From 8a4891f0df6543b0050e9afaecab564bb9a6895f Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Tue, 8 Dec 2020 20:56:13 +0200 Subject: [PATCH 11/11] leftover --- tests/koav1.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/koav1.test.js b/tests/koav1.test.js index 42935b6..ed9c766 100644 --- a/tests/koav1.test.js +++ b/tests/koav1.test.js @@ -88,7 +88,6 @@ describe('cls-rtracer for Koa v1', () => { return request(app.callback()).get('/') .then(res => { expect(res.statusCode).toBe(200) - expect(res.body.id).toEqual(idFactory()) }) })