Skip to content

Commit afc86cf

Browse files
buenaflorclaude
andcommitted
ref(dart): Move beforeSend feature tracking to integration
Extract beforeSend* feature registration from SentryClient factory into TrackBeforeSendUsageIntegration. This follows the integration pattern used by other SDK setup concerns and keeps client construction focused on transport wiring. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
1 parent 99a3f86 commit afc86cf

5 files changed

Lines changed: 118 additions & 71 deletions

File tree

packages/dart/lib/src/sentry.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import 'transport/task_queue.dart';
3232
import 'feature_flags_integration.dart';
3333
import 'telemetry/log/logger.dart';
3434
import 'telemetry/log/logger_setup_integration.dart';
35+
import 'track_before_send_usage_integration.dart';
3536

3637
/// Configuration options callback
3738
typedef OptionsConfiguration = FutureOr<void> Function(SentryOptions);
@@ -116,6 +117,7 @@ class Sentry {
116117
options.addIntegration(LoggerSetupIntegration());
117118
options.addIntegration(FeatureFlagsIntegration());
118119
options.addIntegration(InMemoryTelemetryProcessorIntegration());
120+
options.addIntegration(TrackBeforeSendUsageIntegration());
119121

120122
options.addEventProcessor(EnricherEventProcessor(options));
121123
options.addEventProcessor(ExceptionEventProcessor(options));

packages/dart/lib/src/sentry_client.dart

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'dart:math';
44
import 'package:meta/meta.dart';
55

66
import 'client_reports/client_report_recorder.dart';
7-
import 'constants.dart';
87
import 'client_reports/discard_reason.dart';
98
import 'event_processor/run_event_processors.dart';
109
import 'hint.dart';
@@ -82,22 +81,6 @@ class SentryClient {
8281
if (enableFlutterSpotlight) {
8382
options.transport = SpotlightHttpTransport(options, options.transport);
8483
}
85-
if (options.beforeSend != null) {
86-
options.sdk.addFeature(SentryFeatures.beforeSendEvent);
87-
}
88-
if (options.beforeSendTransaction != null) {
89-
options.sdk.addFeature(SentryFeatures.beforeSendTransaction);
90-
}
91-
if (options.beforeSendFeedback != null) {
92-
options.sdk.addFeature(SentryFeatures.beforeSendFeedback);
93-
}
94-
if (options.beforeSendLog != null) {
95-
options.sdk.addFeature(SentryFeatures.beforeSendLog);
96-
}
97-
if (options.beforeSendMetric != null) {
98-
options.sdk.addFeature(SentryFeatures.beforeSendMetric);
99-
}
100-
10184
return SentryClient._(
10285
options,
10386
logCapturePipeline ?? LogCapturePipeline(options),
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import 'package:meta/meta.dart';
2+
3+
import 'constants.dart';
4+
import 'hub.dart';
5+
import 'integration.dart';
6+
import 'sentry_options.dart';
7+
8+
/// Registers SDK feature flags for configured `beforeSend*` callbacks.
9+
/// This allows us to track which callbacks are used in the SDK.
10+
@internal
11+
class TrackBeforeSendUsageIntegration extends Integration<SentryOptions> {
12+
@override
13+
void call(Hub hub, SentryOptions options) {
14+
if (options.beforeSend != null) {
15+
options.sdk.addFeature(SentryFeatures.beforeSendEvent);
16+
}
17+
if (options.beforeSendTransaction != null) {
18+
options.sdk.addFeature(SentryFeatures.beforeSendTransaction);
19+
}
20+
if (options.beforeSendFeedback != null) {
21+
options.sdk.addFeature(SentryFeatures.beforeSendFeedback);
22+
}
23+
if (options.beforeSendLog != null) {
24+
options.sdk.addFeature(SentryFeatures.beforeSendLog);
25+
}
26+
if (options.beforeSendMetric != null) {
27+
options.sdk.addFeature(SentryFeatures.beforeSendMetric);
28+
}
29+
}
30+
}

packages/dart/test/sentry_client_test.dart

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2389,60 +2389,6 @@ void main() {
23892389
});
23902390
});
23912391

