Releases: getsentry/sentry-dart
8.11.0-beta.1
Features
- Windows native error & obfuscation support (#2286, #2426)
- Improve app start measurements by using
addTimingsCallback
instead ofaddPostFrameCallback
to determine app start end (#2405)β οΈ This change may result in reporting of shorter app start durations
- Improve frame tracking accuracy (#2372)
- Introduces
SentryWidgetsFlutterBinding
that tracks a frame starting fromhandleBeginFrame
and ending inhandleDrawFrame
, this is approximately the buildDuration time - By default,
SentryFlutter.init()
automatically initializesSentryWidgetsFlutterBinding
through theWidgetsFlutterBindingIntegration
- If you need to initialize the binding before
SentryFlutter.init
, useSentryWidgetsFlutterBinding.ensureInitialized
instead ofWidgetsFlutterBinding.ensureInitialized
:
void main() async { // Replace WidgetsFlutterBinding.ensureInitialized() SentryWidgetsFlutterBinding.ensureInitialized(); await SentryFlutter.init(...); runApp(MyApp()); }
β οΈ Frame tracking will be disabled if a different binding is used
- Introduces
Enhancements
- Only send debug images referenced in the stacktrace for events (#2329)
- Remove
sentry
frames if SDK falls back to current stack trace (#2351)- Flutter doesn't always provide stack traces for unhandled errors - this is normal Flutter behavior
- When no stack trace is provided (in Flutter errors,
captureException
, orcaptureMessage
):- SDK creates a synthetic trace using
StackTrace.current
- Internal SDK frames are removed to reduce noise
- SDK creates a synthetic trace using
- Original stack traces (when provided) are left unchanged
Fixes
- Apply default IP address (
{{auto}}
) to transactions (#2395)- Previously, transactions weren't getting the default IP address when user context was loaded
- Now consistently applies default IP address to both events and transactions when:
- No user context exists
- User context exists but IP address is null
Dependencies
8.10.1
8.10.0
Features
-
Emit
transaction.data
insidecontexts.trace.data
(#2284) -
Blocking app starts span if "appLaunchedInForeground" is false. (Android only) (#2291)
-
Replay: user-configurable masking (redaction) for widget classes and specific widget instances. (#2324)
Some examples of the configuration:await SentryFlutter.init( (options) { ... options.experimental.replay.mask<IconButton>(); options.experimental.replay.unmask<Image>(); options.experimental.replay.maskCallback<Text>( (Element element, Text widget) => (widget.data?.contains('secret') ?? false) ? SentryMaskingDecision.mask : SentryMaskingDecision.continueProcessing); }, appRunner: () => runApp(MyApp()), );
Also, you can wrap any of your widgets with
SentryMask()
orSentryUnmask()
widgets to mask/unmask them, respectively. For example:Β SentryUnmask(Text('Not secret at all'));
-
Support
captureFeedback
(#2230)- Deprecated
Sentry.captureUserFeedback
, usecaptureFeedback
instead. - Deprecated
Hub.captureUserFeedback
, usecaptureFeedback
instead. - Deprecated
SentryClient.captureUserFeedback
, usecaptureFeedback
instead. - Deprecated
SentryUserFeedback
, useSentryFeedback
instead.
- Deprecated
-
Add
SentryFeedbackWidget
(#2240)Navigator.push( context, MaterialPageRoute( builder: (context) => SentryFeedbackWidget(associatedEventId: id), fullscreenDialog: true, ), );
-
Add screenshot to
SentryFeedbackWidget
(#2369)- Use
SentryFlutter.captureScreenshot
to create a screenshot attachment - Call
SentryFeedbackWidget
with this attachment to add it to the user feedback
final id = await Sentry.captureMessage('UserFeedback'); final screenshot = await SentryFlutter.captureScreenshot(); Navigator.push( context, MaterialPageRoute( builder: (context) => SentryFeedbackWidget( associatedEventId: id, screenshot: screenshot, ), fullscreenDialog: true, ), );
- Use
Enhancements
- Avoid sending too many empty client reports when Http Transport is used (#2380)
- Cache parsed DSN (#2365)
- Handle backpressure earlier in pipeline (#2371)
- Drops max un-awaited parallel tasks earlier, so event processors & callbacks are not executed for them.
- Change by setting
SentryOptions.maxQueueSize
. Default is 30.
- Use native spotlight integrations on Flutter Android, iOS, macOS (#2285)
- Improve app start integration (#2266)
- Only store slow and frozen frames for frame delay calculation (#2337)
- Add ReplayIntegration to the integrations list on events when replay is enabled. (#2349)
Fixes
- App lag with frame tracking enabled when span finishes after a long time (#2311)
- Only start frame tracking if we receive valid display refresh data (#2307)
- Rounding error used on frames.total and reject frame measurements if frames.total is less than frames.slow or frames.frozen (#2308)
- iOS replay integration when only
onErrorSampleRate
is specified (#2306) - Fix TTID timing issue (#2326)
- TTFD fixes
- Accessing invalid json fields from
fetchNativeAppStart
should return null (#2340)
Deprecate
- Metrics API (#2312)
Dependencies
8.10.0-beta.2
Fixes
- Temporarily disable Windows native error & obfuscation support (#2363)
8.10.0-beta.1
Features
-
Emit
transaction.data
insidecontexts.trace.data
(#2284) -
Block reporting of app start metrics if "appLaunchedInForeground" is false. (Android only) (#2291)
-
Windows native error & obfuscation support (#2286)
-
Replay: user-configurable masking (redaction) for widget classes and specific widget instances. (#2324)
Some examples of the configuration:await SentryFlutter.init( (options) { ... options.experimental.replay.mask<IconButton>(); options.experimental.replay.unmask<Image>(); options.experimental.replay.maskCallback<Text>( (Element element, Text widget) => (widget.data?.contains('secret') ?? false) ? SentryMaskingDecision.mask : SentryMaskingDecision.continueProcessing); }, appRunner: () => runApp(MyApp()), );
Also, you can wrap any of your widgets with
SentryMask()
orSentryUnmask()
widgets to mask/unmask them, respectively. For example:Β SentryUnmask(Text('Not secret at all'));
-
Support
captureFeedback
(#2230)- Deprecated
Sentry.captureUserFeedback
, usecaptureFeedback
instead. - Deprecated
Hub.captureUserFeedback
, usecaptureFeedback
instead. - Deprecated
SentryClient.captureUserFeedback
, usecaptureFeedback
instead. - Deprecated
SentryUserFeedback
, useSentryFeedback
instead.
- Deprecated
-
Add
SentryFeedbackWidget
(#2240)Navigator.push( context, MaterialPageRoute( builder: (context) => SentryFeedbackWidget(associatedEventId: id), fullscreenDialog: true, ), );
Enhancements
- Use native spotlight integrations on Flutter Android, iOS, macOS (#2285)
- Improve app start integration (#2266)
- Only store slow and frozen frames for frame delay calculation (#2337)
- Add ReplayIntegration to the integrations list on events when replay is enabled. (#2349)
Fixes
- App lag with frame tracking enabled when span finishes after a long time (#2311)
- Only start frame tracking if we receive valid display refresh data (#2307)
- Rounding error used on frames.total and reject frame measurements if frames.total is less than frames.slow or frames.frozen (#2308)
- iOS replay integration when only
onErrorSampleRate
is specified (#2306) - Fix TTID timing issue (#2326)
- Start missing TTFD for root screen transaction (#2332)
- Match TTFD to TTID end timespan if TTFD is unfinished when user navigates to another screen (#2347)
- Accessing invalid json fields from
fetchNativeAppStart
should return null (#2340) - Error when calling
SentryFlutter.reportFullyDisplayed()
twice (#2339) - TTFD measurements should only be added for successful TTFD spans (#2348)
Deprecate
- Metrics API (#2312)
Dependencies
8.9.0 (Stable)
Features
-
Session replay Alpha for Android and iOS (#2208, #2269, #2236, #2275, #2270).
To try out replay, you can set following options, now available in Beta to organizations Free, Team and Business (except Enterprise, talk to you sales person)):await SentryFlutter.init( (options) { ... options.experimental.replay.sessionSampleRate = 1.0; options.experimental.replay.onErrorSampleRate = 1.0; }, appRunner: () => runApp(MyApp()), );
-
Support allowUrls and denyUrls for Flutter Web (#2227)
await SentryFlutter.init( (options) { ... options.allowUrls = ["^https://sentry.com.*\$", "my-custom-domain"]; options.denyUrls = ["^.*ends-with-this\$", "denied-url"]; }, appRunner: () => runApp(MyApp()), );
-
Collect touch breadcrumbs for all buttons, not just those with
key
specified. (#2242) -
Add
enableDartSymbolication
option to Sentry.init() for Flutter iOS, macOS and Android (#2256)- This flag enables symbolication of Dart stack traces when native debug images are not available.
- Useful when using Sentry.init() instead of SentryFlutter.init() in Flutter projects for example due to size limitations.
true
by default but automatically set tofalse
when using SentryFlutter.init() because the SentryFlutter fetches debug images from the native SDK integrations.
Dependencies
Fixes
- Only access renderObject if
hasSize
is true (#2263)
8.8.0
Features
- Add
SentryFlutter.nativeCrash()
using MethodChannels for Android and iOS (#2239)- This can be used to test if native crash reporting works
- Add
ignoreRoutes
parameter toSentryNavigatorObserver
. (#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.
SentryNavigatorObserver(ignoreRoutes: ["/ignoreThisRoute"]),
Improvements
- Debouncing of SentryWidgetsBindingObserver.didChangeMetrics with delay of 100ms. (#2232)
Dependencies
8.8.0-alpha.1
Features
- iOS Session Replay Alpha (#2209)
- Android replay touch tracking support (#2228)
- Add
ignoreRoutes
parameter toSentryNavigatorObserver
. (#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.
SentryNavigatorObserver(ignoreRoutes: ["/ignoreThisRoute"]),
Dependencies
8.7.0
Warning
Due to a bug (getsentry/sentry-cocoa#4280) in sentry-cocoa 8.33.0
used in this release, it is required to upgrade to 8.8.0 or newer for Flutter projects. If you keep using 8.7.0
in a Flutter project, your build will fail because sentry-cocoa 8.33.0
has been deprecated.
Features
- Add support for span level measurements. (#2214)
- Add
ignoreTransactions
andignoreErrors
to options (#2207)await SentryFlutter.init( (options) { options.dsn = 'https://examplePublicKey@o0.ingest.sentry.io/0'; options.ignoreErrors = ["my-error", "^error-.*\$"]; options.ignoreTransactions = ["my-transaction", "^transaction-.*\$"]; ... }, appRunner: () => runApp(MyApp()), );
- Add proxy support (#2192)
- Configure a
SentryProxy
object and set it onSentryFlutter.init
import 'package:flutter/widgets.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; Future<void> main() async { await SentryFlutter.init( (options) { options.dsn = 'https://example@sentry.io/add-your-dsn-here'; options.proxy = SentryProxy( type: SenryProxyType.http, host: 'localhost', port: 8080, ); }, // Init your App. appRunner: () => runApp(MyApp()), ); }
- Configure a
Improvements
- Deserialize and serialize unknown fields (#2153)
Dependencies
8.6.0
If you want to try Session Replay Android Alpha, see our alpha release: https://github.com/getsentry/sentry-dart/releases/tag/8.6.0-alpha.2
Improvements
- Add error type identifier to improve obfuscated Flutter issue titles (#2170)
- Example: transforms issue titles from
GA
toFlutterError
orminified:nE
toFlutterError
- This is enabled automatically and will change grouping if you already have issues with obfuscated titles
- If you want to disable this feature, set
enableExceptionTypeIdentification
tofalse
in your Sentry options - You can add your custom exception identifier if there are exceptions that we do not identify out of the box
- Example: transforms issue titles from
// How to add your own custom exception identifier
class MyCustomExceptionIdentifier implements ExceptionIdentifier {
@override
String? identifyType(Exception exception) {
if (exception is MyCustomException) {
return 'MyCustomException';
}
if (exception is MyOtherCustomException) {
return 'MyOtherCustomException';
}
return null;
}
}
SentryFlutter.init((options) =>
options..prependExceptionTypeIdentifier(MyCustomExceptionIdentifier()));
Deprecated
- Deprecate
enableTracing
(#2199)- The
enableTracing
option has been deprecated and will be removed in the next major version. We recommend removing it
in favor of thetracesSampleRate
andtracesSampler
options. If you want to enable performance monitoring, please set
thetracesSampleRate
to a sample rate of your choice, or provide a sampling function astracesSampler
option
instead. If you want to disable performance monitoring, remove thetracesSampler
andtracesSampleRate
options.
- The