Skip to content

Commit 2ecf1e5

Browse files
authored
feat: Remove usage of deprecated event.stacktrace (#4885)
Removes usage of deprecated `event.stacktrace` and updated the event interface to remove the deprecated property.
1 parent 144bec3 commit 2ecf1e5

File tree

13 files changed

+94
-117
lines changed

13 files changed

+94
-117
lines changed

packages/browser/src/eventbuilder.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ export function eventFromPlainObject(
7474
if (syntheticException) {
7575
const frames = parseStackFrames(syntheticException);
7676
if (frames.length) {
77-
event.stacktrace = { frames };
77+
// event.exception.values[0] has been set above
78+
(event.exception as { values: Exception[] }).values[0].stacktrace = { frames };
7879
}
7980
}
8081

@@ -273,7 +274,9 @@ export function eventFromString(input: string, syntheticException?: Error, attac
273274
if (attachStacktrace && syntheticException) {
274275
const frames = parseStackFrames(syntheticException);
275276
if (frames.length) {
276-
event.stacktrace = { frames };
277+
event.exception = {
278+
values: [{ value: input, stacktrace: { frames } }],
279+
};
277280
}
278281
}
279282

packages/browser/src/integrations/dedupe.ts

-2
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,6 @@ function _getFramesFromEvent(event: Event): StackFrame[] | undefined {
198198
} catch (_oO) {
199199
return undefined;
200200
}
201-
} else if (event.stacktrace) {
202-
return event.stacktrace.frames;
203201
}
204202
return undefined;
205203
}

packages/browser/test/integration/suites/api.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ describe('API', function () {
6565
return runInSandbox(sandbox, function () {
6666
throwNonError();
6767
}).then(function (summary) {
68-
assert.isAtLeast(summary.events[0].stacktrace.frames.length, 1);
69-
assert.isAtMost(summary.events[0].stacktrace.frames.length, 3);
68+
assert.isAtLeast(summary.events[0].exception.values[0].stacktrace.frames.length, 1);
69+
assert.isAtMost(summary.events[0].exception.values[0].stacktrace.frames.length, 3);
7070
});
7171
});
7272

packages/browser/test/integration/suites/breadcrumbs.js

-13
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,6 @@ describe('breadcrumbs', function () {
234234
assert.equal(summary.breadcrumbHints.length, 1);
235235
assert.equal(summary.breadcrumbHints[0].name, 'click');
236236
assert.equal(summary.breadcrumbHints[0].event.target.tagName, 'INPUT');
237-
// There should be no expection, if there is one it means we threw it
238-
assert.isUndefined(summary.events[0].exception);
239237
}
240238
});
241239
});
@@ -265,9 +263,6 @@ describe('breadcrumbs', function () {
265263

266264
assert.equal(summary.breadcrumbs[1].category, 'ui.input');
267265
assert.equal(summary.breadcrumbs[1].message, 'body > form#foo-form > input[name="foo"]');
268-
269-
// There should be no expection, if there is one it means we threw it
270-
assert.isUndefined(summary.events[0].exception);
271266
}
272267
});
273268
});
@@ -288,8 +283,6 @@ describe('breadcrumbs', function () {
288283
// The async loader doesn't wrap event listeners, but we should receive the event without breadcrumbs
289284
assert.lengthOf(summary.events, 1);
290285
} else {
291-
// There should be no expection, if there is one it means we threw it
292-
assert.isUndefined(summary.events[0].exception);
293286
assert.equal(summary.breadcrumbs.length, 0);
294287
}
295288
});
@@ -309,8 +302,6 @@ describe('breadcrumbs', function () {
309302
// The async loader doesn't wrap event listeners, but we should receive the event without breadcrumbs
310303
assert.lengthOf(summary.events, 1);
311304
} else {
312-
// There should be no expection, if there is one it means we threw it
313-
assert.isUndefined(summary.events[0].exception);
314305
assert.equal(summary.breadcrumbs.length, 0);
315306
}
316307
});
@@ -472,7 +463,6 @@ describe('breadcrumbs', function () {
472463
assert.equal(summary.breadcrumbs[0].message, 'body > form#foo-form > input[name="foo"]');
473464
assert.equal(summary.breadcrumbHints[0].global, false);
474465
assert.equal(summary.breadcrumbHints[1].global, false);
475-
assert.isUndefined(summary.events[0].exception);
476466
}
477467
});
478468
});
@@ -507,7 +497,6 @@ describe('breadcrumbs', function () {
507497
assert.equal(summary.breadcrumbs[0].message, 'body > form#foo-form > input[name="foo"]');
508498
assert.equal(summary.breadcrumbHints[0].global, false);
509499
assert.equal(summary.breadcrumbHints[1].global, false);
510-
assert.isUndefined(summary.events[0].exception);
511500
}
512501
});
513502
});
@@ -538,7 +527,6 @@ describe('breadcrumbs', function () {
538527
assert.equal(summary.breadcrumbs[1].message, 'body > form#foo-form > div.contenteditable');
539528
assert.equal(summary.breadcrumbHints[0].global, false);
540529
assert.equal(summary.breadcrumbHints[1].global, false);
541-
assert.isUndefined(summary.events[0].exception);
542530
}
543531
});
544532
});
@@ -706,7 +694,6 @@ describe('breadcrumbs', function () {
706694
assert.equal(summary.breadcrumbs.length, 2);
707695
assert.equal(summary.breadcrumbHints[0].global, true);
708696
assert.equal(summary.breadcrumbHints[1].global, true);
709-
assert.isUndefined(summary.events[0].exception);
710697
}
711698
});
712699
});