2392-
group('SentryClient beforeSend features', () {
2393-
late Fixture fixture;
2394-
2395-
setUp(() {
2396-
fixture = Fixture();
2397-
});
2398-
2399-
test('adds beforeSendEvent feature when beforeSend is configured', () {
2400-
fixture.getSut(beforeSend: beforeSendCallback);
2401-
expect(fixture.options.sdk.features,
2402-
contains(SentryFeatures.beforeSendEvent));
2403-
});
2404-
2405-
test('adds beforeSendTransaction feature when configured', () {
2406-
fixture.getSut(beforeSendTransaction: beforeSendTransactionCallback);
2407-
expect(fixture.options.sdk.features,
2408-
contains(SentryFeatures.beforeSendTransaction));
2409-
});
2410-
2411-
test('adds beforeSendFeedback feature when configured', () {
2412-
fixture.getSut(beforeSendFeedback: beforeSendFeedbackCallback);
2413-
expect(fixture.options.sdk.features,
2414-
contains(SentryFeatures.beforeSendFeedback));
2415-
});
2416-
2417-
test('adds beforeSendLog feature when configured', () {
2418-
fixture.options.beforeSendLog = (log) => log;
2419-
SentryClient(fixture.options);
2420-
expect(
2421-
fixture.options.sdk.features, contains(SentryFeatures.beforeSendLog));
2422-
});
2423-
2424-
test('adds beforeSendMetric feature when configured', () {
2425-
fixture.options.beforeSendMetric = (metric) => metric;
2426-
SentryClient(fixture.options);
2427-
expect(fixture.options.sdk.features,
2428-
contains(SentryFeatures.beforeSendMetric));
2429-
});
2430-
2431-
test('does not add beforeSend features when callbacks are not set', () {
2432-
fixture.getSut();
2433-
expect(fixture.options.sdk.features,
2434-
isNot(contains(SentryFeatures.beforeSendEvent)));
2435-
expect(fixture.options.sdk.features,
2436-
isNot(contains(SentryFeatures.beforeSendTransaction)));
2437-
expect(fixture.options.sdk.features,
2438-
isNot(contains(SentryFeatures.beforeSendFeedback)));
2439-
expect(fixture.options.sdk.features,
2440-
isNot(contains(SentryFeatures.beforeSendLog)));
2441-
expect(fixture.options.sdk.features,
2442-
isNot(contains(SentryFeatures.beforeSendMetric)));
2443-
});
2444-
});
2445-
24462392
group('SentryClient close', () {
24472393
late Fixture fixture;
24482394

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import 'package:sentry/sentry.dart';
2+
import 'package:sentry/src/track_before_send_usage_integration.dart';
3+
import 'package:test/test.dart';
4+
5+
import 'mocks/mock_hub.dart';
6+
import 'test_utils.dart';
7+
8+
void main() {
9+
group(TrackBeforeSendUsageIntegration, () {
10+
late Fixture fixture;
11+
12+
setUp(() {
13+
fixture = Fixture();
14+
});
15+
16+
test('adds beforeSendEvent feature when beforeSend is configured', () {
17+
fixture.options.beforeSend = (event, hint) => event;
18+
19+
fixture.getSut().call(fixture.hub, fixture.options);
20+
21+
expect(fixture.options.sdk.features,
22+
contains(SentryFeatures.beforeSendEvent));
23+
});
24+
25+
test('adds beforeSendTransaction feature when configured', () {
26+
fixture.options.beforeSendTransaction =
27+
(transaction, hint) => transaction;
28+
29+
fixture.getSut().call(fixture.hub, fixture.options);
30+
31+
expect(fixture.options.sdk.features,
32+
contains(SentryFeatures.beforeSendTransaction));
33+
});
34+
35+
test('adds beforeSendFeedback feature when configured', () {
36+
fixture.options.beforeSendFeedback = (event, hint) => event;
37+
38+
fixture.getSut().call(fixture.hub, fixture.options);
39+
40+
expect(fixture.options.sdk.features,
41+
contains(SentryFeatures.beforeSendFeedback));
42+
});
43+
44+
test('adds beforeSendLog feature when configured', () {
45+
fixture.options.beforeSendLog = (log) => log;
46+
47+
fixture.getSut().call(fixture.hub, fixture.options);
48+
49+
expect(
50+
fixture.options.sdk.features, contains(SentryFeatures.beforeSendLog));
51+
});
52+
53+
test('adds beforeSendMetric feature when configured', () {
54+
fixture.options.beforeSendMetric = (metric) => metric;
55+
56+
fixture.getSut().call(fixture.hub, fixture.options);
57+
58+
expect(fixture.options.sdk.features,
59+
contains(SentryFeatures.beforeSendMetric));
60+
});
61+
62+
test('does not add features when callbacks are not set', () {
63+
fixture.getSut().call(fixture.hub, fixture.options);
64+
65+
expect(fixture.options.sdk.features,
66+
isNot(contains(SentryFeatures.beforeSendEvent)));
67+
expect(fixture.options.sdk.features,
68+
isNot(contains(SentryFeatures.beforeSendTransaction)));
69+
expect(fixture.options.sdk.features,
70+
isNot(contains(SentryFeatures.beforeSendFeedback)));
71+
expect(fixture.options.sdk.features,
72+
isNot(contains(SentryFeatures.beforeSendLog)));
73+
expect(fixture.options.sdk.features,
74+
isNot(contains(SentryFeatures.beforeSendMetric)));
75+
});
76+
});
77+
}
78+
79+
class Fixture {
80+
final hub = MockHub();
81+
final options = defaultTestOptions();
82+
83+
TrackBeforeSendUsageIntegration getSut() {
84+
return TrackBeforeSendUsageIntegration();
85+
}
86+
}

0 commit comments

Comments
 (0)