The Flutter App Health dashboard
The whole health of a Flutter app on one board: crash-free sessions, startup, frames, memory, hangs, jank attribution, releases, exits, web vitals, flaky requests, device power and screen engagement.
Who it is for: The engineers who own a Flutter app's quality: find the screen, build or device that hurts, then open the panel's screen for the detail.
Open it from Dashboards in the Observatory: choose Flutter App Health. It is a built-in board, so it is read-only; Save a copy makes one you can change. How every panel reads the range, its colors and its empty states is on Reading a board.
The toolbar: the filters Build, Platform, Service and Screen, each All until you pick a value, and the time range. Each menu lists the values flutter.frame.build carries in the range. Each panel below names the filters that narrow it.
Overview
Crash-free sessions
The share of ended sessions that did not end in a crash. Abnormal ends are shown apart and do not count against it. It is a session figure, not a count of crashes: the Crashes list counts crashes. Keep it above 99.5%; below 99.0% is an incident.
- How it is computed: Crash-free sessions = 1 − crashed sessions / ended sessions, as a percent, the way Sentry counts it. Both come from
flutter.session.count: an ended session is one whosesession.statusis ok, errored, unhandled, crashed or abnormal, and only crashed counts against the figure. A range whose sessions all ended without a crash reads 100%. One figure for the whole picked range. - Better: Higher is better.
- Colors: The figure turns amber below 99.5% and red below 99%.
- No session ended: when no session ended in the range, it shows this instead of a figure: No session end recorded in this range, so crash-free sessions can't be computed.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.session.count.
Cold start (p95)
Time to initial display for cold starts, from the AppStart span. Keep it under 3 s; Google Play flags cold starts of 5 s or more.
- How it is computed: The 95th percentile duration of spans named
AppStartwithapp.start.typecold. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 3 s and red above 5 s.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Janky frames
Dropped frames, of all frames built. Keep it under 5%; at 10% the app feels broken.
- How it is computed:
flutter.frame.droppeddivided by the number offlutter.frame.buildsamples, as a percent. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 5% and red above 10%.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
Frozen frames
Frames dropped at frozen severity (700 ms and up), of all frames built. Unhealthy past 0.1%.
- How it is computed:
flutter.frame.droppedwhereflutter.frame.severityis frozen, divided by the number offlutter.frame.buildsamples, as a percent. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 0.1% and red above 1%.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
ANR exit rate
ANR exits per app start. Google Play's bad-behavior line is 0.47%.
- How it is computed:
dartastic.app.exit.countwhereapp.exit.reasonis anr, divided by the number ofAppStartspans, as a percent. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 0.24% and red above 0.47%.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.app.exit.count.
Each build against the fleet
Every build of the service, one row each, whatever the Build filter: the cheapest regression detector on the page.
- How it is computed: App starts: the number of
AppStartspans per build (app.build_id), the ten builds with the most. Then one column per figure, each read per build: Crash-free sessions (1 − crashed sessions / ended sessions), Cold start p95 (the 95th percentile of coldAppStartspans), Janky frames (dropped frames of frames built, as a percent) and ANR exits (exits whoseapp.exit.reasonis anr). A table, every figure for the whole picked range. - Filters: Platform and Service narrow it; Build and Screen do not.
- Opens: its title opens Traces.
Worst screens
Screens are the services of a mobile app. Worst first, by dropped frames per minute.
- How it is computed: Dropped per minute: the per-minute rate of
flutter.frame.droppedper screen (app.screen.name), the ten screens with the most. Severe and frozen per minute: the same for frames of severity severe or frozen. Time on screen p95: the 95th percentile offlutter.navigation.duration. UI hangs: log records withevent.namedartastic.app.anr. Dwell p50: the median ofdartastic.screen.time_spent. Tap to next view p50: the median ofdartastic.screen.interaction_to_next_view. A table, every figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
Frames and rendering
Dropped frames per second by screen
How many frames each screen drops per second.
- How it is computed: The per-second rate of
flutter.frame.dropped, one line per screen (app.screen.name). Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
Frozen frames per second by screen
Frozen frames per second on each screen. Frozen is a frame of 700 ms and up: the user feels these as freezes.
- How it is computed: The per-second rate of
flutter.frame.droppedwhereflutter.frame.severityis frozen, one line per screen. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
Frame build p50, p95 and p99
Where Flutter spends per-frame time on the UI thread: widget builds, layout, paint. The dashed line is the 60 Hz frame budget.
- How it is computed: The 50th, 95th and 99th percentiles of
flutter.frame.build, one line each. Lines, one point per step across the picked range. - Colors: A dashed line marks 16 ms (warn).
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.frame.build.
Frame raster p50, p95 and p99
The GPU side: long raster times point at heavy paint or shaders. The dashed line is the frame budget.
- How it is computed: The 50th, 95th and 99th percentiles of
flutter.frame.raster, one line each. Lines, one point per step across the picked range. - Colors: A dashed line marks 16 ms (warn).
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.frame.raster.
Memory
Memory usage
The app process's resident memory, averaged across devices. Healthy under 200 MB; OOM-kill risk grows past 400 MB.
- How it is computed: The average of
process.memory.usagefrom Flutter app processes (those that carryflutter.build.mode); a server process never counts here. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 200 MB and red above 400 MB.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
process.memory.usage.
Native heap
Bytes the Dartastic Pro engine itself allocated: its Rust-side native heap, apart from the Dart heap and the process RSS.
- How it is computed: The average of
dartastic.process.runtime.dart.native_heap.allocated. One figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.process.runtime.dart.native_heap.allocated.
Native heap over time by build
The same metric over time: slow leaks and step climbs that one value hides.
- How it is computed: The average of
dartastic.process.runtime.dart.native_heap.allocated, one line per build. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.process.runtime.dart.native_heap.allocated.
Navigation and responsiveness
Time on screen by route (p95)
How long a route stayed up, from its push to the pop or replace that ended it. A route never popped (often the first screen) is not in it.
- How it is computed: The 95th percentile of
flutter.navigation.duration, one line per screen (app.screen.name). Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.navigation.duration.
UI hangs by severity
UI hangs, one bar per severity. A UI hang is a UI-thread hang the watchdog reported. Info is noticeable, mild is one the user feels, severe is long enough that the OS may offer to close the app.
- How it is computed:
flutter.anr.events, counted perflutter.anr.severity. Ranked bars, each figure for the whole picked range. - Colors: A bar turns amber above 1 and red above 5.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.anr.events.
UI hangs per second by screen and severity
Each hang's event, by the screen it carries. A UI hang is a UI-thread hang the watchdog reported. Info is noticeable, mild is one the user feels, severe is long enough that the OS may offer to close the app.
- How it is computed: The per-second rate of log records with
event.namedartastic.app.anr, one line per screen (the record'sapp.screen.name) andflutter.anr.severity. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens Logs.
UI hang duration p50, p95 and p99
How long UI hangs last: one sample per hang, at its worst. A UI hang is a UI-thread hang the watchdog reported. Info is noticeable, mild is one the user feels, severe is long enough that the OS may offer to close the app.
- How it is computed: The 50th, 95th and 99th percentiles of
flutter.anr.duration, one line each. Lines, one point per step across the picked range. - Colors: A dashed line marks 5 s (crit).
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.anr.duration.
Worst vsync deadline miss
The worst frame deadline miss each report, from the native engine's monotonic clock.
- How it is computed: The highest value of
flutter.vsync.deadline_miss_max. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.vsync.deadline_miss_max.
Frames late for vsync per minute
Frames that missed their deadline, across devices. Beside the worst miss, it tells one outlier from frames that are late again and again.
- How it is computed: The per-minute rate of
flutter.vsync.deadline_miss_count, a cumulative counter, across devices. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.vsync.deadline_miss_count.
Jank attribution: which widget ate the frame budget
Attributed frames
Over-budget frames the jank catcher caught while armed. Zero means no jank, or a catcher that never armed.
- How it is computed: The number of spans named
flutter.jank.attributed_frame. One figure for the whole picked range. - Better: Lower is better. Beside the figure, its change from the prior range of the same length: green when it moved the better way, red when it moved the other way.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Named attribution rate
Attributed frames that name a widget your app owns, once the sampled frames were symbolized.
- How it is computed: Spans named
flutter.jank.attributed_framewithdartastic.jank.attribution.app_frame.resolvedtrue, divided by all such spans, as a percent. One figure for the whole picked range. - Better: Higher is better.
- Colors: The figure turns amber below 85% and red below 70%.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Frame overrun (p50)
How far each attributed frame ran past the device's own frame budget: 8.3 ms at 120 Hz, 16.7 ms at 60 Hz. The typical overrun.
- How it is computed: The median (50th percentile) of
dartastic.frame.overrunon spans namedflutter.jank.attributed_frame. The attribute is in seconds; the panel shows milliseconds. One figure for the whole picked range. - Better: Lower is better.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Frame overrun (p95)
How far each attributed frame ran past the device's own frame budget: 8.3 ms at 120 Hz, 16.7 ms at 60 Hz. One frame in twenty ran further past it.
- How it is computed: The 95th percentile of
dartastic.frame.overrunon spans namedflutter.jank.attributed_frame. The attribute is in seconds; the panel shows milliseconds. One figure for the whole picked range. - Better: Lower is better.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Top jank suspects by attributed frames
The app functions the attributed frames point at most. Named once the build's symbols are published; until then nothing shows.
- How it is computed: Spans named
flutter.jank.attributed_framethat carrydartastic.jank.attribution.app_frame.function, counted per function, the top ten. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Attributed frames per minute by screen
Which screen is jankiest in production.
- How it is computed: The per-minute rate of
flutter.jank.attributed_framespans, one line per screen (the span'sapp.screen.name). Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens Traces.
Jank catcher arm and disarm events
The catcher's state as the engine reports it: one record per arm or disarm.
- How it is computed: Log records with
event.namedartastic.jank.catcher.state, counted bydartastic.jank.catcher.armed. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Jank catcher transitions by reason
Why the catcher changed state: forced on, jank crossed the limit, jank subsided, or the arming budget ran out. Open Logs for each one.
- How it is computed: Log records with
event.namedartastic.jank.catcher.state, counted bydartastic.jank.catcher.reason. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Release and version health
Crash-free sessions by build
Crash-free sessions for each build: the release-health headline. Abnormal ends are shown apart.
- How it is computed: Crash-free sessions per build (
app.build_id): 1 − crashed sessions / ended sessions, as a percent, fromflutter.session.count. Only crashed counts against it. The top eight builds. Ranked bars, each figure for the whole picked range. - Colors: A bar turns amber below 99.5% and red below 99%.
- No session ended: when no session ended in the range, it shows this instead of a figure: No session end recorded in this range, so crash-free sessions by build can't be computed.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.session.count.
App starts by build
App starts per build. After a release, the new build's bar grows while the old one's shrinks.
- How it is computed: The number of
AppStartspans per build, the top eight. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Session duration p50 and p95 by build
Clean sessions' wall time, per build. A new release dragging the median down is an engagement regression.
- How it is computed: The 50th and 95th percentiles of
flutter.session.durationfor sessions whosesession.statusis ok or errored, one line per percentile and build. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.session.duration.
Startup
Cold start p50 and p95 by build
Time to initial display, process start to first frame, cold starts only.
- How it is computed: The 50th and 95th percentiles of the duration of
AppStartspans withapp.start.typecold, one line per percentile and build. Lines, one point per step across the picked range. - Colors: Dashed lines mark 3 s (warn) and 5 s (crit).
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Startup mix
Starts by type. Cold follows an install or a force-quit; rising warm means users come back after a while, or the app relaunches into a running process.
- How it is computed: The number of
AppStartspans perapp.start.type. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Warm and hot start p95 by build
Warm is a return after 1 s or more away, or a launch into a process already running; hot is a return in under 1 s. Each is timed to its first frame, and both should be well under cold.
- How it is computed: The 95th percentile of the duration of
AppStartspans, one line for warm and one for hot starts, per build. Lines, one point per step across the picked range. - Colors: Dashed lines mark 1 s (warn) and 2 s (crit).
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
App exits and MetricKit
Cold start p95 by build on iOS, from MetricKit
iOS only: Apple's own launch time over every real user's process, to the first draw, beside the SDK's span. Prewarmed launches are left out. Every platform's cold start is "Cold start p50 and p95 by build" under Startup.
- How it is computed: The 95th percentile of
dartastic.app.launch.durationfor cold launches withoutapp.start.optimized, one line per build. Each point sits at MetricKit's delivery, usually a day after the window it measures. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.app.launch.duration.
App exit reasons by source
MetricKit's exit metrics and Android's ApplicationExitInfo, by reason.
- How it is computed:
dartastic.app.exit.count, counted perapp.exit.reasonanddartastic.source, the top twelve. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.app.exit.count.
App hang time p95 and p99 by build, from MetricKit
Every hang the OS noticed, finer than the ANR watchdog. Each point sits at MetricKit's delivery, usually a day after the window it measures.
- How it is computed: The 95th and 99th percentiles of
dartastic.app.hang.durationwheredartastic.sourceis metrickit, one line per percentile and build. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.app.hang.duration.
Network and device reliability
ANR exits per second by build
Exits the OS made for an ANR: Android through ApplicationExitInfo, iOS through MetricKit. An exit counts at the app's next start, not when it ended; on iOS, at MetricKit's delivery, usually a day later.
- How it is computed: The per-second rate of
dartastic.app.exit.countwhereapp.exit.reasonis anr, one line per build. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.app.exit.count.
Memory pressure level on Android
The highest onTrimMemory level each step, from devices below Android 14: newer Android never sends these. There, read Low-memory exits.
- How it is computed: The highest value of
memory_pressure.levelwheredartastic.sourceis android: 5 to 15 while the app runs (15, running critical, is the last signal before an out-of-memory kill), 60 and 80 while it waits cached in the background. UI hidden (20) and Background (40) are the app leaving the screen, not pressure, and are not recorded. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
memory_pressure.level.
Web vitals
First contentful paint (p75)
First contentful paint at the 75th percentile, from your Flutter web app.
- How it is computed: The 75th percentile of
flutter.experience.fcp. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 1.8 s and red above 3 s.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.fcp.
Largest contentful paint (p75)
Largest contentful paint at the 75th percentile, from your Flutter web app.
- How it is computed: The 75th percentile of
flutter.experience.lcp. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 2.5 s and red above 4 s.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.lcp.
Interaction to next paint (p75)
Interaction to next paint at the 75th percentile, from your Flutter web app.
- How it is computed: The 75th percentile of
flutter.experience.inp. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 200 ms and red above 500 ms.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.inp.
Time to first byte on the web (p75)
A page load's wait for its first byte, at the 75th percentile, from the browser's navigation timing. Only a web page load has one.
- How it is computed: The 75th percentile of
flutter.experience.ttfb. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 800 ms and red above 1.8 s.
- Web only: it hides while Platform is set, because web reports carry no platform.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.ttfb.
First contentful paint p75 by platform
First contentful paint at the 75th percentile, one line per platform.
- How it is computed: The 75th percentile of
flutter.experience.fcp, one line peros.type. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.fcp.
Largest contentful paint p75 by platform
Largest contentful paint at the 75th percentile, one line per platform.
- How it is computed: The 75th percentile of
flutter.experience.lcp, one line peros.type. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.lcp.
Interaction to next paint p75 by platform
Interaction to next paint at the 75th percentile, one line per platform.
- How it is computed: The 75th percentile of
flutter.experience.inp, one line peros.type. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.inp.
Largest contentful paint by widget
The widgets most often the largest paint, by samples.
- How it is computed: The number of
flutter.experience.lcpsamples perapp.widget.name, the top ten. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.experience.lcp.
Flaky requests
Flaky share of client requests
The share of client requests the SDK judged flaky. The flaky verdict, its reason and the connectivity are attributes of the HTTP client span.
- How it is computed: Client spans with
dartastic.network.flakytrue, divided by all client spans, shown as a percent. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Flaky requests per minute by reason
Flaky requests over time, by the reason the SDK gave.
- How it is computed: The per-minute rate of client spans with
dartastic.network.flakytrue, one line perdartastic.network.flaky.reason. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Client request latency p99, flaky and all
How slow the slowest flaky requests are, next to all client requests.
- How it is computed: Two lines: the 99th percentile duration of client spans with
dartastic.network.flakytrue, and of all client spans. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Flaky requests per minute by connectivity
Which network the flaky requests happened on: wifi, mobile, ethernet, vpn, none, unknown.
- How it is computed: The per-minute rate of client spans with
dartastic.network.flakytrue, one line pernetwork.connectivity. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Device, power and thermal
Devices reporting each battery state
How many devices reported each battery state. Each device counts once, under the state it was in at the end of the step.
- How it is computed: The sum of
dartastic.battery.state, one line per state. The SDK keeps it at 1 for the state a device is in and 0 for the state it left. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.battery.state.
Low-power mode share by platform
The share of battery reports with iOS Low Power Mode or Android Battery Saver on; a device that reports more often weighs more. Per platform, each step: rising during a release means users are rationing your app.
- How it is computed: The average of
dartastic.battery.low_power_mode, shown as a percent, one line peros.type. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.battery.low_power_mode.
Memory pressure events per second by source and level
An OS callback: iOS, or Android below 14. An app can also record its own. On newer Android, read Low-memory exits.
- How it is computed: The per-second rate of
memory_pressure.event, one line perdartastic.sourceanddartastic.memory_pressure.level. Below Android 14, Android labels its callbacksrunning_moderate,running_low,running_critical,moderate,completeandlow_memory; iOS labels its warningios_warning. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
memory_pressure.event.
Thermal state changes per second by platform and state
Thermal state changes over time: nominal, fair, serious, critical or emergency, on iOS and Android alike.
- How it is computed: The per-second rate of
dartastic.thermal.state.event, one line peros.typeanddartastic.thermal.state. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
dartastic.thermal.state.event.
Screen engagement
Screen dwell p50 and p95
Time on a screen before leaving it. Falling dwell on a content screen is disengagement; rising dwell on a form is friction.
- How it is computed: The 50th and 95th percentiles of
dartastic.screen.time_spent, one line each. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.screen.time_spent.
Interaction to next view p50 and p95
From a tap to the next view activating: the navigation counterpart of interaction to next paint.
- How it is computed: The 50th and 95th percentiles of
dartastic.screen.interaction_to_next_view, one line each. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.screen.interaction_to_next_view.
Network settled p50 and p95
From a screen's start until its network activity settles: how long it keeps loading after it appears.
- How it is computed: The 50th and 95th percentiles of
dartastic.screen.network_settled, one line each. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.screen.network_settled.
Average dwell by screen
The engagement map of the app: the average time on each screen.
- How it is computed: The average of
dartastic.screen.time_spentper screen (app.screen.name), the top seven. Ranked bars, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.screen.time_spent.
Actions per second by screen
Where the app is actually used.
- How it is computed: The per-second rate of
dartastic.action.count, one line per screen. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.action.count.
Display refresh rates
The fleet's refresh-rate mix, by frames. A 120 Hz display halves the frame budget.
- How it is computed: The number of
flutter.frame.buildsamples perdartastic.display.refresh_rate. Slices of one whole, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.frame.build.
Webview
Webview page views
Each is one document the in-app webview showed, tied to the app session.
- How it is computed: The number of spans named
dartastic.webview.page. One figure for the whole picked range. - Compared: Beside the figure, its change from the prior range of the same length.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Webview page duration (p75)
How long a webview document stayed the current page.
- How it is computed: The 75th percentile duration of
dartastic.webview.pagespans. One figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Traces.
Webview largest contentful paint (p75)
Largest contentful paint in the in-app webview, at the 75th percentile. Where the platform measures it: Android WebView does, and iOS's WKWebView measures fewer of these, varying by OS version.
- How it is computed: The 75th percentile of
browser.web_vital.valueon the webview's log records (dartastic.telemetry.sourcewebview) whosebrowser.web_vital.nameis lcp. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 2.5 s and red above 4 s.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Webview first contentful paint (p75)
First contentful paint in the in-app webview, at the 75th percentile.
- How it is computed: The 75th percentile of
browser.web_vital.valueon the webview's log records (dartastic.telemetry.sourcewebview) whosebrowser.web_vital.nameis fcp. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 1.8 s and red above 3 s.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Webview interaction to next paint (p75)
Interaction to next paint in the in-app webview, at the 75th percentile. Where the platform measures it: Android WebView does, and iOS's WKWebView measures fewer of these, varying by OS version.
- How it is computed: The 75th percentile of
browser.web_vital.valueon the webview's log records (dartastic.telemetry.sourcewebview) whosebrowser.web_vital.nameis inp. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 200 ms and red above 500 ms.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Webview time to first byte (p75)
Time to first byte in the in-app webview, at the 75th percentile.
- How it is computed: The 75th percentile of
browser.web_vital.valueon the webview's log records (dartastic.telemetry.sourcewebview) whosebrowser.web_vital.nameis ttfb. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 800 ms and red above 1.8 s.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Webview cumulative layout shift (p75)
Cumulative layout shift in the in-app webview, at the 75th percentile: a unitless score of how far the page's content moved under the user. Where the platform measures it: Android WebView does, and iOS's WKWebView measures fewer of these, varying by OS version.
- How it is computed: The 75th percentile of
browser.web_vital.valueon the webview's log records (dartastic.telemetry.sourcewebview) whosebrowser.web_vital.nameis cls. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 0.1 and red above 0.25.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Webview long task duration (p95)
How long a long task held the page's main thread, at the 95th percentile. Where the platform measures it: Android WebView does, and iOS's WKWebView measures fewer of these, varying by OS version.
- How it is computed: The 95th percentile of
dartastic.webview.long_task.duration_mson the log records that carry it. One figure for the whole picked range. - Better: Lower is better.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.
Webview long tasks per minute
Main-thread work over 50 ms the page reported through the bridge, as log records.
- How it is computed: The per-minute rate of log records that carry
dartastic.webview.long_task.duration_ms. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens Logs.