Skip to content

Commit 09e1f22

Browse files
committed
fix(core): Make event processing defensive
Make sure that we do not call `beforeSend` for non-error events, and that we only sample error events.
1 parent 402ccd7 commit 09e1f22

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

packages/core/src/baseclient.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
Event,
99
EventDropReason,
1010
EventHint,
11+
EventType,
1112
Integration,
1213
IntegrationClass,
1314
Outcome,
@@ -42,6 +43,8 @@ import { IntegrationIndex, setupIntegrations } from './integration';
4243
import { Scope } from './scope';
4344
import { updateSession } from './session';
4445

46+
type BeforeSendProcessorMethod = 'beforeSend' | 'beforeSendTransaction';
47+
4548
const ALREADY_SEEN_ERROR = "Not capturing exception because it's already been captured.";
4649

4750
/**
@@ -628,13 +631,20 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
628631
}
629632

630633
const isTransaction = event.type === 'transaction';
631-
const beforeSendProcessorName = isTransaction ? 'beforeSendTransaction' : 'beforeSend';
632-
const beforeSendProcessor = options[beforeSendProcessorName];
634+
const isError = !event.type;
635+
636+
const beforeSendProcessorMap: Map<EventType | undefined, BeforeSendProcessorMethod | undefined> = new Map([
637+
[undefined, 'beforeSend'],
638+
['transaction', 'beforeSendTransaction'],
639+
]);
640+
641+
const beforeSendProcessorName = beforeSendProcessorMap.get(event.type);
642+
const beforeSendProcessor = beforeSendProcessorName ? options[beforeSendProcessorName] : undefined;
633643

634644
// 1.0 === 100% events are sent
635645
// 0.0 === 0% events are sent
636646
// Sampling for transaction happens somewhere else
637-
if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {
647+
if (isError && typeof sampleRate === 'number' && Math.random() > sampleRate) {
638648
this.recordDroppedEvent('sample_rate', 'error', event);
639649
return rejectedSyncPromise(
640650
new SentryError(
@@ -657,7 +667,7 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
657667
}
658668

659669
const beforeSendResult = beforeSendProcessor(prepared, hint);
660-
return _validateBeforeSendResult(beforeSendResult, beforeSendProcessorName);
670+
return _validateBeforeSendResult(beforeSendResult, beforeSendProcessorName as BeforeSendProcessorMethod);
661671
})
662672
.then(processedEvent => {
663673
if (processedEvent === null) {

packages/types/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export type {
2424
UserFeedbackItem,
2525
} from './envelope';
2626
export type { ExtendedError } from './error';
27-
export type { Event, EventHint } from './event';
27+
export type { Event, EventHint, EventType } from './event';
2828
export type { EventProcessor } from './eventprocessor';
2929
export type { Exception } from './exception';
3030
export type { Extra, Extras } from './extra';

0 commit comments

Comments
 (0)