Monitor crash rates, ANR, startup times, rendering, battery, and memory. Use --threshold for CI quality gates.
gpc vitals <subcommand> [options]Commands
| Command | Description |
|---|---|
vitals overview | Dashboard summary of all vital metrics |
vitals crashes | Query crash rate metrics |
vitals anr | Query ANR rate metrics |
vitals startup | Query slow startup metrics |
vitals rendering | Query slow rendering metrics |
vitals battery | Query excessive wakeup metrics |
vitals wakeup | Alias for vitals battery |
vitals memory | Query stuck wakelock metrics |
vitals lmk | Query low-memory killer metrics |
vitals memory-rss | Query anonymous RSS and swap memory |
vitals memory-bitmap | Query bitmap memory usage |
vitals error-count | Query error report count metrics |
vitals errors search | Search error issues and reports |
vitals compare | Compare metric trend across periods |
Reporting API Required
Vitals commands use the Google Play Developer Reporting API, which must be enabled separately in your GCP project. If the API is not enabled, or the service account cannot read this app's vitals, vitals commands fail with exit code 4 and a hint to enable the API. They never report "no data" in its place, so a --threshold gate cannot pass without reading a metric. For the same reason, a --threshold run that returns no data (wrong --app, data lag, an app with no traffic) exits 6 with THRESHOLD_NO_DATA. Other commands are unaffected.
Enable it at: https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com
Automatic freshness clamping (v0.9.70+)
Google's vitals data typically lags 3-4 days behind real-time. GPC automatically queries the freshness endpoint for each metric set and clamps the date range to avoid 400 INVALID_ARGUMENT errors. No configuration needed.
Shared Options
The metric commands (crashes, anr, startup, rendering, battery, memory, lmk, memory-rss, memory-bitmap, and error-count) share these options:
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | Threshold value for CI alerting (exit code 6 if breached) |
Rate metrics (crashes, anr, startup, rendering, battery, memory, wakeup, lmk) take the fraction Google reports, not a percentage: 2% is --threshold 0.02, 1.09% is 0.0109, 0.47% is 0.0047. A rate can never exceed 1, so a threshold of 1 or more is rejected with THRESHOLD_INVALID (exit 2). error-count is a count and memory-rss / memory-bitmap are sizes, so those take their value as-is.
The gate compares the worst value of the most recent day. Startup results have one row per start type (cold, warm, hot) and error counts one per report type, so the worst of those is checked. With --dim, every value of that dimension is a separate row too, so --dim deviceModel --threshold 0.02 fails if any single device model is over 2%, including one with very few users.
Valid dimensions include apiLevel, versionCode, deviceModel, deviceType, countryCode, deviceRamBucket, deviceBrand, GPU/CPU/SoC details, screen size and density, processName, and appState. Google supports different subsets for each metric set.
vitals overview
Dashboard summary aggregating all vital metrics into a single view.
Synopsis
gpc vitals overviewOptions
No command-specific options. Uses global --app flag.
Example
gpc vitals overview --app com.example.myappThe table shows each metric's latest value and how many daily data points came back. With --json, each metric holds Google's daily rows, and any metric that could not be read is listed under unavailable:
{
"crashRate": [{ "startTime": { "year": 2026, "month": 10, "day": 6 }, "metrics": [...] }],
"anrRate": [...],
"slowStartRate": [...],
"unavailable": [
{
"metric": "slowRenderingRate",
"code": "API_METRIC_GAMES_ONLY",
"reason": "Only available for apps categorised as games."
}
]
}2
3
4
5
6
7
8
9
10
11
12
A metric that fails is named on stderr and listed in unavailable. If every metric fails (for example, the Reporting API is off or the service account has no access), the command exits 4 instead of printing an empty result.
vitals crashes
Query crash rate metrics, optionally grouped by dimension.
Synopsis
gpc vitals crashes [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | Crash rate threshold as a fraction, e.g. 0.02 for 2% (exit code 6 if breached) |
Example
Query crash rate:
gpc vitals crashes --app com.example.myappQuery crash rate by version code:
gpc vitals crashes --app com.example.myapp --dim versionCode --days 30CI gating with threshold:
gpc vitals crashes --app com.example.myapp --threshold 0.02If the crash rate exceeds 2% (0.02), the command exits with code 6:
✗ Threshold breached: 0.024 > 0.02Use in CI pipelines:
- name: Check crash rate
run: gpc vitals crashes --app com.example.myapp --threshold 0.022
vitals anr
Query ANR (Application Not Responding) rate metrics.
Synopsis
gpc vitals anr [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | ANR rate threshold as a fraction, e.g. 0.0047 for 0.47% (exit code 6 if breached) |
Example
gpc vitals anr --app com.example.myapp --threshold 0.005Group by device model:
gpc vitals anr --app com.example.myapp --dim deviceModel --days 14vitals startup
Query cold and warm startup time metrics.
Google requires the start type (cold, warm, hot) on every startup query, so results always include a startType column. --dim adds a second grouping, e.g. --dim versionCode gives one row per start type and version. (Fixed in v1.0.0-rc.2; rc.1 dropped the start type when --dim was set.)
Synopsis
gpc vitals startup [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | Slow start rate threshold as a fraction, e.g. 0.05 for 5% (exit code 6 if breached) |
Example
gpc vitals startup --app com.example.myapp --days 7vitals rendering
Query slow rendering (frame rate) metrics.
Games only
Google's Play Developer Reporting API serves slow-rendering metrics only for apps categorised as games. For other apps the command exits 4 with API_METRIC_GAMES_ONLY (Google's 403 PERMISSION_DENIED: slowRenderingRateMetricSet resource is only accessible to games). That is expected; it's not a credentials problem. vitals overview and gpc status skip slow rendering for non-game apps.
Synopsis
gpc vitals rendering [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | Slow rendering rate threshold as a fraction, e.g. 0.1 for 10% (exit code 6 if breached) |
Example
gpc vitals rendering --app com.example.myapp --dim apiLevelvitals battery
Query excessive wakeup metrics (battery impact). Also available as vitals wakeup.
Synopsis
gpc vitals battery [options]
gpc vitals wakeup [options] # alias2
Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | Excessive wakeup rate threshold as a fraction (exit code 6 if breached) |
Example
gpc vitals battery --app com.example.myapp --threshold 0.01vitals memory
Query stuck background wakelock metrics (memory/battery impact).
Synopsis
gpc vitals memory [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | Stuck wakelock rate threshold as a fraction, e.g. 0.007 for 0.7% (exit code 6 if breached) |
Example
gpc vitals memory --app com.example.myapp --days 30vitals lmk
Query low-memory killer (LMK) rate metrics. Tracks how often the system kills your app under memory pressure. Enforces DAILY aggregation as required by the API.
Behavior change in v0.9.58 (corrected in v0.9.59)
Before v0.9.58, vitals lmk was a silent alias of vitals memory and returned stuck-background-wakelock data, not LMK data. v0.9.58 attempted to fix this but shipped with the wrong endpoint identifier (lowMemoryKillerRateMetricSet, which doesn't exist) and 404'd. v0.9.59 is the working fix: it queries lmkRateMetricSet and returns the correct LMK metrics (userPerceivedLmkRate, weighted variants, distinctUsers). If you were building dashboards or CI thresholds against pre-v0.9.59 output, expect different values.
Synopsis
gpc vitals lmk [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | Group by dimension | ||
--days | number | Number of days to query | ||
--threshold | number | LMK rate threshold as a fraction, e.g. 0.03 for 3% (exit code 6 if breached) |
Example
gpc vitals lmk --app com.example.myapp --days 30 --threshold 0.01vitals memory-rss
Query the 50th, 75th, 90th, 95th, and 99th percentiles of anonymous RSS plus swap memory usage. This is one of the dynamic-memory signals Google uses for its February 2027 app-quality requirements. The Reporting API supports daily aggregation only. --threshold evaluates the P90 metric used by Google's requirement.
gpc vitals memory-rss --app com.example.myapp --days 30
gpc vitals memory-rss --app com.example.myapp --dim deviceRamBucket
gpc vitals memory-rss --app com.example.myapp --dim appState2
3
vitals memory-bitmap
Query the 50th, 75th, 90th, 95th, and 99th percentiles of bitmap memory usage. The Reporting API supports daily aggregation only. --threshold evaluates the P90 metric used by Google's requirement.
gpc vitals memory-bitmap --app com.example.myapp --days 30
gpc vitals memory-bitmap --app com.example.myapp --dim deviceModel2
vitals error-count
Query error report count metrics. Broken down by reportType dimension (auto-included).
Synopsis
gpc vitals error-count [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--dim | string | reportType | Group by dimension | |
--days | number | Number of days to query | ||
--threshold | number | Error report count threshold (exit code 6 if breached) |
Example
gpc vitals error-count --app com.example.myapp --days 7vitals errors search
Search error issues and reports across all error types.
Synopsis
gpc vitals errors search [options]Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--filter | string | Filter expression | ||
--max | number | Maximum results |
Example
Search all errors:
gpc vitals errors search --app com.example.myappSearch with filter and limit:
gpc vitals errors search \
--app com.example.myapp \
--filter "NullPointerException" \
--max 202
3
4
vitals compare
Compare a vitals metric between the current period and the previous period of the same length.
Synopsis
gpc vitals compare <metric> [options]The <metric> argument accepts: crashes, anr, startup, rendering, battery, memory, wakeup, lmk, error-count.
Options
| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--days | number | 7 | Period length in days |
Example
Compare crash rate this week vs last week:
gpc vitals compare crashes --app com.example.myapp --days 7{
"metric": "crashRateMetricSet",
"currentPeriod": { "start": "2026-03-02", "end": "2026-03-09", "value": 1.2 },
"previousPeriod": { "start": "2026-02-23", "end": "2026-03-02", "value": 1.5 },
"change": -0.3,
"changePercent": -20.0
}2
3
4
5
6
7
Compare ANR rate over 30 days:
gpc vitals compare anr --app com.example.myapp --days 30Related
- anomalies -- Automatic anomaly detection across all vitals metrics
- reviews -- User feedback monitoring
- CI/CD Vitals Gates -- Automated quality gates
- watch -- Real-time rollout monitoring with multi-metric vitals and auto-actions
- Exit Codes -- Exit code 6 for threshold breach