packages/core/src/integrations/inboundfilters.ts

-3
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,6 @@ function _getLastValidUrl(frames: StackFrame[] = []): string | null {
170170

171171
function _getEventFilterUrl(event: Event): string | null {
172172
try {
173-
if (event.stacktrace) {
174-
return _getLastValidUrl(event.stacktrace.frames);
175-
}
176173
let frames;
177174
try {
178175
// @ts-ignore we only care about frames if the whole thing here is defined

packages/core/test/lib/integrations/inboundfilters.test.ts

+54-30
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EventProcessor } from '@sentry/types';
1+
import { Event, EventProcessor } from '@sentry/types';
22

33
import { InboundFilters, InboundFiltersOptions } from '../../../src/integrations/inboundfilters';
44

@@ -52,50 +52,68 @@ function createInboundFiltersEventProcessor(
5252

5353
// Fixtures
5454

55-
const MESSAGE_EVENT = {
55+
const MESSAGE_EVENT: Event = {
5656
message: 'captureMessage',
5757
};
5858

59-
const MESSAGE_EVENT_2 = {
59+
const MESSAGE_EVENT_2: Event = {
6060
message: 'captureMessageSomething',
6161
};
6262

63-
const MESSAGE_EVENT_WITH_STACKTRACE = {
63+
const MESSAGE_EVENT_WITH_STACKTRACE: Event = {
6464
message: 'wat',
65-
stacktrace: {
66-
// Frames are always in the reverse order, as this is how Sentry expect them to come.
67-
// Frame that crashed is the last one, the one from awesome-analytics
68-
frames: [
69-
{ filename: 'https://our-side.com/js/bundle.js' },
70-
{ filename: 'https://our-side.com/js/bundle.js' },
71-
{ filename: 'https://awesome-analytics.io/some/file.js' },
65+
exception: {
66+
values: [
67+
{
68+
stacktrace: {
69+
// Frames are always in the reverse order, as this is how Sentry expect them to come.
70+
// Frame that crashed is the last one, the one from awesome-analytics
71+
frames: [
72+
{ filename: 'https://our-side.com/js/bundle.js' },
73+
{ filename: 'https://our-side.com/js/bundle.js' },
74+
{ filename: 'https://awesome-analytics.io/some/file.js' },
75+
],
76+
},
77+
},
7278
],
7379
},
7480
};
7581

76-
const MESSAGE_EVENT_WITH_ANON_LAST_FRAME = {
82+
const MESSAGE_EVENT_WITH_ANON_LAST_FRAME: Event = {
7783
message: 'any',
78-
stacktrace: {
79-
frames: [
80-
{ filename: 'https://our-side.com/js/bundle.js' },
81-
{ filename: 'https://awesome-analytics.io/some/file.js' },
82-
{ filename: '<anonymous>' },
84+
exception: {
85+
values: [
86+
{
87+
stacktrace: {
88+
frames: [
89+
{ filename: 'https://our-side.com/js/bundle.js' },
90+
{ filename: 'https://awesome-analytics.io/some/file.js' },
91+
{ filename: '<anonymous>' },
92+
],
93+
},
94+
},
8395
],
8496
},
8597
};
8698

87-
const MESSAGE_EVENT_WITH_NATIVE_LAST_FRAME = {
99+
const MESSAGE_EVENT_WITH_NATIVE_LAST_FRAME: Event = {
88100
message: 'any',
89-
stacktrace: {
90-
frames: [
91-
{ filename: 'https://our-side.com/js/bundle.js' },
92-
{ filename: 'https://awesome-analytics.io/some/file.js' },
93-
{ filename: '[native code]' },
101+
exception: {
102+
values: [
103+
{
104+
stacktrace: {
105+
frames: [
106+
{ filename: 'https://our-side.com/js/bundle.js' },
107+
{ filename: 'https://awesome-analytics.io/some/file.js' },
108+
{ filename: '[native code]' },
109+
],
110+
},
111+
},
94112
],
95113
},
96114
};
97115

98-
const EXCEPTION_EVENT = {
116+
const EXCEPTION_EVENT: Event = {
99117
exception: {
100118
values: [
101119
{
@@ -106,7 +124,7 @@ const EXCEPTION_EVENT = {
106124
},
107125
};
108126

109-
const EXCEPTION_EVENT_WITH_FRAMES = {
127+
const EXCEPTION_EVENT_WITH_FRAMES: Event = {
110128
exception: {
111129
values: [
112130
{
@@ -124,7 +142,7 @@ const EXCEPTION_EVENT_WITH_FRAMES = {
124142
},
125143
};
126144

127-
const SENTRY_EVENT = {
145+
const SENTRY_EVENT: Event = {
128146
exception: {
129147
values: [
130148
{
@@ -135,7 +153,7 @@ const SENTRY_EVENT = {
135153
},
136154
};
137155

138-
const SCRIPT_ERROR_EVENT = {
156+
const SCRIPT_ERROR_EVENT: Event = {
139157
exception: {
140158
values: [
141159
{
@@ -146,9 +164,15 @@ const SCRIPT_ERROR_EVENT = {
146164
},
147165
};
148166

149-
const MALFORMED_EVENT = {
150-
stacktrace: {
151-
frames: undefined,
167+
const MALFORMED_EVENT: Event = {
168+
exception: {
169+
values: [
170+
{
171+
stacktrace: {
172+
frames: undefined,
173+
},
174+
},
175+
],
152176
},
153177
};
154178

packages/integrations/src/dedupe.ts

-2
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,6 @@ function _getFramesFromEvent(event: Event): StackFrame[] | undefined {
198198
} catch (_oO) {
199199
return undefined;
200200
}
201-
} else if (event.stacktrace) {
202-
return event.stacktrace.frames;
203201
}
204202
return undefined;
205203
}

packages/integrations/src/rewriteframes.ts

-16
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,6 @@ export class RewriteFrames implements Integration {
6161
processedEvent = this._processExceptionsEvent(processedEvent);
6262
}
6363

64-
if (originalEvent.stacktrace) {
65-
processedEvent = this._processStacktraceEvent(processedEvent);
66-
}
67-
6864
return processedEvent;
6965
}
7066

@@ -110,18 +106,6 @@ export class RewriteFrames implements Integration {
110106
}
111107
}
112108

113-
/** JSDoc */
114-
private _processStacktraceEvent(event: Event): Event {
115-
try {
116-
return {
117-
...event,
118-
stacktrace: this._processStacktrace(event.stacktrace),
119-
};
120-
} catch (_oO) {
121-
return event;
122-
}
123-
}
124-
125109
/** JSDoc */
126110
private _processStacktrace(stacktrace?: Stacktrace): Stacktrace {
127111
return {

packages/integrations/test/dedupe.test.ts

+25-15
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,40 @@
1+
import { Event } from '@sentry/types';
2+
13
import { _shouldDropEvent } from '../src/dedupe';
24

35
/** JSDoc */
46
function clone<T>(data: T): T {
57
return JSON.parse(JSON.stringify(data));
68
}
79

8-
const messageEvent = {
10+
const messageEvent: Event = {
911
fingerprint: ['MrSnuffles'],
1012
message: 'PickleRick',
11-
stacktrace: {
12-
frames: [
13-
{
14-
colno: 1,
15-
filename: 'filename.js',
16-
function: 'function',
17-
lineno: 1,
18-
},
13+
exception: {
14+
values: [
1915
{
20-
colno: 2,
21-
filename: 'filename.js',
22-
function: 'function',
23-
lineno: 2,
16+
value: 'PickleRick',
17+
stacktrace: {
18+
frames: [
19+
{
20+
colno: 1,
21+
filename: 'filename.js',
22+
function: 'function',
23+
lineno: 1,
24+
},
25+
{
26+
colno: 2,
27+
filename: 'filename.js',
28+
function: 'function',
29+
lineno: 2,
30+
},
31+
],
32+
},
2433
},
2534
],
2635
},
2736
};
28-
const exceptionEvent = {
37+
const exceptionEvent: Event = {
2938
exception: {
3039
values: [
3140
{
@@ -64,13 +73,14 @@ describe('Dedupe', () => {
6473
const eventA = clone(messageEvent);
6574
const eventB = clone(messageEvent);
6675
eventB.message = 'EvilMorty';
76+
eventB.exception.values[0].value = 'EvilMorty';
6777
expect(_shouldDropEvent(eventA, eventB)).toBe(false);
6878
});
6979

7080
it('should not drop if events have same messages, but different stacktraces', () => {
7181
const eventA = clone(messageEvent);
7282
const eventB = clone(messageEvent);
73-
eventB.stacktrace.frames[0].colno = 1337;
83+
eventB.exception.values[0].stacktrace.frames[0].colno = 1337;
7484
expect(_shouldDropEvent(eventA, eventB)).toBe(false);
7585
});
7686

0 commit comments

Comments
 (0)