From e5f5953f3117f00c50e718599a0fffd868a206f9 Mon Sep 17 00:00:00 2001 From: Mikael Vesavuori Date: Mon, 14 Nov 2022 09:20:29 +0100 Subject: [PATCH] feat(): try using process env for cold start check; add tests; cleanup tests --- package-lock.json | 4 +- package.json | 2 +- src/entities/MikroLog.ts | 12 +-- tests/MikroLog.test.ts | 164 +++++++++++++++------------------------ 4 files changed, 73 insertions(+), 109 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1e4c71..2f0e8a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mikrolog", - "version": "2.1.7", + "version": "2.1.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mikrolog", - "version": "2.1.7", + "version": "2.1.8", "license": "MIT", "dependencies": { "aws-metadata-utils": "1" diff --git a/package.json b/package.json index 09fb129..6d2f25a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mikrolog", "description": "The JSON logger you always wanted for Lambda.", - "version": "2.1.7", + "version": "2.1.8", "author": "Mikael Vesavuori", "license": "MIT", "main": "./lib/index.js", diff --git a/src/entities/MikroLog.ts b/src/entities/MikroLog.ts index 70f4ca6..c87a625 100644 --- a/src/entities/MikroLog.ts +++ b/src/entities/MikroLog.ts @@ -41,7 +41,6 @@ export class MikroLog { private static correlationId: string; private static debugSamplingLevel: number; private static isDebugLogSampled: boolean; - private coldStart = true; private constructor() { MikroLog.metadataConfig = {}; @@ -50,6 +49,8 @@ export class MikroLog { MikroLog.correlationId = ''; MikroLog.debugSamplingLevel = this.initDebugSampleLevel(); MikroLog.isDebugLogSampled = true; + + process.env.IS_COLD_START = 'true'; } /** @@ -93,13 +94,12 @@ export class MikroLog { /** * @description Is this a Lambda cold start? + * + * Setting the value in the process environment makes it possible + * to persist the value to subsequent calls, also by other libraries. */ public isColdStart(): boolean { - if (this.coldStart) { - this.coldStart = false; - return true; - } - + if (process.env.IS_COLD_START === 'true') return true; return false; } diff --git a/tests/MikroLog.test.ts b/tests/MikroLog.test.ts index f18bda7..60dc541 100644 --- a/tests/MikroLog.test.ts +++ b/tests/MikroLog.test.ts @@ -4,6 +4,27 @@ import { MikroLog } from '../src/entities/MikroLog'; import { metadataConfig } from '../testdata/config'; +const fullLog = { + version: 1, + owner: 'MyCompany', + hostPlatform: 'aws', + domain: 'CustomerAcquisition', + system: 'ShowroomActivities', + service: 'UserSignUp', + team: 'MyDemoTeam', + tags: [''], + dataSensitivity: 'public', + message: 'Hello World', + error: false, + httpStatusCode: 200, + isColdStart: true, + level: 'INFO', + id: '1256767f-c875-4d82-813d-bc260bd0ba07', + timestamp: '2022-07-25T08:52:21.121Z', + timestampEpoch: '1656438566041', + jurisdiction: 'EU' +}; + /** * POSITIVE TESTS */ @@ -64,26 +85,7 @@ test.serial('It should return (print out) a structured log when given a string m const logger = MikroLog.start({ metadataConfig }); const response: any = logger.log(message); - const expected: any = { - version: 1, - owner: 'MyCompany', - hostPlatform: 'aws', - domain: 'CustomerAcquisition', - system: 'ShowroomActivities', - service: 'UserSignUp', - team: 'MyDemoTeam', - tags: [''], - dataSensitivity: 'public', - message: 'Hello World', - error: false, - httpStatusCode: 200, - isColdStart: true, - level: 'INFO', - id: '1256767f-c875-4d82-813d-bc260bd0ba07', - timestamp: '2022-07-25T08:52:21.121Z', - timestampEpoch: '1656438566041', - jurisdiction: 'EU' - }; + const expected: any = JSON.parse(JSON.stringify(fullLog)); // Ensure exactness of message field t.is(response['message'], message); @@ -114,26 +116,7 @@ test.serial( const logger = MikroLog.start({ metadataConfig }); const response: any = logger.info(message); - const expected: any = { - version: 1, - owner: 'MyCompany', - hostPlatform: 'aws', - domain: 'CustomerAcquisition', - system: 'ShowroomActivities', - service: 'UserSignUp', - team: 'MyDemoTeam', - tags: [''], - dataSensitivity: 'public', - message: 'Hello World', - error: false, - httpStatusCode: 200, - isColdStart: true, - level: 'INFO', - id: '1256767f-c875-4d82-813d-bc260bd0ba07', - timestamp: '2022-07-25T08:52:21.121Z', - timestampEpoch: '1656438566041', - jurisdiction: 'EU' - }; + const expected: any = JSON.parse(JSON.stringify(fullLog)); // Ensure exactness of message field t.is(response['message'], message); @@ -165,26 +148,8 @@ test.serial( const logger = MikroLog.start({ metadataConfig }); const response: any = logger.debug(message); - const expected: any = { - version: 1, - owner: 'MyCompany', - hostPlatform: 'aws', - domain: 'CustomerAcquisition', - system: 'ShowroomActivities', - service: 'UserSignUp', - team: 'MyDemoTeam', - tags: [''], - dataSensitivity: 'public', - message: 'Hello World', - error: false, - httpStatusCode: 200, - isColdStart: true, - level: 'DEBUG', - id: '1256767f-c875-4d82-813d-bc260bd0ba07', - timestamp: '2022-07-25T08:52:21.121Z', - timestampEpoch: '1656438566041', - jurisdiction: 'EU' - }; + const expected: any = JSON.parse(JSON.stringify(fullLog)); + expected['level'] = 'DEBUG'; // Ensure exactness of message field t.is(response['message'], message); @@ -216,26 +181,8 @@ test.serial( const logger = MikroLog.start({ metadataConfig }); const response: any = logger.warn(message); - const expected: any = { - version: 1, - owner: 'MyCompany', - hostPlatform: 'aws', - domain: 'CustomerAcquisition', - system: 'ShowroomActivities', - service: 'UserSignUp', - team: 'MyDemoTeam', - tags: [''], - dataSensitivity: 'public', - message: 'Hello World', - error: false, - httpStatusCode: 200, - isColdStart: true, - level: 'WARN', - id: '1256767f-c875-4d82-813d-bc260bd0ba07', - timestamp: '2022-07-25T08:52:21.121Z', - timestampEpoch: '1656438566041', - jurisdiction: 'EU' - }; + const expected: any = JSON.parse(JSON.stringify(fullLog)); + expected['level'] = 'WARN'; // Ensure exactness of message field t.is(response['message'], message); @@ -267,26 +214,10 @@ test.serial( const logger = MikroLog.start({ metadataConfig }); const response: any = logger.error(message); - const expected: any = { - version: 1, - owner: 'MyCompany', - hostPlatform: 'aws', - domain: 'CustomerAcquisition', - system: 'ShowroomActivities', - service: 'UserSignUp', - team: 'MyDemoTeam', - tags: [''], - dataSensitivity: 'public', - message: 'Hello World', - error: true, - httpStatusCode: 400, - isColdStart: true, - level: 'ERROR', - id: '1256767f-c875-4d82-813d-bc260bd0ba07', - timestamp: '2022-07-25T08:52:21.121Z', - timestampEpoch: '1656438566041', - jurisdiction: 'EU' - }; + const expected: any = JSON.parse(JSON.stringify(fullLog)); + expected['level'] = 'ERROR'; + expected['error'] = true; + expected['httpStatusCode'] = 400; // Ensure exactness of message field t.is(response['message'], message); @@ -658,3 +589,36 @@ test.serial('It should be able to merge enrichment even if input is essentially // @ts-ignore t.deepEqual(response, expected); }); + +test.serial( + 'It should retain the cold start status between multiple calls in the same process', + (t) => { + MikroLog.reset(); + + const logger = MikroLog.start({ metadataConfig }); + const response1: any = logger.log(''); + const response2: any = logger.log(''); + + const expected = response1.isColdStart === true && response2.isColdStart === true; + + // @ts-ignore + t.is(expected, true); + } +); + +test.serial( + 'It should not reuse the cold start status between calls when "IS_COLD_START" is not set', + (t) => { + MikroLog.reset(); + + const logger = MikroLog.start({ metadataConfig }); + const response1: any = logger.log(''); + process.env.IS_COLD_START = 'false'; + const response2: any = logger.log(''); + + const expected = response1.isColdStart === true && response2.isColdStart === false; + + // @ts-ignore + t.is(expected, true); + } +);