Performance Metrics for Flutter
Learn how to attach performance metrics to your transactions or spans.
Sentry's SDKs support sending performance metrics data to Sentry. These are numeric values attached to transactions or spans that are aggregated and displayed in Sentry.
If configured, the Flutter SDK automatically collects the following performance metrics:
Sentry supports custom performance measurements on transactions: you define measurements that matter to your application (for example, memory usage, query time, or user action counts) and send them with the transaction from your SDK. They appear in Dashboards, Trace Explorer, and transaction trace detail. You can define up to 10 custom measurements per transaction; any additional ones are truncated. Configure and send them in your SDK; supported platforms:
- Android (version
6.5.0or later) - Apple (version
7.28.0or later) - Dart (version
6.11.0or later) - Flutter (version
6.11.0or later) - Java (version
6.5.0or later) - JavaScript (version
7.0.0or later) - .NET (version
3.23.0or later) - Python (version
1.5.12or later) - React Native (version
4.0.0or later) - Ruby (version
5.8.0or later) - Rails (version
5.8.0or later)
To set a performance measurement, you need to supply the following:
- name (
string) - value (any numeric type -
float,integer, etc.) - unit (
string, defaults to the stringnoneif omitted)
Sentry supports adding arbitrary custom units, but we recommend using one of the supported units listed below.
Adding custom measurements is supported in Sentry's Dart/Flutter SDK version 6.11.0 and above.
- Transaction mode: Use
setMeasurementon the active span. - Stream mode: There's no dedicated measurement API (and no public way to fetch the active span), so record the values as attributes on a span you create.
To use the Transaction Mode tab, set options.traceLifecycle = SentryTraceLifecycle.static during SDK initialization.
import 'package:sentry/sentry.dart';
await Sentry.startSpan('my-operation', (span) async {
// Record custom measurements as span attributes.
span.setAttribute('memoryUsed', SentryAttribute.int(123));
span.setAttribute('ui.footerComponent.render', SentryAttribute.double(1.3));
span.setAttribute('localStorageRead', SentryAttribute.int(4));
});
import 'package:sentry/sentry.dart';
await Sentry.startSpan('my-operation', (span) async {
// Record custom measurements as span attributes.
span.setAttribute('memoryUsed', SentryAttribute.int(123));
span.setAttribute('ui.footerComponent.render', SentryAttribute.double(1.3));
span.setAttribute('localStorageRead', SentryAttribute.int(4));
});
import 'package:sentry/sentry.dart';
final transaction = Sentry.getSpan();
// Record amount of memory used
transaction?.setMeasurement('memoryUsed', 123,
unit: SentryMeasurementUnit.byte);
// Record time when Footer component renders on page
transaction?.setMeasurement('ui.footerComponent.render', 1.3,
unit: SentryMeasurementUnit.second);
// Record amount of times localStorage was read
transaction?.setMeasurement('localStorageRead', 4);
Currently, unit conversion is only supported once the data has already been stored. This means that, for example, ('myMeasurement', 60, 'second') and ('myMeasurement', 3, 'minute') would not be aggregated, but rather stored as two separate measurements. To avoid this, make sure to use a consistent unit when recording a custom measurement.
Units augment measurement values by giving meaning to what otherwise might be abstract numbers. Adding units also allows Sentry to offer controls - unit conversions, filters, and so on - based on those units. For values that are unitless, you can supply an empty string or none.
nanosecondmicrosecondmillisecondsecondminutehourdayweek
bitbytekilobytekibibytemegabytemebibytegigabytegibibyteterabytetebibytepetabytepebibyteexabyteexbibyte
ratiopercent
If you want to explore further, you can find details about supported units in our event ingestion documentation.
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").