Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
- Ref: Remove stackFrameFilter in favor of beforeSendCallback #125
- Ref: added Transport #123
- Feat: apply sample rate
- Ref: execute before send callback

# `package:sentry` changelog

Expand Down
26 changes: 25 additions & 1 deletion dart/lib/src/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,22 @@ abstract class SentryClient {
Scope scope,
dynamic hint,
}) async {
final emptyFuture = Future.value(SentryId.empty());

event = _processEvent(event, eventProcessors: _options.eventProcessors);

// dropped by sampling or event processors
if (event == null) {
return Future.value(SentryId.empty());
return emptyFuture;
}

event = _applyScope(event: event, scope: scope);

// dropped by scope event processors
if (event == null) {
return emptyFuture;
}

// TODO create eventProcessors ?
event = event.copyWith(
serverName: _options.serverName,
Expand All @@ -52,6 +59,21 @@ abstract class SentryClient {
platform: event.platform ?? sdkPlatform,
);

if (_options.beforeSendCallback != null) {
try {
event = _options.beforeSendCallback(event, hint);
} catch (err) {
_options.logger(
SentryLevel.error,
'The BeforeSend callback threw an exception',
);
}
if (event == null) {
_options.logger(SentryLevel.debug, 'Event was dropped by a processor');
return emptyFuture;
}
}

return _options.transport.send(event);
}

Expand Down Expand Up @@ -160,6 +182,8 @@ abstract class SentryClient {
if (scope.level != null) {
event = event.copyWith(level: scope.level);
}

// TODO: execute scope event processors
}
return event;
}
Expand Down
42 changes: 34 additions & 8 deletions dart/test/sentry_client_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,64 @@ import 'mocks.dart';
void main() {
group('SentryClient sampling', () {
SentryOptions options;
Transport transport;

setUp(() {
options = SentryOptions(dsn: fakeDsn);
transport = MockTransport();
options.transport = MockTransport();
});

test('captures event, sample rate is 100% enabled', () {
options.sampleRate = 1.0;
final client = SentryClient(options);
options.transport = transport;
client.captureEvent(fakeEvent);

verify(transport.send(any)).called(1);
verify(options.transport.send(any)).called(1);
});

test('do not capture event, sample rate is 0% disabled', () {
options.sampleRate = 0.0;
final client = SentryClient(options);
options.transport = transport;
client.captureEvent(fakeEvent);

verifyNever(transport.send(any));
verifyNever(options.transport.send(any));
});

test('captures event, sample rate is null, disabled', () {
options.sampleRate = null;
final client = SentryClient(options);
options.transport = transport;
client.captureEvent(fakeEvent);

verify(transport.send(any)).called(1);
verify(options.transport.send(any)).called(1);
});
});

group('SentryClient before send', () {
SentryOptions options;

setUp(() {
options = SentryOptions(dsn: fakeDsn);
options.transport = MockTransport();
});

test('before send drops event', () {
options.beforeSendCallback = beforeSendCallbackDropEvent;
final client = SentryClient(options);
client.captureEvent(fakeEvent);

verifyNever(options.transport.send(any));
});

test('before send returns an event and event is captured', () {
options.beforeSendCallback = beforeSendCallback;
final client = SentryClient(options);
client.captureEvent(fakeEvent);

verify(options.transport.send(any)).called(1);
});
});
}

SentryEvent beforeSendCallbackDropEvent(SentryEvent event, dynamic hint) =>
null;

SentryEvent beforeSendCallback(SentryEvent event, dynamic hint) => event;