From e6bd3b93182be2a3604e77d7cdc11fcccc1215fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Og=C3=B3rek?= Date: Wed, 3 Jul 2019 16:29:17 +0200 Subject: [PATCH] feat: SessionDuration integration --- packages/integrations/src/index.ts | 1 + packages/integrations/src/sessiontiming.ts | 46 +++++++++++++++++++ .../integrations/test/sessiontiming.test.ts | 18 ++++++++ 3 files changed, 65 insertions(+) create mode 100644 packages/integrations/src/sessiontiming.ts create mode 100644 packages/integrations/test/sessiontiming.test.ts diff --git a/packages/integrations/src/index.ts b/packages/integrations/src/index.ts index 27914f2c5302..5640f1fbd6fe 100644 --- a/packages/integrations/src/index.ts +++ b/packages/integrations/src/index.ts @@ -6,6 +6,7 @@ export { Ember } from './ember'; export { ExtraErrorData } from './extraerrordata'; export { ReportingObserver } from './reportingobserver'; export { RewriteFrames } from './rewriteframes'; +export { SessionTiming } from './sessiontiming'; export { Tracing } from './tracing'; export { Transaction } from './transaction'; export { Vue } from './vue'; diff --git a/packages/integrations/src/sessiontiming.ts b/packages/integrations/src/sessiontiming.ts new file mode 100644 index 000000000000..c82f26d7b350 --- /dev/null +++ b/packages/integrations/src/sessiontiming.ts @@ -0,0 +1,46 @@ +import { Event, EventProcessor, Hub, Integration } from '@sentry/types'; + +/** This function adds duration since Sentry was initialized till the time event was sent */ +export class SessionTiming implements Integration { + /** + * @inheritDoc + */ + public name: string = SessionTiming.id; + /** + * @inheritDoc + */ + public static id: string = 'SessionTiming'; + + /** Exact time Client was initialized expressed in milliseconds since Unix Epoch. */ + protected readonly _startTime: number = Date.now(); + + /** + * @inheritDoc + */ + public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void { + addGlobalEventProcessor(event => { + const self = getCurrentHub().getIntegration(SessionTiming); + if (self) { + return self.process(event); + } + return event; + }); + } + + /** + * @inheritDoc + */ + public process(event: Event): Event { + const now = Date.now(); + + return { + ...event, + extra: { + ...event.extra, + ['session:start']: this._startTime, + ['session:duration']: now - this._startTime, + ['session:end']: now, + }, + }; + } +} diff --git a/packages/integrations/test/sessiontiming.test.ts b/packages/integrations/test/sessiontiming.test.ts new file mode 100644 index 000000000000..033c9ea8a441 --- /dev/null +++ b/packages/integrations/test/sessiontiming.test.ts @@ -0,0 +1,18 @@ +import { SessionTiming } from '../src/sessiontiming'; + +const sessionTiming: SessionTiming = new SessionTiming(); + +describe('SessionTiming', () => { + it('should work as expected', () => { + const event = sessionTiming.process({ + extra: { + some: 'value', + }, + }); + + expect(typeof event.extra!['session:start']).toBe('number'); + expect(typeof event.extra!['session:duration']).toBe('number'); + expect(typeof event.extra!['session:end']).toBe('number'); + expect(event.extra!.some).toEqual('value'); + }); +});