From 11415f55f413b05f021c2ef8b6d1261ecd1fb4b2 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Wed, 7 Aug 2024 12:33:09 -0400 Subject: [PATCH] refactor --- packages/replay-internal/src/replay.ts | 12 ++-- packages/replay-internal/src/util/logger.ts | 57 ++++++++++--------- .../test/integration/flush.test.ts | 9 ++- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/packages/replay-internal/src/replay.ts b/packages/replay-internal/src/replay.ts index a70a384b7c68..d563fe10288c 100644 --- a/packages/replay-internal/src/replay.ts +++ b/packages/replay-internal/src/replay.ts @@ -206,13 +206,11 @@ export class ReplayContainer implements ReplayContainerInterface { } // Configure replay logger w/ experimental options - if (this._options._experiments.traceInternals) { - logger.enableTraceInternals(); - } - - if (this._options._experiments.captureExceptions) { - logger.enableCaptureInternalExceptions(); - } + const experiments = options._experiments; + logger.setConfig({ + captureExceptions: !!experiments.captureExceptions, + traceInternals: !!experiments.traceInternals, + }); } /** Get the event context. */ diff --git a/packages/replay-internal/src/util/logger.ts b/packages/replay-internal/src/util/logger.ts index 4c427c0d570f..28d4883d5c78 100644 --- a/packages/replay-internal/src/util/logger.ts +++ b/packages/replay-internal/src/util/logger.ts @@ -6,9 +6,15 @@ import { DEBUG_BUILD } from '../debug-build'; type ReplayConsoleLevels = Extract; const CONSOLE_LEVELS: readonly ReplayConsoleLevels[] = ['info', 'warn', 'error', 'log'] as const; +const PREFIX = '[Replay] '; type LoggerMethod = (...args: unknown[]) => void; -type LoggerConsoleMethods = Record<'info' | 'warn' | 'error' | 'log', LoggerMethod>; +type LoggerConsoleMethods = Record; + +interface LoggerConfig { + captureExceptions: boolean; + traceInternals: boolean; +} /** JSDoc */ interface ReplayLogger extends LoggerConsoleMethods { @@ -21,13 +27,18 @@ interface ReplayLogger extends LoggerConsoleMethods { * Captures exceptions (`Error`) if "capture internal exceptions" is enabled */ exception: LoggerMethod; - enableCaptureInternalExceptions(): void; - disableCaptureInternalExceptions(): void; - enableTraceInternals(): void; - disableTraceInternals(): void; + /** + * Configures the logger with additional debugging behavior + */ + setConfig(config: LoggerConfig): void; } -function _addBreadcrumb(message: string, level: SeverityLevel = 'info'): void { +function _addBreadcrumb(message: unknown, level: SeverityLevel = 'info'): void { + // Only support strings for breadcrumbs + if (typeof message !== 'string') { + return; + } + // Wait a tick here to avoid race conditions for some initial logs // which may be added before replay is initialized addBreadcrumb( @@ -37,7 +48,7 @@ function _addBreadcrumb(message: string, level: SeverityLevel = 'info'): void { logger: 'replay', }, level, - message: `[Replay] ${message}`, + message: `${PREFIX} ${message}`, }, { level }, ); @@ -50,46 +61,36 @@ function makeReplayLogger(): ReplayLogger { const _logger: Partial = { exception: () => undefined, infoTick: () => undefined, - enableCaptureInternalExceptions: () => { - _capture = true; - }, - disableCaptureInternalExceptions: () => { - _capture = false; - }, - enableTraceInternals: () => { - _trace = true; - }, - disableTraceInternals: () => { - _trace = false; + setConfig: (opts: LoggerConfig) => { + _capture = opts.captureExceptions; + _trace = opts.traceInternals; }, }; if (DEBUG_BUILD) { _logger.exception = (error: unknown) => { - coreLogger.error('[Replay] ', error); + coreLogger.error(PREFIX, error); if (_capture) { captureException(error); - } - - // No need for a breadcrumb is `_capture` is enabled since it should be - // captured as an exception - if (_trace && !_capture) { + } else if (_trace) { + // No need for a breadcrumb is `_capture` is enabled since it should be + // captured as an exception _addBreadcrumb(error instanceof Error ? error.message : 'Unknown error'); } }; _logger.infoTick = (...args: unknown[]) => { - coreLogger.info('[Replay] ', ...args); + coreLogger.info(PREFIX, ...args); if (_trace) { - setTimeout(() => typeof args[0] === 'string' && _addBreadcrumb(args[0]), 0); + setTimeout(() => _addBreadcrumb(args[0]), 0); } }; CONSOLE_LEVELS.forEach(name => { _logger[name] = (...args: unknown[]) => { - coreLogger[name]('[Replay] ', ...args); - if (_trace && typeof args[0] === 'string') { + coreLogger[name](PREFIX, ...args); + if (_trace) { _addBreadcrumb(args[0]); } }; diff --git a/packages/replay-internal/test/integration/flush.test.ts b/packages/replay-internal/test/integration/flush.test.ts index 78a945d5fddd..ffc0a83bb141 100644 --- a/packages/replay-internal/test/integration/flush.test.ts +++ b/packages/replay-internal/test/integration/flush.test.ts @@ -336,8 +336,7 @@ describe('Integration | flush', () => { }); it('logs warning if flushing initial segment without checkout', async () => { - // replay.getOptions()._experiments.traceInternals = true; - logger.enableTraceInternals(); + logger.setConfig({ traceInternals: true }); sessionStorage.clear(); clearSession(replay); @@ -410,11 +409,11 @@ describe('Integration | flush', () => { }, ]); - logger.disableTraceInternals(); + logger.setConfig({ traceInternals: false }); }); it('logs warning if adding event that is after maxReplayDuration', async () => { - logger.enableTraceInternals(); + logger.setConfig({ traceInternals: true }); const spyLogger = vi.spyOn(SentryUtils.logger, 'info'); @@ -448,7 +447,7 @@ describe('Integration | flush', () => { } because it is after maxReplayDuration`, ); - logger.disableTraceInternals(); + logger.setConfig({ traceInternals: false }); spyLogger.mockRestore(); });