From 5a350af20f1e120d46c6aae7ec10c8b1795586d4 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 31 Oct 2023 18:24:00 +0100 Subject: [PATCH 1/3] chore(parameters): add export types --- packages/tracer/tests/helpers/tracesUtils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/tracer/tests/helpers/tracesUtils.ts b/packages/tracer/tests/helpers/tracesUtils.ts index b12b234175..8557e60b9b 100644 --- a/packages/tracer/tests/helpers/tracesUtils.ts +++ b/packages/tracer/tests/helpers/tracesUtils.ts @@ -314,8 +314,8 @@ export { getInvocationSubsegment, splitSegmentsByName, invokeAllTestCases, - ParsedDocument, - ParsedSegment, - ParsedTrace, - AssertAnnotationParams, + type ParsedDocument, + type ParsedSegment, + type ParsedTrace, + type AssertAnnotationParams, }; From aaa9bf21b911d4b4dc4046f535158f01ae810c08 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 31 Oct 2023 18:59:43 +0100 Subject: [PATCH 2/3] chore(logger): set default utc timezone --- packages/logger/src/Logger.ts | 3 +-- .../src/config/EnvironmentVariablesService.ts | 12 +++++++++ packages/logger/src/formatter/LogFormatter.ts | 16 +++++++++++- packages/logger/src/types/Log.ts | 8 ++++++ .../unit/EnvironmentVariablesService.test.ts | 25 +++++++++++++++++++ packages/logger/tests/unit/Logger.test.ts | 10 ++++---- 6 files changed, 66 insertions(+), 8 deletions(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index f0d0e8b59d..b32bd2374e 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -965,8 +965,8 @@ class Logger extends Utility implements LoggerInterface { environment, } = options; + // order is important, EnvVarsService() is used by other methods this.setEnvVarsService(); - // order is important, it uses EnvVarsService() this.setConsole(); this.setCustomConfigService(customConfigService); this.setInitialLogLevel(logLevel); @@ -975,7 +975,6 @@ class Logger extends Utility implements LoggerInterface { this.setInitialSampleRate(sampleRateValue); this.setLogEvent(); this.setLogIndentation(); - this.addPersistentLogAttributes(persistentLogAttributes); return this; diff --git a/packages/logger/src/config/EnvironmentVariablesService.ts b/packages/logger/src/config/EnvironmentVariablesService.ts index 9627b2c018..a91ea1316f 100644 --- a/packages/logger/src/config/EnvironmentVariablesService.ts +++ b/packages/logger/src/config/EnvironmentVariablesService.ts @@ -29,6 +29,7 @@ class EnvironmentVariablesService private logLevelVariable = 'LOG_LEVEL'; private memoryLimitInMBVariable = 'AWS_LAMBDA_FUNCTION_MEMORY_SIZE'; private sampleRateValueVariable = 'POWERTOOLS_LOGGER_SAMPLE_RATE'; + private tzVariable = 'TZ'; /** * It returns the value of the AWS_REGION environment variable. @@ -108,6 +109,17 @@ class EnvironmentVariablesService return value && value.length > 0 ? Number(value) : undefined; } + /** + * It returns the value of the `TZ` environment variable or `UTC` if it is not set. + * + * @returns {string} + */ + public getTimezone(): string { + const value = this.get(this.tzVariable); + + return value.length > 0 ? value : 'UTC'; + } + /** * It returns true if the POWERTOOLS_DEV environment variable is set to truthy value. * diff --git a/packages/logger/src/formatter/LogFormatter.ts b/packages/logger/src/formatter/LogFormatter.ts index 478e04152f..56b7e6a837 100644 --- a/packages/logger/src/formatter/LogFormatter.ts +++ b/packages/logger/src/formatter/LogFormatter.ts @@ -1,4 +1,8 @@ -import type { LogAttributes, LogFormatterInterface } from '../types/Log.js'; +import type { + LogAttributes, + LogFormatterInterface, + LogFormatterOptions, +} from '../types/Log.js'; import type { UnformattedAttributes } from '../types/Logger.js'; import { LogItem } from './LogItem.js'; @@ -10,6 +14,16 @@ import { LogItem } from './LogItem.js'; * @implements {LogFormatterInterface} */ abstract class LogFormatter implements LogFormatterInterface { + /** + * Timezone used for formatting timestamps. + * @default 'UTC' + */ + protected timezone: string; + + public constructor(options?: LogFormatterOptions) { + this.timezone = options?.timezone ?? 'UTC'; + } + /** * It formats key-value pairs of log attributes. * diff --git a/packages/logger/src/types/Log.ts b/packages/logger/src/types/Log.ts index dd15a69f72..b253ff4e68 100644 --- a/packages/logger/src/types/Log.ts +++ b/packages/logger/src/types/Log.ts @@ -125,6 +125,13 @@ interface LogItemInterface { setAttributes(attributes: LogAttributes): void; } +type LogFormatterOptions = { + /** + * Timezone to use when formatting timestamps. + */ + timezone?: string; +}; + /** * @interface */ @@ -175,5 +182,6 @@ export type { LogLevel, PowertoolsLog, LogItemInterface, + LogFormatterOptions, LogFormatterInterface, }; diff --git a/packages/logger/tests/unit/EnvironmentVariablesService.test.ts b/packages/logger/tests/unit/EnvironmentVariablesService.test.ts index 8ac6924f00..cb5850b3d7 100644 --- a/packages/logger/tests/unit/EnvironmentVariablesService.test.ts +++ b/packages/logger/tests/unit/EnvironmentVariablesService.test.ts @@ -153,6 +153,31 @@ describe('Class: EnvironmentVariablesService', () => { }); }); + describe('Method: getTimezone', () => { + it('returns the value of the TZ environment variable when set', () => { + // Prepare + process.env.TZ = 'Europe/London'; + const service = new EnvironmentVariablesService(); + + // Act + const value = service.getTimezone(); + + // Assess + expect(value).toEqual('Europe/London'); + }); + + it('returns the default UTC value when no TZ is set', () => { + // Prepare + const service = new EnvironmentVariablesService(); + + // Act + const value = service.getTimezone(); + + // Assess + expect(value).toEqual('UTC'); + }); + }); + describe('Method: isDevMode', () => { test('it returns true if the environment variable POWERTOOLS_DEV is "true"', () => { // Prepare diff --git a/packages/logger/tests/unit/Logger.test.ts b/packages/logger/tests/unit/Logger.test.ts index fe91a5ade1..8cc185aeb7 100644 --- a/packages/logger/tests/unit/Logger.test.ts +++ b/packages/logger/tests/unit/Logger.test.ts @@ -222,7 +222,7 @@ describe('Class: Logger', () => { envVarsService: expect.any(EnvironmentVariablesService), customConfigService: undefined, logLevel: 8, - logFormatter: {}, + logFormatter: expect.any(PowertoolsLogFormatter), }) ); }); @@ -344,7 +344,7 @@ describe('Class: Logger', () => { envVarsService: expect.any(EnvironmentVariablesService), customConfigService: undefined, logLevel: 8, - logFormatter: {}, + logFormatter: expect.any(PowertoolsLogFormatter), }) ); }); @@ -398,7 +398,7 @@ describe('Class: Logger', () => { envVarsService: expect.any(EnvironmentVariablesService), customConfigService: configService, logLevel: 12, - logFormatter: {}, + logFormatter: expect.any(PowertoolsLogFormatter), }) ); }); @@ -440,7 +440,7 @@ describe('Class: Logger', () => { envVarsService: expect.any(EnvironmentVariablesService), customConfigService: undefined, logLevel: 8, - logFormatter: {}, + logFormatter: expect.any(PowertoolsLogFormatter), }) ); }); @@ -468,7 +468,7 @@ describe('Class: Logger', () => { envVarsService: expect.any(EnvironmentVariablesService), customConfigService: undefined, logLevel: 8, - logFormatter: {}, + logFormatter: expect.any(PowertoolsLogFormatter), }) ); }); From e535aa7f40d165651c8c66bed3fac6dcd1eaf702 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 31 Oct 2023 19:31:32 +0100 Subject: [PATCH 3/3] chore(logger): pass down envvarsservice to log formatter --- packages/logger/src/Logger.ts | 4 +++- packages/logger/src/formatter/LogFormatter.ts | 9 +++++---- packages/logger/src/types/Log.ts | 6 ++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index b32bd2374e..878541b965 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -930,7 +930,9 @@ class Logger extends Utility implements LoggerInterface { * @returns {void} */ private setLogFormatter(logFormatter?: LogFormatterInterface): void { - this.logFormatter = logFormatter ?? new PowertoolsLogFormatter(); + this.logFormatter = + logFormatter ?? + new PowertoolsLogFormatter({ envVarsService: this.getEnvVarsService() }); } /** diff --git a/packages/logger/src/formatter/LogFormatter.ts b/packages/logger/src/formatter/LogFormatter.ts index 56b7e6a837..3f723d67a4 100644 --- a/packages/logger/src/formatter/LogFormatter.ts +++ b/packages/logger/src/formatter/LogFormatter.ts @@ -1,3 +1,4 @@ +import type { EnvironmentVariablesService } from '../config/EnvironmentVariablesService.js'; import type { LogAttributes, LogFormatterInterface, @@ -15,13 +16,13 @@ import { LogItem } from './LogItem.js'; */ abstract class LogFormatter implements LogFormatterInterface { /** - * Timezone used for formatting timestamps. - * @default 'UTC' + * EnvironmentVariablesService instance. + * If set, it allows to access environment variables. */ - protected timezone: string; + protected envVarsService?: EnvironmentVariablesService; public constructor(options?: LogFormatterOptions) { - this.timezone = options?.timezone ?? 'UTC'; + this.envVarsService = options?.envVarsService; } /** diff --git a/packages/logger/src/types/Log.ts b/packages/logger/src/types/Log.ts index b253ff4e68..e415ee2544 100644 --- a/packages/logger/src/types/Log.ts +++ b/packages/logger/src/types/Log.ts @@ -1,3 +1,4 @@ +import type { EnvironmentVariablesService } from '../config/EnvironmentVariablesService.js'; import type { LogItem } from '../formatter/LogItem.js'; import type { UnformattedAttributes } from './Logger.js'; @@ -127,9 +128,10 @@ interface LogItemInterface { type LogFormatterOptions = { /** - * Timezone to use when formatting timestamps. + * EnvironmentVariablesService instance. + * If set, it gives the LogFormatter access to environment variables. */ - timezone?: string; + envVarsService?: EnvironmentVariablesService; }; /**