From 0e549fe30686fa05b9da05e6df1ab87b15aba4a9 Mon Sep 17 00:00:00 2001 From: Denis Andrasec Date: Tue, 21 Jan 2025 13:36:38 +0100 Subject: [PATCH 1/2] Move application event processor to shared function --- .../event_processor/run_event_processors.dart | 76 +++++++++++++++++++ dart/lib/src/scope.dart | 29 +------ dart/lib/src/sentry_client.dart | 66 ++-------------- 3 files changed, 85 insertions(+), 86 deletions(-) create mode 100644 dart/lib/src/event_processor/run_event_processors.dart diff --git a/dart/lib/src/event_processor/run_event_processors.dart b/dart/lib/src/event_processor/run_event_processors.dart new file mode 100644 index 0000000000..422288c1f0 --- /dev/null +++ b/dart/lib/src/event_processor/run_event_processors.dart @@ -0,0 +1,76 @@ +import 'package:meta/meta.dart'; + +import '../client_reports/discard_reason.dart'; +import '../event_processor.dart'; +import '../hint.dart'; +import '../protocol/sentry_event.dart'; +import '../protocol/sentry_level.dart'; +import '../protocol/sentry_transaction.dart'; +import '../sentry_options.dart'; +import '../transport/data_category.dart'; + +@internal +Future runEventProcessors( + SentryEvent event, + Hint hint, + List eventProcessors, + SentryOptions options, +) async { + int spanCountBeforeEventProcessors = + event is SentryTransaction ? event.spans.length : 0; + + SentryEvent? processedEvent = event; + for (final processor in eventProcessors) { + try { + final e = processor.apply(processedEvent!, hint); + processedEvent = e is Future ? await e : e; + } catch (exception, stackTrace) { + options.logger( + SentryLevel.error, + 'An exception occurred while processing event by a processor', + exception: exception, + stackTrace: stackTrace, + ); + if (options.automatedTestMode) { + rethrow; + } + } + + final discardReason = DiscardReason.eventProcessor; + if (processedEvent == null) { + options.recorder.recordLostEvent(discardReason, _getCategory(event)); + if (event is SentryTransaction) { + // We dropped the whole transaction, the dropped count includes all child spans + 1 root span + options.recorder.recordLostEvent( + discardReason, + DataCategory.span, + count: spanCountBeforeEventProcessors + 1, + ); + } + options.logger(SentryLevel.debug, 'Event was dropped by a processor'); + break; + } else if (event is SentryTransaction && + processedEvent is SentryTransaction) { + // If event processor removed only some spans we still report them as dropped + final spanCountAfterEventProcessors = processedEvent.spans.length; + final droppedSpanCount = + spanCountBeforeEventProcessors - spanCountAfterEventProcessors; + if (droppedSpanCount > 0) { + options.recorder.recordLostEvent( + discardReason, + DataCategory.span, + count: droppedSpanCount, + ); + } + } + } + + return processedEvent; +} + +DataCategory _getCategory(SentryEvent event) { + if (event is SentryTransaction) { + return DataCategory.transaction; + } + return DataCategory.error; +} diff --git a/dart/lib/src/scope.dart b/dart/lib/src/scope.dart index 03748445e6..b8f04096ba 100644 --- a/dart/lib/src/scope.dart +++ b/dart/lib/src/scope.dart @@ -4,6 +4,7 @@ import 'dart:collection'; import 'package:meta/meta.dart'; import 'event_processor.dart'; +import 'event_processor/run_event_processors.dart'; import 'hint.dart'; import 'propagation_context.dart'; import 'protocol.dart'; @@ -341,33 +342,7 @@ class Scope { } } - SentryEvent? processedEvent = event; - for (final processor in _eventProcessors) { - try { - final e = processor.apply(processedEvent!, hint); - if (e is Future) { - processedEvent = await e; - } else { - processedEvent = e; - } - } catch (exception, stackTrace) { - _options.logger( - SentryLevel.error, - 'An exception occurred while processing event by a processor', - exception: exception, - stackTrace: stackTrace, - ); - if (_options.automatedTestMode) { - rethrow; - } - } - if (processedEvent == null) { - _options.logger(SentryLevel.debug, 'Event was dropped by a processor'); - break; - } - } - - return processedEvent; + return await runEventProcessors(event, hint, _eventProcessors, _options); } /// Merge the scope contexts runtimes and the event contexts runtimes. diff --git a/dart/lib/src/sentry_client.dart b/dart/lib/src/sentry_client.dart index 9c89ecb414..112fb652c6 100644 --- a/dart/lib/src/sentry_client.dart +++ b/dart/lib/src/sentry_client.dart @@ -6,6 +6,7 @@ import 'package:meta/meta.dart'; import 'client_reports/client_report_recorder.dart'; import 'client_reports/discard_reason.dart'; import 'event_processor.dart'; +import 'event_processor/run_event_processors.dart'; import 'hint.dart'; import 'protocol.dart'; import 'protocol/sentry_feedback.dart'; @@ -134,10 +135,11 @@ class SentryClient { return _emptySentryId; } - preparedEvent = await _runEventProcessors( + preparedEvent = await runEventProcessors( preparedEvent, hint, - eventProcessors: _options.eventProcessors, + _options.eventProcessors, + _options, ); // dropped by event processors @@ -374,10 +376,11 @@ class SentryClient { return _emptySentryId; } - preparedTransaction = await _runEventProcessors( + preparedTransaction = await runEventProcessors( preparedTransaction, hint, - eventProcessors: _options.eventProcessors, + _options.eventProcessors, + _options, ) as SentryTransaction?; // dropped by event processors @@ -551,61 +554,6 @@ class SentryClient { return processedEvent; } - Future _runEventProcessors( - SentryEvent event, - Hint hint, { - required List eventProcessors, - }) async { - SentryEvent? processedEvent = event; - int spanCountBeforeEventProcessors = - event is SentryTransaction ? event.spans.length : 0; - - for (final processor in eventProcessors) { - try { - final e = processor.apply(processedEvent!, hint); - if (e is Future) { - processedEvent = await e; - } else { - processedEvent = e; - } - } catch (exception, stackTrace) { - _options.logger( - SentryLevel.error, - 'An exception occurred while processing event by a processor', - exception: exception, - stackTrace: stackTrace, - ); - if (_options.automatedTestMode) { - rethrow; - } - } - - final discardReason = DiscardReason.eventProcessor; - if (processedEvent == null) { - _options.recorder.recordLostEvent(discardReason, _getCategory(event)); - if (event is SentryTransaction) { - // We dropped the whole transaction, the dropped count includes all child spans + 1 root span - _options.recorder.recordLostEvent(discardReason, DataCategory.span, - count: spanCountBeforeEventProcessors + 1); - } - _options.logger(SentryLevel.debug, 'Event was dropped by a processor'); - break; - } else if (event is SentryTransaction && - processedEvent is SentryTransaction) { - // If event processor removed only some spans we still report them as dropped - final spanCountAfterEventProcessors = processedEvent.spans.length; - final droppedSpanCount = - spanCountBeforeEventProcessors - spanCountAfterEventProcessors; - if (droppedSpanCount > 0) { - _options.recorder.recordLostEvent(discardReason, DataCategory.span, - count: droppedSpanCount); - } - } - } - - return processedEvent; - } - bool _sampleRate() { if (_options.sampleRate != null && _random != null) { return (_options.sampleRate! < _random!.nextDouble()); From 22cf76abfae8200d44a768e9eee0fa8949fb3305 Mon Sep 17 00:00:00 2001 From: Denis Andrasec Date: Wed, 22 Jan 2025 15:07:24 +0100 Subject: [PATCH 2/2] remove unused import --- dart/lib/src/sentry_client.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/dart/lib/src/sentry_client.dart b/dart/lib/src/sentry_client.dart index 112fb652c6..dc59eea643 100644 --- a/dart/lib/src/sentry_client.dart +++ b/dart/lib/src/sentry_client.dart @@ -5,7 +5,6 @@ import 'package:meta/meta.dart'; import 'client_reports/client_report_recorder.dart'; import 'client_reports/discard_reason.dart'; -import 'event_processor.dart'; import 'event_processor/run_event_processors.dart'; import 'hint.dart'; import 'protocol.dart';