Skip to content

Commit 0b1c050

Browse files
authored
feat: SessionDuration integration (#2150)
1 parent de9b23a commit 0b1c050

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

packages/integrations/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export { Ember } from './ember';
66
export { ExtraErrorData } from './extraerrordata';
77
export { ReportingObserver } from './reportingobserver';
88
export { RewriteFrames } from './rewriteframes';
9+
export { SessionTiming } from './sessiontiming';
910
export { Tracing } from './tracing';
1011
export { Transaction } from './transaction';
1112
export { Vue } from './vue';
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Event, EventProcessor, Hub, Integration } from '@sentry/types';
2+
3+
/** This function adds duration since Sentry was initialized till the time event was sent */
4+
export class SessionTiming implements Integration {
5+
/**
6+
* @inheritDoc
7+
*/
8+
public name: string = SessionTiming.id;
9+
/**
10+
* @inheritDoc
11+
*/
12+
public static id: string = 'SessionTiming';
13+
14+
/** Exact time Client was initialized expressed in milliseconds since Unix Epoch. */
15+
protected readonly _startTime: number = Date.now();
16+
17+
/**
18+
* @inheritDoc
19+
*/
20+
public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {
21+
addGlobalEventProcessor(event => {
22+
const self = getCurrentHub().getIntegration(SessionTiming);
23+
if (self) {
24+
return self.process(event);
25+
}
26+
return event;
27+
});
28+
}
29+
30+
/**
31+
* @inheritDoc
32+
*/
33+
public process(event: Event): Event {
34+
const now = Date.now();
35+
36+
return {
37+
...event,
38+
extra: {
39+
...event.extra,
40+
['session:start']: this._startTime,
41+
['session:duration']: now - this._startTime,
42+
['session:end']: now,
43+
},
44+
};
45+
}
46+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { SessionTiming } from '../src/sessiontiming';
2+
3+
const sessionTiming: SessionTiming = new SessionTiming();
4+
5+
describe('SessionTiming', () => {
6+
it('should work as expected', () => {
7+
const event = sessionTiming.process({
8+
extra: {
9+
some: 'value',
10+
},
11+
});
12+
13+
expect(typeof event.extra!['session:start']).toBe('number');
14+
expect(typeof event.extra!['session:duration']).toBe('number');
15+
expect(typeof event.extra!['session:end']).toBe('number');
16+
expect(event.extra!.some).toEqual('value');
17+
});
18+
});

0 commit comments

Comments
 (0)