Skip to content

Commit c4fc9ae

Browse files
authored
fix: Prevent scope from storing more than 100 breadcrumbs at the time (getsentry#3677)
1 parent 96c36e8 commit c4fc9ae

File tree

3 files changed

+37
-17
lines changed

3 files changed

+37
-17
lines changed

packages/hub/src/hub.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@ export const API_VERSION = 4;
4242
*/
4343
const DEFAULT_BREADCRUMBS = 100;
4444

45-
/**
46-
* Absolute maximum number of breadcrumbs added to an event. The
47-
* `maxBreadcrumbs` option cannot be higher than this value.
48-
*/
49-
const MAX_BREADCRUMBS = 100;
50-
5145
/**
5246
* A layer in the process stack.
5347
* @hidden
@@ -289,7 +283,7 @@ export class Hub implements HubInterface {
289283

290284
if (finalBreadcrumb === null) return;
291285

292-
scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));
286+
scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);
293287
}
294288

295289
/**

packages/hub/src/scope.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ import { dateTimestampInSeconds, getGlobalObject, isPlainObject, isThenable, Syn
2222

2323
import { Session } from './session';
2424

25+
/**
26+
* Absolute maximum number of breadcrumbs added to an event.
27+
* The `maxBreadcrumbs` option cannot be higher than this value.
28+
*/
29+
const MAX_BREADCRUMBS = 100;
30+
2531
/**
2632
* Holds additional event information. {@link Scope.applyToEvent} will be
2733
* called by the client before an event will be sent.
@@ -366,16 +372,20 @@ export class Scope implements ScopeInterface {
366372
* @inheritDoc
367373
*/
368374
public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {
375+
const maxCrumbs = typeof maxBreadcrumbs === 'number' ? Math.min(maxBreadcrumbs, MAX_BREADCRUMBS) : MAX_BREADCRUMBS;
376+
377+
// No data has been changed, so don't notify scope listeners
378+
if (maxCrumbs <= 0) {
379+
return this;
380+
}
381+
369382
const mergedBreadcrumb = {
370383
timestamp: dateTimestampInSeconds(),
371384
...breadcrumb,
372385
};
373-
374-
this._breadcrumbs =
375-
maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0
376-
? [...this._breadcrumbs, mergedBreadcrumb].slice(-maxBreadcrumbs)
377-
: [...this._breadcrumbs, mergedBreadcrumb];
386+
this._breadcrumbs = [...this._breadcrumbs, mergedBreadcrumb].slice(-maxCrumbs);
378387
this._notifyScopeListeners();
388+
379389
return this;
380390
}
381391

packages/hub/test/scope.test.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,26 @@ describe('Scope', () => {
6363

6464
test('addBreadcrumb', () => {
6565
const scope = new Scope();
66-
scope.addBreadcrumb({ message: 'test' }, 100);
66+
scope.addBreadcrumb({ message: 'test' });
6767
expect((scope as any)._breadcrumbs[0]).toHaveProperty('message', 'test');
6868
});
6969

70+
test('addBreadcrumb can be limited to hold up to N breadcrumbs', () => {
71+
const scope = new Scope();
72+
for (let i = 0; i < 10; i++) {
73+
scope.addBreadcrumb({ message: 'test' }, 5);
74+
}
75+
expect((scope as any)._breadcrumbs).toHaveLength(5);
76+
});
77+
78+
test('addBreadcrumb cannot go over MAX_BREADCRUMBS value', () => {
79+
const scope = new Scope();
80+
for (let i = 0; i < 111; i++) {
81+
scope.addBreadcrumb({ message: 'test' }, 111);
82+
}
83+
expect((scope as any)._breadcrumbs).toHaveLength(100);
84+
});
85+
7086
test('setLevel', () => {
7187
const scope = new Scope();
7288
scope.setLevel(Severity.Critical);
@@ -181,7 +197,7 @@ describe('Scope', () => {
181197
scope.setFingerprint(['abcd']);
182198
scope.setLevel(Severity.Warning);
183199
scope.setTransactionName('/abc');
184-
scope.addBreadcrumb({ message: 'test' }, 100);
200+
scope.addBreadcrumb({ message: 'test' });
185201
scope.setContext('os', { id: '1' });
186202
const event: Event = {};
187203
return scope.applyToEvent(event).then(processedEvent => {
@@ -203,7 +219,7 @@ describe('Scope', () => {
203219
scope.setTag('a', 'b');
204220
scope.setUser({ id: '1' });
205221
scope.setFingerprint(['abcd']);
206-
scope.addBreadcrumb({ message: 'test' }, 100);
222+
scope.addBreadcrumb({ message: 'test' });
207223
scope.setContext('server', { id: '2' });
208224
const event: Event = {
209225
breadcrumbs: [{ message: 'test1' }],
@@ -358,7 +374,7 @@ describe('Scope', () => {
358374
scope.setTag('a', 'b');
359375
scope.setUser({ id: '1' });
360376
scope.setFingerprint(['abcd']);
361-
scope.addBreadcrumb({ message: 'test' }, 100);
377+
scope.addBreadcrumb({ message: 'test' });
362378
scope.setRequestSession({ status: RequestSessionStatus.Ok });
363379
expect((scope as any)._extra).toEqual({ a: 2 });
364380
scope.clear();
@@ -368,7 +384,7 @@ describe('Scope', () => {
368384

369385
test('clearBreadcrumbs', () => {
370386
const scope = new Scope();
371-
scope.addBreadcrumb({ message: 'test' }, 100);
387+
scope.addBreadcrumb({ message: 'test' });
372388
expect((scope as any)._breadcrumbs).toHaveLength(1);
373389
scope.clearBreadcrumbs();
374390
expect((scope as any)._breadcrumbs).toHaveLength(0);

0 commit comments

Comments
 (0)