diff --git a/CHANGELOG.md b/CHANGELOG.md index a1af07bdd4..fc82139467 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Unreleased +* Feat: Configure idle transaction duration (#705) * Fix: `maxRequestBodySize` should be `never` by default when using the FailedRequestClientAdapter directly (#701) # 6.3.0-beta.2 diff --git a/flutter/lib/src/navigation/sentry_navigator_observer.dart b/flutter/lib/src/navigation/sentry_navigator_observer.dart index 1d64b6e356..45fba0c277 100644 --- a/flutter/lib/src/navigation/sentry_navigator_observer.dart +++ b/flutter/lib/src/navigation/sentry_navigator_observer.dart @@ -41,9 +41,10 @@ typedef AdditionalInfoExtractor = Map? Function( /// ``` /// /// The option [enableAutoTransactions] is enabled by default. For every new -/// route a transaction is started. It's automatically finished after 3 seconds -/// or when all child spans are finished, if those happen to take longer. The -/// transaction will be set to [Scope.span] if the latter is empty. +/// route a transaction is started. It's automatically finished after +/// [autoFinishAfter] duration or when all child spans are finished, +/// if those happen to take longer. The transaction will be set to [Scope.span] +/// if the latter is empty. /// /// Enabling the [setRouteNameAsTransaction] option overrides the current /// [Scope.transaction] which will also override the name of the current @@ -57,17 +58,20 @@ class SentryNavigatorObserver extends RouteObserver> { SentryNavigatorObserver({ Hub? hub, bool enableAutoTransactions = true, + Duration autoFinishAfter = const Duration(seconds: 3), bool setRouteNameAsTransaction = false, RouteNameExtractor? routeNameExtractor, AdditionalInfoExtractor? additionalInfoProvider, }) : _hub = hub ?? HubAdapter(), _enableAutoTransactions = enableAutoTransactions, + _autoFinishAfter = autoFinishAfter, _setRouteNameAsTransaction = setRouteNameAsTransaction, _routeNameExtractor = routeNameExtractor, _additionalInfoProvider = additionalInfoProvider; final Hub _hub; final bool _enableAutoTransactions; + final Duration _autoFinishAfter; final bool _setRouteNameAsTransaction; final RouteNameExtractor? _routeNameExtractor; final AdditionalInfoExtractor? _additionalInfoProvider; @@ -152,7 +156,7 @@ class SentryNavigatorObserver extends RouteObserver> { name, 'navigation', waitForChildren: true, - autoFinishAfter: Duration(seconds: 3), + autoFinishAfter: _autoFinishAfter, ); if (arguments != null) { _transaction?.setData('route_settings_arguments', arguments); diff --git a/flutter/test/sentry_navigator_observer_test.dart b/flutter/test/sentry_navigator_observer_test.dart index 6afb05ed49..f9cd92eee9 100644 --- a/flutter/test/sentry_navigator_observer_test.dart +++ b/flutter/test/sentry_navigator_observer_test.dart @@ -39,7 +39,10 @@ void main() { final hub = _MockHub(); final span = MockNoOpSentrySpan(); _whenAnyStart(hub, span); - final sut = fixture.getSut(hub: hub); + final sut = fixture.getSut( + hub: hub, + autoFinishAfter: Duration(seconds: 5), + ); sut.didPush(currentRoute, null); @@ -47,7 +50,7 @@ void main() { 'Current Route', 'navigation', waitForChildren: true, - autoFinishAfter: Duration(seconds: 3), + autoFinishAfter: Duration(seconds: 5), )); hub.configureScope((scope) { @@ -583,6 +586,7 @@ class Fixture { SentryNavigatorObserver getSut({ required Hub hub, bool enableAutoTransactions = true, + Duration autoFinishAfter = const Duration(seconds: 3), bool setRouteNameAsTransaction = false, RouteNameExtractor? routeNameExtractor, AdditionalInfoExtractor? additionalInfoProvider, @@ -590,6 +594,7 @@ class Fixture { return SentryNavigatorObserver( hub: hub, enableAutoTransactions: enableAutoTransactions, + autoFinishAfter: autoFinishAfter, setRouteNameAsTransaction: setRouteNameAsTransaction, routeNameExtractor: routeNameExtractor, additionalInfoProvider: additionalInfoProvider,