These pages show Cloud's URLs. Sign in on Hosted and they show your server's.

The App performance dashboard

How the app starts, how its frames build and raster, which screens are slow or busy, and where people are frustrated.

Who it is for: The engineers tuning how the app feels: startup, frames, slow screens and frustrated taps.

Open it from Dashboards in the Observatory: choose App performance. 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.

[TODO: screenshot of the App performance dashboard over the last 24 hours, every filter All: Overview, Frames and Screens]

Overview

Cold start (p75)

Cold start time at the 75th percentile. Keep it under 3 s; Google Play flags cold starts of 5 s or more.

  • How it is computed: The 75th percentile of flutter.app.startup.duration for cold starts (app.start.type cold). 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 the Metric screen on flutter.app.startup.duration.

Frame build (p95)

The UI thread's share of a frame: build, layout and paint recording, at the 95th percentile. The 60 Hz budget is 16.7 ms; a frame past 33 ms takes two.

  • How it is computed: The 95th percentile of flutter.frame.build. One figure for the whole picked range.
  • Better: Lower is better.
  • Colors: The figure turns amber above 16 ms and red above 33 ms.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on flutter.frame.build.

Janky frames

Dropped frames, of all frames built. Keep it under 5%; at 10% the app feels broken.

  • How it is computed: flutter.frame.dropped divided by the number of flutter.frame.build samples, 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, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on flutter.frame.dropped.

Severe and frozen frames

Frames well past the vsync budget, of all frames built.

  • How it is computed: flutter.frame.dropped where flutter.frame.severity is severe or frozen, divided by the number of flutter.frame.build samples, as a percent. One figure for the whole picked range.
  • Better: Lower is better.
  • Colors: The figure turns amber above 1% and red above 3%.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on flutter.frame.dropped.

UI hangs

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, every severity. 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 the Metric screen on flutter.anr.events.

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.usage from Flutter app processes (those that carry flutter.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.

Frames

Frame build (p95) over time

Frame build time at the 95th percentile, each step.

  • How it is computed: The 95th percentile of flutter.frame.build. 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.build.

Frame raster (p95) over time

The raster thread's share of a frame at the 95th percentile, each step.

  • How it is computed: The 95th percentile of flutter.frame.raster. 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.raster.

Dropped frames per minute by screen

The six screens dropping most, each step.

  • How it is computed: The per-minute 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.

Dropped frames by severity

Mild, severe or frozen: by how much the frame missed its budget.

  • How it is computed: flutter.frame.dropped, counted per flutter.frame.severity. A ranked list, each figure for the whole picked range.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on flutter.frame.dropped.

Frames missing their vsync deadline

Frames that missed their vsync deadline: each device's latest count, summed.

  • How it is computed: flutter.vsync.deadline_miss_count, summed across devices. 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 the Metric screen on flutter.vsync.deadline_miss_count.

Screens

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 per screen (app.screen.name), the top ten. A ranked list, each figure for the whole picked range.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on flutter.navigation.duration.

Most visited screens

Screen views in this range, one each time a screen became current.

  • How it is computed: Log records with event.name dartastic.screen.view, counted per screen (the record's app.screen.name), the top ten. A ranked list, each figure for the whole picked range.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens Logs.

Tap to next screen by screen (p75)

From a tap to the screen it opened becoming current.

  • How it is computed: The 75th percentile of dartastic.screen.interaction_to_next_view per screen, the top ten. A ranked list, 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.interaction_to_next_view.

Network settled by screen (p75)

From a screen's start to its last request finishing.

  • How it is computed: The 75th percentile of dartastic.screen.network_settled per screen, the top ten. A ranked list, 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.network_settled.

Startup

Starts by type

Cold, warm and hot starts in this range.

  • How it is computed: The number of flutter.app.startup.duration samples per app.start.type (cold, warm, hot). A ranked list, 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.app.startup.duration.

Cold start (p95) over time

Cold start time at the 95th percentile, each step.

  • How it is computed: The 95th percentile of flutter.app.startup.duration for cold starts. 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.app.startup.duration.

Warm and hot starts (p95) over time

Warm and hot start time at the 95th percentile, each step.

  • How it is computed: The 95th percentile of flutter.app.startup.duration for warm and hot starts together. 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.app.startup.duration.

Interaction

User actions

Taps the app accepted.

  • How it is computed: dartastic.action.count. One figure for the whole picked range.
  • Better: Higher 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, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on dartastic.action.count.

Frustration signals

Rage taps (three or more on one target within a second), dead taps (nothing happened within 3 s) and error taps (an error during the tap or within 100 ms of it).

  • How it is computed: dartastic.frustration.signal.count. 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.
  • Colors: The figure turns amber above 25 and red above 100.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on dartastic.frustration.signal.count.

Frustration by type

Frustration signals by type.

  • How it is computed: dartastic.frustration.signal.count, counted per dartastic.frustration.signal.type. A ranked list, each figure for the whole picked range.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on dartastic.frustration.signal.count.

Frustration by screen

The screens with the most frustration signals.

  • How it is computed: dartastic.frustration.signal.count, counted per screen (app.screen.name), the top ten. A ranked list, each figure for the whole picked range.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on dartastic.frustration.signal.count.

Actions by screen

The screens where people tap most.

  • How it is computed: dartastic.action.count, counted per screen, the top ten. A ranked list, each figure for the whole picked range.
  • Filters: Build, Platform, Service and Screen narrow it.
  • Opens: its title opens the Metric screen on dartastic.action.count.