Skip to content

Releases: getsentry/sentry-dart

8.11.0-beta.2

02 Dec 17:40
562172b
Compare
Choose a tag to compare
8.11.0-beta.2 Pre-release
Pre-release

Features

  • Support for screenshot PII content masking (#2361)
    By default, masking is enabled for SessionReplay. To also enable it for screenshots captured with events, you can specify options.experimental.privacy:
    await SentryFlutter.init(
      (options) {
        ...
        // the defaults are:
        options.experimental.privacy.maskAllText = true;
        options.experimental.privacy.maskAllImages = true;
        options.experimental.privacy.maskAssetImages = false;
        // you cal also set up custom masking, for example:
        options.experimental.privacy.mask<WebView>();
      },
      appRunner: () => runApp(MyApp()),
    );
    Actually, just accessing this field will cause it to be initialized with the default settings to mask all text and images:
    await SentryFlutter.init(
      (options) {
        ...
        // this has a side-effect of creating the default privacy configuration, thus enabling Screenshot masking:
        options.experimental.privacy;
      },
      appRunner: () => runApp(MyApp()),
    );
  • Linux native error & obfuscation support (#2431)
  • Improve Device context on plain Dart and Flutter desktop apps (#2441)
  • Add debounce to capturing screenshots (#2368)
    • Per default, screenshots are debounced for 2 seconds.
    • If you need more granular screenshots, you can opt out of debouncing:
    await SentryFlutter.init((options) {
      options.beforeCaptureScreenshot = (event, hint, debounce) {
        if (debounce) {
          return true; // Capture screenshot even if the SDK wants to debounce it.
        } else {
          // check event and hint
          ...
        }
      };
    });
    • Replace deprecated BeforeScreenshotCallback with new BeforeCaptureCallback.

Fixes

  • Catch errors thrown during handleBeginFrame and handleDrawFrame (#2446)
  • OS & device contexts missing on Windows (#2439)
  • Native iOS/macOS SDK session didn't start after Flutter hot-restart (#2452)
  • Kotlin 2.1.0 compatibility on Android, bump Kotlin language version from 1.4 to 1.6 (#2456)

Dependencies

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 (Stable)

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://[email protected]/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://[email protected]/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