Skip to content

Commit 9ce5c45

Browse files
committed
Merge remote-tracking branch 'upstream/master' into dsorin/forge-add-transport
* upstream/master: (29 commits) ref: Always use lowercase files (getsentry#3742) feat: Make dedupe integration default for browser (getsentry#3730) ref(ember): Allow initing Ember without config entry (getsentry#3745) fix(serverless): wrapEventFunction does not await for async code (getsentry#3740) Metrics: Tag CLS elements (getsentry#3734) feat: Add Next.js 11 to supported peer dependencies list (getsentry#3711) test: Run integration tests for Next 10/11 and Webpack 4/5 matrix (getsentry#3741) fix: Correctly limit Buffer requests (getsentry#3736) Whoops. Remove pinned node version from package.json ref: Introduce test runner for node session health tests (getsentry#3728) fix: Prevent circular structure serialization in events (getsentry#3727) ref(node): Update Node manual tests and test for sessionCount (getsentry#3726) ref(ember): Update scenarios and remove a few to speed up tests (getsentry#3720) docs: Fix typos (getsentry#3716) fix(ember): Fix ember test flake (getsentry#3719) release: 6.7.2 ci: fix ember flaky test (getsentry#3718) misc: changelog for release 6.7.2 (getsentry#3717) fix(release-health): Prevent sending terminal status session updates (getsentry#3701) ref: Make beforeSend more strict (getsentry#3713) ...
2 parents baa403a + 1566d01 commit 9ce5c45

File tree

85 files changed

+1981
-743
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+1981
-743
lines changed

CHANGELOG.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@
44

55
- "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott
66

7+
## 6.7.2
8+
9+
- [core] fix: Do not track sessions if not enabled (#3686)
10+
- [core] fix: Prevent sending terminal status session updates (#3701)
11+
- [core] ref: Make `beforeSend` more strict (#3713)
12+
- [browser] ref: Log which request type has been limited (#3687)
13+
- [nextjs] feat: Auto enable node http integration on server (#3675)
14+
- [nextjs] fix: Correctly handle functional next config in `withSentryConfig` (#3698)
15+
- [nextjs] fix: Fix conflict with other libraries modifying webpack `entry` property (#3703)
16+
- [nextjs] fix: Update @sentry/webpack-plugin to 1.15.1 in @sentry/nextjs to resolve build timeouts issue (#3708)
17+
- [nextjs] ref: Split up config code and add tests (#3693)
18+
719
## 6.7.1
820

921
- [core] fix: Add event type to item header when envelopes are forced (#3676)
@@ -59,7 +71,7 @@
5971

6072
## 6.4.0
6173

62-
- [core] feat: initalScope in SDK Options (#3544)
74+
- [core] feat: initialScope in SDK Options (#3544)
6375
- [node] feat: Release Health for Node (Session Aggregates) (#3319)
6476
- [node] feat: Autoload Database Integrations in Node environment (#3483)
6577
- [react] feat: Add support for React 17 Error Boundaries (#3532)

lerna.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"lerna": "3.4.0",
3-
"version": "6.7.1",
3+
"version": "6.7.2",
44
"packages": "packages/*",
55
"npmClient": "yarn",
66
"useWorkspaces": true

packages/angular/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry/angular",
3-
"version": "6.7.1",
3+
"version": "6.7.2",
44
"description": "Official Sentry SDK for Angular",
55
"repository": "git://github.com/getsentry/sentry-javascript.git",
66
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/angular",
@@ -21,17 +21,17 @@
2121
"@angular/router": "10.x || 11.x || 12.x"
2222
},
2323
"dependencies": {
24-
"@sentry/browser": "6.7.1",
25-
"@sentry/types": "6.7.1",
26-
"@sentry/utils": "6.7.1",
24+
"@sentry/browser": "6.7.2",
25+
"@sentry/types": "6.7.2",
26+
"@sentry/utils": "6.7.2",
2727
"rxjs": "^6.6.0",
2828
"tslib": "^1.9.3"
2929
},
3030
"devDependencies": {
3131
"@angular/common": "^10.0.3",
3232
"@angular/core": "^10.0.3",
3333
"@angular/router": "^10.0.3",
34-
"@sentry-internal/eslint-config-sdk": "6.7.1",
34+
"@sentry-internal/eslint-config-sdk": "6.7.2",
3535
"npm-run-all": "^4.1.2",
3636
"prettier": "1.19.0",
3737
"rimraf": "^2.6.3",

packages/browser/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentry/browser",
3-
"version": "6.7.1",
3+
"version": "6.7.2",
44
"description": "Official Sentry SDK for browsers",
55
"repository": "git://github.com/getsentry/sentry-javascript.git",
66
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/browser",
@@ -16,13 +16,13 @@
1616
"access": "public"
1717
},
1818
"dependencies": {
19-
"@sentry/core": "6.7.1",
20-
"@sentry/types": "6.7.1",
21-
"@sentry/utils": "6.7.1",
19+
"@sentry/core": "6.7.2",
20+
"@sentry/types": "6.7.2",
21+
"@sentry/utils": "6.7.2",
2222
"tslib": "^1.9.3"
2323
},
2424
"devDependencies": {
25-
"@sentry-internal/eslint-config-sdk": "6.7.1",
25+
"@sentry-internal/eslint-config-sdk": "6.7.2",
2626
"@types/eslint": "^7.2.0",
2727
"@types/md5": "2.1.33",
2828
"btoa": "^1.2.1",
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
import { Event, EventProcessor, Exception, Hub, Integration, StackFrame } from '@sentry/types';
2+
3+
/** Deduplication filter */
4+
export class Dedupe implements Integration {
5+
/**
6+
* @inheritDoc
7+
*/
8+
public static id: string = 'Dedupe';
9+
10+
/**
11+
* @inheritDoc
12+
*/
13+
public name: string = Dedupe.id;
14+
15+
/**
16+
* @inheritDoc
17+
*/
18+
private _previousEvent?: Event;
19+
20+
/**
21+
* @inheritDoc
22+
*/
23+
public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {
24+
addGlobalEventProcessor((currentEvent: Event) => {
25+
const self = getCurrentHub().getIntegration(Dedupe);
26+
if (self) {
27+
// Juuust in case something goes wrong
28+
try {
29+
if (self._shouldDropEvent(currentEvent, self._previousEvent)) {
30+
return null;
31+
}
32+
} catch (_oO) {
33+
return (self._previousEvent = currentEvent);
34+
}
35+
36+
return (self._previousEvent = currentEvent);
37+
}
38+
return currentEvent;
39+
});
40+
}
41+
42+
/** JSDoc */
43+
private _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {
44+
if (!previousEvent) {
45+
return false;
46+
}
47+
48+
if (this._isSameMessageEvent(currentEvent, previousEvent)) {
49+
return true;
50+
}
51+
52+
if (this._isSameExceptionEvent(currentEvent, previousEvent)) {
53+
return true;
54+
}
55+
56+
return false;
57+
}
58+
59+
/** JSDoc */
60+
private _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {
61+
const currentMessage = currentEvent.message;
62+
const previousMessage = previousEvent.message;
63+
64+
// If neither event has a message property, they were both exceptions, so bail out
65+
if (!currentMessage && !previousMessage) {
66+
return false;
67+
}
68+
69+
// If only one event has a stacktrace, but not the other one, they are not the same
70+
if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {
71+
return false;
72+
}
73+
74+
if (currentMessage !== previousMessage) {
75+
return false;
76+
}
77+
78+
if (!this._isSameFingerprint(currentEvent, previousEvent)) {
79+
return false;
80+
}
81+
82+
if (!this._isSameStacktrace(currentEvent, previousEvent)) {
83+
return false;
84+
}
85+
86+
return true;
87+
}
88+
89+
/** JSDoc */
90+
private _getFramesFromEvent(event: Event): StackFrame[] | undefined {
91+
const exception = event.exception;
92+
93+
if (exception) {
94+
try {
95+
// @ts-ignore Object could be undefined
96+
return exception.values[0].stacktrace.frames;
97+
} catch (_oO) {
98+
return undefined;
99+
}
100+
} else if (event.stacktrace) {
101+
return event.stacktrace.frames;
102+
}
103+
return undefined;
104+
}
105+
106+
/** JSDoc */
107+
private _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {
108+
let currentFrames = this._getFramesFromEvent(currentEvent);
109+
let previousFrames = this._getFramesFromEvent(previousEvent);
110+
111+
// If neither event has a stacktrace, they are assumed to be the same
112+
if (!currentFrames && !previousFrames) {
113+
return true;
114+
}
115+
116+
// If only one event has a stacktrace, but not the other one, they are not the same
117+
if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {
118+
return false;
119+
}
120+
121+
currentFrames = currentFrames as StackFrame[];
122+
previousFrames = previousFrames as StackFrame[];
123+
124+
// If number of frames differ, they are not the same
125+
if (previousFrames.length !== currentFrames.length) {
126+
return false;
127+
}
128+
129+
// Otherwise, compare the two
130+
for (let i = 0; i < previousFrames.length; i++) {
131+
const frameA = previousFrames[i];
132+
const frameB = currentFrames[i];
133+
134+
if (
135+
frameA.filename !== frameB.filename ||
136+
frameA.lineno !== frameB.lineno ||
137+
frameA.colno !== frameB.colno ||
138+
frameA.function !== frameB.function
139+
) {
140+
return false;
141+
}
142+
}
143+
144+
return true;
145+
}
146+
147+
/** JSDoc */
148+
private _getExceptionFromEvent(event: Event): Exception | undefined {
149+
return event.exception && event.exception.values && event.exception.values[0];
150+
}
151+
152+
/** JSDoc */
153+
private _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {
154+
const previousException = this._getExceptionFromEvent(previousEvent);
155+
const currentException = this._getExceptionFromEvent(currentEvent);
156+
157+
if (!previousException || !currentException) {
158+
return false;
159+
}
160+
161+
if (previousException.type !== currentException.type || previousException.value !== currentException.value) {
162+
return false;
163+
}
164+
165+
if (!this._isSameFingerprint(currentEvent, previousEvent)) {
166+
return false;
167+
}
168+
169+
if (!this._isSameStacktrace(currentEvent, previousEvent)) {
170+
return false;
171+
}
172+
173+
return true;
174+
}
175+
176+
/** JSDoc */
177+
private _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {
178+
let currentFingerprint = currentEvent.fingerprint;
179+
let previousFingerprint = previousEvent.fingerprint;
180+
181+
// If neither event has a fingerprint, they are assumed to be the same
182+
if (!currentFingerprint && !previousFingerprint) {
183+
return true;
184+
}
185+
186+
// If only one event has a fingerprint, but not the other one, they are not the same
187+
if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {
188+
return false;
189+
}
190+
191+
currentFingerprint = currentFingerprint as string[];
192+
previousFingerprint = previousFingerprint as string[];
193+
194+
// Otherwise, compare the two
195+
try {
196+
return !!(currentFingerprint.join('') === previousFingerprint.join(''));
197+
} catch (_oO) {
198+
return false;
199+
}
200+
}
201+
}

packages/browser/src/integrations/globalhandlers.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,18 @@ export class GlobalHandlers implements Integration {
8585
}
8686

8787
const client = currentHub.getClient();
88-
const event = isPrimitive(error)
89-
? this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
90-
: this._enhanceEventWithInitialFrame(
91-
eventFromUnknownInput(error, undefined, {
92-
attachStacktrace: client && client.getOptions().attachStacktrace,
93-
rejection: false,
94-
}),
95-
data.url,
96-
data.line,
97-
data.column,
98-
);
88+
const event =
89+
error === undefined && isString(data.msg)
90+
? this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
91+
: this._enhanceEventWithInitialFrame(
92+
eventFromUnknownInput(error || data.msg, undefined, {
93+
attachStacktrace: client && client.getOptions().attachStacktrace,
94+
rejection: false,
95+
}),
96+
data.url,
97+
data.line,
98+
data.column,
99+
);
99100

100101
addExceptionMechanism(event, {
101102
handled: false,
@@ -188,12 +189,10 @@ export class GlobalHandlers implements Integration {
188189
let message = isErrorEvent(msg) ? msg.message : msg;
189190
let name;
190191

191-
if (isString(message)) {
192-
const groups = message.match(ERROR_TYPES_RE);
193-
if (groups) {
194-
name = groups[1];
195-
message = groups[2];
196-
}
192+
const groups = message.match(ERROR_TYPES_RE);
193+
if (groups) {
194+
name = groups[1];
195+
message = groups[2];
197196
}
198197

199198
const event = {

packages/browser/src/integrations/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export { TryCatch } from './trycatch';
33
export { Breadcrumbs } from './breadcrumbs';
44
export { LinkedErrors } from './linkederrors';
55
export { UserAgent } from './useragent';
6+
export { Dedupe } from './dedupe';

packages/browser/src/sdk.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { addInstrumentationHandler, getGlobalObject, logger, SyncPromise } from
44
import { BrowserOptions } from './backend';
55
import { BrowserClient } from './client';
66
import { ReportDialogOptions, wrap as internalWrap } from './helpers';
7-
import { Breadcrumbs, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';
7+
import { Breadcrumbs, Dedupe, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';
88

99
export const defaultIntegrations = [
1010
new CoreIntegrations.InboundFilters(),
@@ -13,6 +13,7 @@ export const defaultIntegrations = [
1313
new Breadcrumbs(),
1414
new GlobalHandlers(),
1515
new LinkedErrors(),
16+
new Dedupe(),
1617
new UserAgent(),
1718
];
1819

packages/browser/src/transports/base.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ export abstract class BaseTransport implements Transport {
7676
* https://developer.mozilla.org/en-US/docs/Web/API/Headers/get
7777
*/
7878
const limited = this._handleRateLimit(headers);
79-
if (limited) logger.warn(`Too many requests, backing off until: ${this._disabledUntil(requestType)}`);
79+
if (limited)
80+
logger.warn(`Too many ${requestType} requests, backing off until: ${this._disabledUntil(requestType)}`);
8081

8182
if (status === Status.Success) {
8283
resolve({ status });

0 commit comments

Comments
 (0)