Skip to content

Commit 9d5d937

Browse files
committed
feat: Add synthetic to mechanism
1 parent 927311e commit 9d5d937

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

packages/browser/src/backend.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export class BrowserBackend extends BaseBackend<BrowserOptions> {
6464
const errorEvent = exception as ErrorEvent;
6565
exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment
6666
event = eventFromStacktrace(computeStackTrace(exception as Error));
67-
return SyncPromise.resolve(this.buildEvent(event));
67+
return SyncPromise.resolve(this.buildEvent(event, hint));
6868
} else if (isDOMError(exception as DOMError) || isDOMException(exception as DOMException)) {
6969
// If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)
7070
// then we just extract the name and message, as they don't provide anything else
@@ -76,20 +76,20 @@ export class BrowserBackend extends BaseBackend<BrowserOptions> {
7676

7777
return this.eventFromMessage(message, Severity.Error, hint).then(messageEvent => {
7878
addExceptionTypeValue(messageEvent, message);
79-
return SyncPromise.resolve(this.buildEvent(messageEvent));
79+
return SyncPromise.resolve(this.buildEvent(messageEvent, hint));
8080
});
8181
} else if (isError(exception as Error)) {
8282
// we have a real Error object, do nothing
8383
event = eventFromStacktrace(computeStackTrace(exception as Error));
84-
return SyncPromise.resolve(this.buildEvent(event));
84+
return SyncPromise.resolve(this.buildEvent(event, hint));
8585
} else if (isPlainObject(exception as {}) && hint && hint.syntheticException) {
8686
// If it is plain Object, serialize it manually and extract options
8787
// This will allow us to group events based on top-level keys
8888
// which is much better than creating new group when any key/value change
8989
const objectException = exception as {};
9090
event = eventFromPlainObject(objectException, hint.syntheticException);
9191
addExceptionTypeValue(event, 'Custom Object');
92-
return SyncPromise.resolve(this.buildEvent(event));
92+
return SyncPromise.resolve(this.buildEvent(event, hint, true));
9393
}
9494

9595
// If none of previous checks were valid, then it means that
@@ -101,21 +101,22 @@ export class BrowserBackend extends BaseBackend<BrowserOptions> {
101101
const stringException = exception as string;
102102
return this.eventFromMessage(stringException, undefined, hint).then(messageEvent => {
103103
addExceptionTypeValue(messageEvent, `${stringException}`);
104-
return SyncPromise.resolve(this.buildEvent(messageEvent));
104+
return SyncPromise.resolve(this.buildEvent(messageEvent, hint, true));
105105
});
106106
}
107107

108108
/**
109109
* This is an internal helper function that creates an event.
110110
*/
111-
private buildEvent(event: Event, hint?: EventHint): Event {
111+
private buildEvent(event: Event, hint?: EventHint, isSynthetic?: boolean): Event {
112112
return {
113113
...event,
114114
event_id: hint && hint.event_id,
115115
exception: {
116116
...event.exception,
117117
mechanism: {
118118
handled: true,
119+
synthetic: isSynthetic,
119120
type: 'generic',
120121
},
121122
},

packages/node/src/backend.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BaseBackend, Dsn, getCurrentHub } from '@sentry/core';
2-
import { Event, EventHint, Options, Severity, Transport } from '@sentry/types';
2+
import { Event, EventHint, Options, Mechanism, Severity, Transport } from '@sentry/types';
33
import { isError, isPlainObject } from '@sentry/utils/is';
44
import { normalizeToSize } from '@sentry/utils/object';
55
import { keysToEventMessage } from '@sentry/utils/string';
@@ -76,7 +76,10 @@ export class NodeBackend extends BaseBackend<NodeOptions> {
7676
*/
7777
public eventFromException(exception: any, hint?: EventHint): SyncPromise<Event> {
7878
let ex: any = exception;
79-
79+
const mechanism: Mechanism = {
80+
handled: true,
81+
type: 'generic',
82+
};
8083
if (!isError(exception)) {
8184
if (isPlainObject(exception)) {
8285
// This will allow us to group events based on top-level keys
@@ -100,13 +103,18 @@ export class NodeBackend extends BaseBackend<NodeOptions> {
100103
// We use synthesized Error here so we can extract a (rough) stack trace.
101104
ex = (hint && hint.syntheticException) || new Error(exception as string);
102105
}
106+
mechanism.synthetic = true;
103107
}
104108

105109
return new SyncPromise<Event>(resolve =>
106110
parseError(ex as Error, this.options).then(event => {
107111
resolve({
108112
...event,
109113
event_id: hint && hint.event_id,
114+
exception: {
115+
...event.exception,
116+
mechanism,
117+
},
110118
});
111119
}),
112120
);

packages/types/src/mechanism.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export interface Mechanism {
55
data?: {
66
[key: string]: string;
77
};
8+
synthetic?: boolean;
89
}

0 commit comments

Comments
 (0)