Skip to content

Releases: getsentry/sentry-dart

8.11.0-beta.1

21 Nov 16:38
Compare
Choose a tag to compare
8.11.0-beta.1 Pre-release
Pre-release

Features

  • Windows native error & obfuscation support (#2286, #2426)
  • Improve app start measurements by using addTimingsCallback instead of addPostFrameCallback 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 from handleBeginFrame and ending in handleDrawFrame, this is approximately the buildDuration time
    • By default, SentryFlutter.init() automatically initializes SentryWidgetsFlutterBinding through the WidgetsFlutterBindingIntegration
    • If you need to initialize the binding before SentryFlutter.init, use SentryWidgetsFlutterBinding.ensureInitialized instead of WidgetsFlutterBinding.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

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, or captureMessage):
      • SDK creates a synthetic trace using StackTrace.current
      • Internal SDK frames are removed to reduce noise
    • 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

08 Nov 15:09
Compare
Choose a tag to compare

Fixes

  • Android build error when compiling (#2397)

8.10.0

08 Nov 10:55
Compare
Choose a tag to compare

Features

  • Emit transaction.data inside contexts.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() or SentryUnmask() widgets to mask/unmask them, respectively. For example:

    Β SentryUnmask(Text('Not secret at all'));
  • Support captureFeedback (#2230)

    • Deprecated Sentry.captureUserFeedback, use captureFeedback instead.
    • Deprecated Hub.captureUserFeedback, use captureFeedback instead.
    • Deprecated SentryClient.captureUserFeedback, use captureFeedback instead.
    • Deprecated SentryUserFeedback, use SentryFeedback instead.
  • 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,
      ),
    );

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)
    • Fixes pendingTimer during tests (#2103)
    • Fixes transaction slows app start (#2233)
  • 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
    • 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)
    • TTFD measurements should only be added for successful TTFD spans (#2348)
    • Error when calling SentryFlutter.reportFullyDisplayed() twice (#2339)
  • Accessing invalid json fields from fetchNativeAppStart should return null (#2340)

Deprecate

Dependencies

8.10.0-beta.2

16 Oct 12:57
Compare
Choose a tag to compare
8.10.0-beta.2 Pre-release
Pre-release

Fixes

  • Temporarily disable Windows native error & obfuscation support (#2363)

8.10.0-beta.1

15 Oct 12:20
Compare
Choose a tag to compare
8.10.0-beta.1 Pre-release
Pre-release

Features

  • Emit transaction.data inside contexts.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() or SentryUnmask() widgets to mask/unmask them, respectively. For example:

    Β SentryUnmask(Text('Not secret at all'));
  • Support captureFeedback (#2230)

    • Deprecated Sentry.captureUserFeedback, use captureFeedback instead.
    • Deprecated Hub.captureUserFeedback, use captureFeedback instead.
    • Deprecated SentryClient.captureUserFeedback, use captureFeedback instead.
    • Deprecated SentryUserFeedback, use SentryFeedback instead.
  • 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

Dependencies

8.9.0 (Stable)

09 Sep 13:52
a00e005
Compare
Choose a tag to compare

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 to false 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

27 Aug 08:00
Compare
Choose a tag to compare

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 to SentryNavigatorObserver. (#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

13 Aug 15:25
Compare
Choose a tag to compare
8.8.0-alpha.1 Pre-release
Pre-release

Features

  • iOS Session Replay Alpha (#2209)
  • Android replay touch tracking support (#2228)
  • Add ignoreRoutes parameter to SentryNavigatorObserver. (#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

09 Aug 11:46
Compare
Choose a tag to compare

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 and ignoreErrors 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 on SentryFlutter.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()),
      );
    }

Improvements

  • Deserialize and serialize unknown fields (#2153)

Dependencies

8.6.0

01 Aug 13:28
Compare
Choose a tag to compare

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 to FlutterError or minified:nE to FlutterError
    • 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 to false in your Sentry options
    • You can add your custom exception identifier if there are exceptions that we do not identify out of the box
// 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 the tracesSampleRate and tracesSampler options. If you want to enable performance monitoring, please set
      the tracesSampleRate to a sample rate of your choice, or provide a sampling function as tracesSampler option
      instead. If you want to disable performance monitoring, remove the tracesSampler and tracesSampleRate options.

Dependencies