From 6ae58175293e63daf5c9af76c293392713f5bd21 Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Tue, 19 Mar 2019 10:20:32 +0500 Subject: [PATCH] Generate req.correlationId --- packages/server/@types/express.d.ts | 1 + packages/server/src/middleware/ErrorApiHandler.ts | 3 ++- packages/server/src/middleware/ErrorPageHandler.ts | 4 +++- packages/server/src/middleware/RequestLogger.ts | 10 ++++++---- packages/server/src/middleware/Transaction.ts | 3 ++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/server/@types/express.d.ts b/packages/server/@types/express.d.ts index 5083330..a91e2f3 100644 --- a/packages/server/@types/express.d.ts +++ b/packages/server/@types/express.d.ts @@ -9,6 +9,7 @@ declare namespace Application { declare namespace Express { export interface Request { + correlationId: string user?: Application.User logInPromise(user: any): Promise } diff --git a/packages/server/src/middleware/ErrorApiHandler.ts b/packages/server/src/middleware/ErrorApiHandler.ts index b2289a3..48ce70f 100644 --- a/packages/server/src/middleware/ErrorApiHandler.ts +++ b/packages/server/src/middleware/ErrorApiHandler.ts @@ -6,7 +6,8 @@ export class ErrorApiHandler implements IMiddleware { constructor(readonly logger: ILogger) {} handle: IErrorHandler = (err, req, res, next) => { - this.logger.error('An API error occurred: %s', err.stack) + this.logger.error('%s An API error occurred: %s', + req.correlationId, err.stack) const statusCode = this.getStatus(err) res.status(statusCode) res.end('An error occurred') diff --git a/packages/server/src/middleware/ErrorPageHandler.ts b/packages/server/src/middleware/ErrorPageHandler.ts index e007b65..4652171 100644 --- a/packages/server/src/middleware/ErrorPageHandler.ts +++ b/packages/server/src/middleware/ErrorPageHandler.ts @@ -6,7 +6,9 @@ export class ErrorPageHandler implements IMiddleware { constructor(readonly logger: ILogger) {} handle: IErrorHandler = (err, req, res, next) => { - this.logger.error('An error occurred: %s', err.stack) + this.logger.error( + '%s An error occurred: %s', + req.correlationId, err.stack) // TODO Show an error page! const statusCode = this.getStatus(err) res.status(statusCode) diff --git a/packages/server/src/middleware/RequestLogger.ts b/packages/server/src/middleware/RequestLogger.ts index 98d3fcd..72623f6 100644 --- a/packages/server/src/middleware/RequestLogger.ts +++ b/packages/server/src/middleware/RequestLogger.ts @@ -1,21 +1,23 @@ import {IHandler} from './IHandler' import {ILogger} from '../logger/ILogger' import {IMiddleware} from './IMiddleware' +import shortid from 'shortid' export class RequestLogger implements IMiddleware { constructor(protected readonly logger: ILogger) {} handle: IHandler = (req, res, next) => { const start = Date.now() + req.correlationId = shortid.generate() res.on('finish', () => { const { method, originalUrl, user } = req const username = user ? user.username : '' const duration = Date.now() - start - this.logger.debug('%s %s [%s] %j', - method, originalUrl, username, req.body) + this.logger.debug('%s %s %s [%s] %j', + req.correlationId, method, originalUrl, username, req.body) const { statusCode } = res - this.logger.info('%s %s [%s] %d %sms', - method, originalUrl, username, statusCode, duration) + this.logger.info('%s %s %s [%s] %d %sms', + req.correlationId, method, originalUrl, username, statusCode, duration) }) next() } diff --git a/packages/server/src/middleware/Transaction.ts b/packages/server/src/middleware/Transaction.ts index 92f7bff..6982e27 100644 --- a/packages/server/src/middleware/Transaction.ts +++ b/packages/server/src/middleware/Transaction.ts @@ -14,7 +14,8 @@ export class Transaction implements IMiddleware { ns.bindEmitter(res) ns.run(() => { - const correlationId = shortid.generate(); + // use pregenerated request correlationId + const correlationId = req.correlationId || shortid.generate(); (req as any).correlationId = correlationId ns.set(CORRELATION_ID, correlationId) next()