From 22833ce3761e1298a68689014e562da06725c422 Mon Sep 17 00:00:00 2001 From: Martin Haintz Date: Wed, 7 Aug 2024 09:40:25 +0200 Subject: [PATCH 1/6] add ignoreRoutes parameter to SentryNavigatorObserver --- .../navigation/sentry_navigator_observer.dart | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/flutter/lib/src/navigation/sentry_navigator_observer.dart b/flutter/lib/src/navigation/sentry_navigator_observer.dart index 1a6b156377..db91098407 100644 --- a/flutter/lib/src/navigation/sentry_navigator_observer.dart +++ b/flutter/lib/src/navigation/sentry_navigator_observer.dart @@ -80,12 +80,14 @@ class SentryNavigatorObserver extends RouteObserver> { RouteNameExtractor? routeNameExtractor, AdditionalInfoExtractor? additionalInfoProvider, @visibleForTesting TimeToDisplayTracker? timeToDisplayTracker, + List? ignoreRoutes, }) : _hub = hub ?? HubAdapter(), _enableAutoTransactions = enableAutoTransactions, _autoFinishAfter = autoFinishAfter, _setRouteNameAsTransaction = setRouteNameAsTransaction, _routeNameExtractor = routeNameExtractor, _additionalInfoProvider = additionalInfoProvider, + _ignoreRoutes = ignoreRoutes ?? [], _native = SentryFlutter.native { _isCreated = true; if (enableAutoTransactions) { @@ -113,6 +115,7 @@ class SentryNavigatorObserver extends RouteObserver> { final RouteNameExtractor? _routeNameExtractor; final AdditionalInfoExtractor? _additionalInfoProvider; final SentryNativeBinding? _native; + final List _ignoreRoutes; static TimeToDisplayTracker? _timeToDisplayTracker; @internal @@ -141,6 +144,11 @@ class SentryNavigatorObserver extends RouteObserver> { void didPush(Route route, Route? previousRoute) { super.didPush(route, previousRoute); + if (_isRouteIgnored(route) || + previousRoute != null && _isRouteIgnored(previousRoute)) { + return; + } + _setCurrentRouteName(route); _setCurrentRouteNameAsTransaction(route); @@ -160,6 +168,11 @@ class SentryNavigatorObserver extends RouteObserver> { void didReplace({Route? newRoute, Route? oldRoute}) { super.didReplace(newRoute: newRoute, oldRoute: oldRoute); + if (newRoute != null && _isRouteIgnored(newRoute) || + oldRoute != null && _isRouteIgnored(oldRoute)) { + return; + } + _setCurrentRouteName(newRoute); _setCurrentRouteNameAsTransaction(newRoute); @@ -174,6 +187,11 @@ class SentryNavigatorObserver extends RouteObserver> { void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); + if (_isRouteIgnored(route) || + previousRoute != null && _isRouteIgnored(previousRoute)) { + return; + } + _setCurrentRouteName(previousRoute); _setCurrentRouteNameAsTransaction(previousRoute); @@ -376,6 +394,11 @@ class SentryNavigatorObserver extends RouteObserver> { @internal static const String rootScreenName = 'root /'; + + bool _isRouteIgnored(Route route) { + return _ignoreRoutes.isNotEmpty && + _ignoreRoutes.contains(_getRouteName(route)); + } } /// This class makes it easier to record breadcrumbs for events of Flutters From 96754129b84b90f96a91c4b7aca4dd281df05261 Mon Sep 17 00:00:00 2001 From: Martin Haintz Date: Wed, 7 Aug 2024 11:49:21 +0200 Subject: [PATCH 2/6] add unitTest for ignoreRoutes --- .../test/sentry_navigator_observer_test.dart | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/flutter/test/sentry_navigator_observer_test.dart b/flutter/test/sentry_navigator_observer_test.dart index bc9971cb9c..16d861d43d 100644 --- a/flutter/test/sentry_navigator_observer_test.dart +++ b/flutter/test/sentry_navigator_observer_test.dart @@ -975,6 +975,25 @@ void main() { observer.didReplace(newRoute: route(to), oldRoute: route(previous)); expect(hub.scope.transaction, 'to_test'); }); + + test('ignores Route and prevents recognition of this route', () async { + final firstRoute = route(RouteSettings(name: 'default')); + final secondRoute = route(RouteSettings(name: 'testRoute')); + + final hub = _MockHub(); + + final sut = fixture.getSut(hub: hub, ignoreRoutes: ["testRoute"]); + + sut.didPush(firstRoute, null); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + sut.didPush(secondRoute, firstRoute); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + sut.didPop(firstRoute, secondRoute); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + }); }); } @@ -987,6 +1006,7 @@ class Fixture { RouteNameExtractor? routeNameExtractor, AdditionalInfoExtractor? additionalInfoProvider, bool enableTimeToFullDisplayTracing = false, + List? ignoreRoutes, }) { final frameCallbackHandler = FakeFrameCallbackHandler(); final timeToInitialDisplayTracker = @@ -1003,6 +1023,7 @@ class Fixture { routeNameExtractor: routeNameExtractor, additionalInfoProvider: additionalInfoProvider, timeToDisplayTracker: timeToDisplayTracker, + ignoreRoutes: ignoreRoutes, ); } From 668caaa6524f073761ae7941bdf82f0bb86a7344 Mon Sep 17 00:00:00 2001 From: Martin Haintz Date: Wed, 7 Aug 2024 11:53:51 +0200 Subject: [PATCH 3/6] add changelog entry for ignoreRoutes in the SentryNaviagtorObserver --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3517cd150b..5a7e697bb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## Unreleased + +### Features + +- Add `ignoreRoutes` parameter to `SentryNavigatorObserver`. ([#2218](https://github.com/getsentry/sentry-dart/pull/2218)) + - This will ignore the Routes and prevent the Route from being pushed to the Sentry server. +```dart +SentryNavigatorObserver(ignoreRoutes: ["/ignoreThisRoute"]), +``` + ## 8.6.0 ### Improvements From 1cbcf3da062a1f232438aa00c04752eb7a0edaf8 Mon Sep 17 00:00:00 2001 From: Martin Haintz Date: Mon, 12 Aug 2024 11:42:50 +0200 Subject: [PATCH 4/6] add for ignore routes, that not TTID and TTFD spans are created Co-authored-by: Giancarlo Buenaflor --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9afb1090b..84009ea498 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Add `ignoreRoutes` parameter to `SentryNavigatorObserver`. ([#2218](https://github.com/getsentry/sentry-dart/pull/2218)) - This will ignore the Routes and prevent the Route from being pushed to the Sentry server. + - Ignored routes will also create no TTID and TTFD spans. ```dart SentryNavigatorObserver(ignoreRoutes: ["/ignoreThisRoute"]), ``` From 38ba20dcef815ee8011dd20516b08130b3e69053 Mon Sep 17 00:00:00 2001 From: Martin Haintz Date: Mon, 12 Aug 2024 12:09:59 +0200 Subject: [PATCH 5/6] add further tests for ignore routes --- .../test/sentry_navigator_observer_test.dart | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/flutter/test/sentry_navigator_observer_test.dart b/flutter/test/sentry_navigator_observer_test.dart index 16d861d43d..9a64d65414 100644 --- a/flutter/test/sentry_navigator_observer_test.dart +++ b/flutter/test/sentry_navigator_observer_test.dart @@ -976,7 +976,28 @@ void main() { expect(hub.scope.transaction, 'to_test'); }); - test('ignores Route and prevents recognition of this route', () async { + test('ignores Route and prevents recognition of this route for didPush', + () async { + final firstRoute = route(RouteSettings(name: 'default')); + final secondRoute = route(RouteSettings(name: 'testRoute')); + + final hub = _MockHub(); + + final sut = fixture.getSut(hub: hub, ignoreRoutes: ["testRoute"]); + + sut.didPush(firstRoute, null); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + sut.didPush(secondRoute, firstRoute); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + sut.didPush(firstRoute, secondRoute); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + }); + + test('ignores Route and prevents recognition of this route for didPop', + () async { final firstRoute = route(RouteSettings(name: 'default')); final secondRoute = route(RouteSettings(name: 'testRoute')); @@ -994,6 +1015,26 @@ void main() { expect( SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); }); + + test('ignores Route and prevents recognition of this route for didReplace', + () async { + final firstRoute = route(RouteSettings(name: 'default')); + final secondRoute = route(RouteSettings(name: 'testRoute')); + + final hub = _MockHub(); + + final sut = fixture.getSut(hub: hub, ignoreRoutes: ["testRoute"]); + + sut.didReplace(newRoute: firstRoute); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + sut.didReplace(newRoute: secondRoute, oldRoute: firstRoute); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + sut.didReplace(newRoute: firstRoute, oldRoute: secondRoute); + expect( + SentryNavigatorObserver.currentRouteName, firstRoute.settings.name); + }); }); } From d6f4358fe144ddc0cb0551ee6cf1e882a9e9a036 Mon Sep 17 00:00:00 2001 From: Martin Haintz Date: Mon, 12 Aug 2024 12:12:16 +0200 Subject: [PATCH 6/6] fix changelog and move ignoreRoutes to unreleased --- CHANGELOG.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84009ea498..75d9fe9e24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,20 @@ # Changelog -## 8.7.0 +## Unreleased ### Features - Add `ignoreRoutes` parameter to `SentryNavigatorObserver`. ([#2218](https://github.com/getsentry/sentry-dart/pull/2218)) - - This will ignore the Routes and prevent the Route from being pushed to the Sentry server. - - Ignored routes will also create no TTID and TTFD spans. + - This will ignore the Routes and prevent the Route from being pushed to the Sentry server. + - Ignored routes will also create no TTID and TTFD spans. ```dart SentryNavigatorObserver(ignoreRoutes: ["/ignoreThisRoute"]), ``` + +## 8.7.0 + +### Features + - Add support for span level measurements. ([#2214](https://github.com/getsentry/sentry-dart/pull/2214)) - Add `ignoreTransactions` and `ignoreErrors` to options ([#2207](https://github.com/getsentry/sentry-dart/pull/2207)) ```dart