Skip to content

Commit 395d5db

Browse files
authored
fix: Scope breadcrumb handling (getsentry#2014)
* fix: Scope breadcrumb handling * fix: Tests * meta: Changelog
1 parent 755d19f commit 395d5db

File tree

6 files changed

+48
-18
lines changed

6 files changed

+48
-18
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
## Unreleased
44

55
- [utils] fix: Remove node types
6+
- [hub] fix: Make sure all breadcrumbs have a timestamp
7+
- [hub] fix: Merge event with scope breadcrumbs instead of only using event breadcrumbs
68

79
## 5.0.7
810

packages/core/test/lib/base.test.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,15 @@ describe('BaseClient', () => {
265265
});
266266

267267
test('adds breadcrumbs', () => {
268-
expect.assertions(1);
268+
expect.assertions(4);
269269
const client = new TestClient({ dsn: PUBLIC_DSN });
270270
const scope = new Scope();
271271
scope.addBreadcrumb({ message: 'breadcrumb' }, 100);
272272
client.captureEvent({ message: 'message' }, undefined, scope);
273-
expect(TestBackend.instance!.event!).toEqual({
274-
breadcrumbs: [{ message: 'breadcrumb' }],
275-
event_id: '42',
276-
message: 'message',
277-
});
273+
expect(TestBackend.instance!.event!).toHaveProperty('event_id', '42');
274+
expect(TestBackend.instance!.event!).toHaveProperty('message', 'message');
275+
expect(TestBackend.instance!.event!).toHaveProperty('breadcrumbs');
276+
expect(TestBackend.instance!.event!.breadcrumbs![0]).toHaveProperty('message', 'breadcrumb');
278277
});
279278

280279
test('limits previously saved breadcrumbs', () => {

packages/hub/src/hub.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,8 @@ export class Hub implements HubInterface {
205205
return;
206206
}
207207

208-
const { beforeBreadcrumb, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = top.client.getOptions();
208+
const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } =
209+
(top.client.getOptions && top.client.getOptions()) || {};
209210

210211
if (maxBreadcrumbs <= 0) {
211212
return;

packages/hub/src/scope.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,13 @@ export class Scope implements ScopeInterface {
201201
* @inheritDoc
202202
*/
203203
public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {
204+
const timestamp = new Date().getTime() / 1000;
205+
const mergedBreadcrumb = { timestamp, ...breadcrumb };
206+
204207
this._breadcrumbs =
205208
maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0
206-
? [...this._breadcrumbs, normalize(breadcrumb)].slice(-maxBreadcrumbs)
207-
: [...this._breadcrumbs, normalize(breadcrumb)];
209+
? [...this._breadcrumbs, normalize(mergedBreadcrumb)].slice(-maxBreadcrumbs)
210+
: [...this._breadcrumbs, normalize(mergedBreadcrumb)];
208211
this._notifyScopeListeners();
209212
return this;
210213
}
@@ -266,10 +269,8 @@ export class Scope implements ScopeInterface {
266269

267270
this._applyFingerprint(event);
268271

269-
const hasNoBreadcrumbs = !event.breadcrumbs || event.breadcrumbs.length === 0;
270-
if (hasNoBreadcrumbs && this._breadcrumbs.length > 0) {
271-
event.breadcrumbs = this._breadcrumbs;
272-
}
272+
event.breadcrumbs = [...(event.breadcrumbs || []), ...this._breadcrumbs];
273+
event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;
273274

274275
return this._notifyEventProcessors([...getGlobalEventProcessors(), ...this._eventProcessors], event, hint);
275276
}

packages/hub/test/hub.test.ts

+25
Original file line numberDiff line numberDiff line change
@@ -225,4 +225,29 @@ describe('Hub', () => {
225225
});
226226
expect(currentHub).toBe(getCurrentHub());
227227
});
228+
229+
describe('breadcrumbs', () => {
230+
test('withScope', () => {
231+
expect.assertions(6);
232+
const hub = new Hub(clientFn);
233+
hub.addBreadcrumb({ message: 'My Breadcrumb' });
234+
hub.withScope(scope => {
235+
scope.addBreadcrumb({ message: 'scope breadcrumb' });
236+
const event: Event = {};
237+
scope
238+
.applyToEvent(event)
239+
.then((appliedEvent: Event | null) => {
240+
expect(appliedEvent).toBeTruthy();
241+
expect(appliedEvent!.breadcrumbs).toHaveLength(2);
242+
expect(appliedEvent!.breadcrumbs![0].message).toEqual('My Breadcrumb');
243+
expect(appliedEvent!.breadcrumbs![0]).toHaveProperty('timestamp');
244+
expect(appliedEvent!.breadcrumbs![1].message).toEqual('scope breadcrumb');
245+
expect(appliedEvent!.breadcrumbs![1]).toHaveProperty('timestamp');
246+
})
247+
.catch(e => {
248+
console.error(e);
249+
});
250+
});
251+
});
252+
});
228253
});

packages/hub/test/scope.test.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ describe('Scope', () => {
6868
test('add', () => {
6969
const scope = new Scope();
7070
scope.addBreadcrumb({ message: 'test' }, 100);
71-
expect((scope as any)._breadcrumbs).toEqual([{ message: 'test' }]);
71+
expect((scope as any)._breadcrumbs[0]).toHaveProperty('message', 'test');
7272
});
7373
});
7474

@@ -128,20 +128,20 @@ describe('Scope', () => {
128128
expect(processedEvent!.user).toEqual({ id: '1' });
129129
expect(processedEvent!.fingerprint).toEqual(['abcd']);
130130
expect(processedEvent!.level).toEqual('warning');
131-
expect(processedEvent!.breadcrumbs).toEqual([{ message: 'test' }]);
131+
expect(processedEvent!.breadcrumbs![0]).toHaveProperty('message', 'test');
132132
});
133133
});
134134

135135
test('applyToEvent merge', () => {
136-
expect.assertions(5);
136+
expect.assertions(7);
137137
const scope = new Scope();
138138
scope.setExtra('a', 2);
139139
scope.setTag('a', 'b');
140140
scope.setUser({ id: '1' });
141141
scope.setFingerprint(['abcd']);
142142
scope.addBreadcrumb({ message: 'test' }, 100);
143143
const event: Event = {
144-
breadcrumbs: [{ message: 'test2' }],
144+
breadcrumbs: [{ message: 'test1' }],
145145
extra: { b: 3 },
146146
fingerprint: ['efgh'],
147147
tags: { b: 'c' },
@@ -152,7 +152,9 @@ describe('Scope', () => {
152152
expect(processedEvent!.tags).toEqual({ a: 'b', b: 'c' });
153153
expect(processedEvent!.user).toEqual({ id: '3' });
154154
expect(processedEvent!.fingerprint).toEqual(['efgh', 'abcd']);
155-
expect(processedEvent!.breadcrumbs).toEqual([{ message: 'test2' }]);
155+
expect(processedEvent!.breadcrumbs).toHaveLength(2);
156+
expect(processedEvent!.breadcrumbs![0]).toHaveProperty('message', 'test1');
157+
expect(processedEvent!.breadcrumbs![1]).toHaveProperty('message', 'test');
156158
});
157159
});
158160

0 commit comments

Comments
 (0)