From 700b45bbd6a5503652d4984a0798a5bf71916ed2 Mon Sep 17 00:00:00 2001 From: Ryan Zuklie Date: Wed, 1 May 2024 07:38:28 -0700 Subject: Add a safe non-negative dur for battery_stats Change-Id: I8509f06481491e611fe2a0cbe1291ddfa8d0e4f9 --- .../perfetto_sql/stdlib/android/battery_stats.sql | 10 ++++++++-- .../stdlib/android/android_battery_stats_event_slices.out | 8 ++++---- test/trace_processor/diff_tests/stdlib/android/tests.py | 8 ++++---- ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts | 6 +++--- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql b/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql index ff6902916..9431896f1 100644 --- a/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql +++ b/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql @@ -119,8 +119,10 @@ SELECT CREATE PERFETTO VIEW android_battery_stats_state( -- Timestamp in nanoseconds. ts INT, - -- The duration the state was active. + -- The duration the state was active, may be negative for incomplete slices. dur INT, + -- The same as `dur`, but extends to trace end for incomplete slices. + safe_dur INT, -- The name of the counter track. track_name STRING, -- The counter value as a number. @@ -131,6 +133,7 @@ CREATE PERFETTO VIEW android_battery_stats_state( SELECT ts, IFNULL(LEAD(ts) OVER (PARTITION BY name ORDER BY ts) - ts, -1) AS dur, + LEAD(ts, 1, TRACE_END()) OVER (PARTITION BY name ORDER BY ts) - ts AS safe_dur, name AS track_name, CAST(value AS INT64) AS value, android_battery_stats_counter_to_string(name, value) AS value_name @@ -160,8 +163,10 @@ WHERE counter_track.name GLOB 'battery_stats.*'; CREATE PERFETTO VIEW android_battery_stats_event_slices( -- Timestamp in nanoseconds. ts INT, - -- The duration the state was active. + -- The duration the state was active, may be negative for incomplete slices. dur INT, + -- The same as `dur`, but extends to trace end for incomplete slices. + safe_dur INT, -- The name of the counter track. track_name STRING, -- String value. @@ -208,6 +213,7 @@ WITH SELECT ts, IFNULL(end_ts-ts, -1) AS dur, + IFNULL(end_ts, TRACE_END()) - ts AS safe_dur, track_name, str_split(key, '"', 1) AS str_value, CAST(str_split(key, ':', 0) AS INT64) AS int_value diff --git a/test/trace_processor/diff_tests/stdlib/android/android_battery_stats_event_slices.out b/test/trace_processor/diff_tests/stdlib/android/android_battery_stats_event_slices.out index 82cd36c91..fc2247611 100644 --- a/test/trace_processor/diff_tests/stdlib/android/android_battery_stats_event_slices.out +++ b/test/trace_processor/diff_tests/stdlib/android/android_battery_stats_event_slices.out @@ -1,4 +1,4 @@ -"ts","dur","track_name","str_value","int_value" -1000,8000,"battery_stats.top","mail",123 -3000,-1,"battery_stats.job","mail_job",456 -1000,3000,"battery_stats.job","video_job",789 +"ts","dur","safe_dur","track_name","str_value","int_value" +1000,8000,8000,"battery_stats.top","mail",123 +3000,-1,6000,"battery_stats.job","mail_job",456 +1000,3000,3000,"battery_stats.job","video_job",789 diff --git a/test/trace_processor/diff_tests/stdlib/android/tests.py b/test/trace_processor/diff_tests/stdlib/android/tests.py index 9542f22cc..59a8877a9 100644 --- a/test/trace_processor/diff_tests/stdlib/android/tests.py +++ b/test/trace_processor/diff_tests/stdlib/android/tests.py @@ -106,10 +106,10 @@ class AndroidStdlib(TestSuite): ORDER BY ts, track_name; """, out=Csv(""" - "ts","dur","track_name","value","value_name" - 1000,-1,"battery_stats.audio",1,"active" - 1000,3000,"battery_stats.data_conn",13,"4G (LTE)" - 4000,-1,"battery_stats.data_conn",20,"5G (NR)" + "ts","dur","safe_dur","track_name","value","value_name" + 1000,-1,3000,"battery_stats.audio",1,"active" + 1000,3000,3000,"battery_stats.data_conn",13,"4G (LTE)" + 4000,-1,0,"battery_stats.data_conn",20,"5G (NR)" """)) def test_anrs(self): diff --git a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts index 414a6620e..3e1bab057 100644 --- a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts +++ b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts @@ -1144,7 +1144,7 @@ class AndroidLongBatteryTracing implements Plugin { this.addSliceTrack( ctx, name, - `SELECT ts, dur, value_name AS name + `SELECT ts, safe_dur AS dur, value_name AS name FROM android_battery_stats_state WHERE track_name = "${track}"`, groupName, @@ -1165,7 +1165,7 @@ class AndroidLongBatteryTracing implements Plugin { this.addSliceTrack( ctx, name, - `SELECT ts, dur, str_value AS name + `SELECT ts, safe_dur AS dur, str_value AS name FROM android_battery_stats_event_slices WHERE track_name = "${track}"`, groupName, @@ -1201,7 +1201,7 @@ class AndroidLongBatteryTracing implements Plugin { 'Device State: Long wakelocks', `SELECT ts - 60000000000 as ts, - dur + 60000000000 as dur, + safe_dur + 60000000000 as dur, str_value AS name, ifnull( (select package_name from package_list where uid = int_value % 100000), -- cgit v1.2.3 From f9756c6efa06d9b9adbf9ead3da0683b748c34c6 Mon Sep 17 00:00:00 2001 From: Ryan Zuklie Date: Wed, 1 May 2024 07:39:12 -0700 Subject: Interpret nr_state in the cellular connection track Change-Id: I19edf3b1b50c6cdec6c8c49e4dbfc52b3669a4c8 --- .../index.ts | 33 ++++++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts index 3e1bab057..2a22affc5 100644 --- a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts +++ b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts @@ -51,6 +51,33 @@ const DEFAULT_NETWORK = ` end as name from diff where keep is null or keep`; +const RADIO_TRANSPORT_TYPE = ` + create or replace perfetto view radio_transport_data_conn as + select ts, safe_dur AS dur, value_name as data_conn, value AS data_conn_val + from android_battery_stats_state + where track_name = "battery_stats.data_conn"; + + create or replace perfetto view radio_transport_nr_state as + select ts, safe_dur AS dur, value AS nr_state_val + from android_battery_stats_state + where track_name = "battery_stats.nr_state"; + + drop table if exists radio_transport_join; + create virtual table radio_transport_join + using span_left_join(radio_transport_data_conn, radio_transport_nr_state); + + create or replace perfetto view radio_transport as + select + ts, dur, + case data_conn_val + -- On LTE with NR connected is 5G NSA. + when 13 then iif(nr_state_val = 3, '5G (NSA)', data_conn) + -- On NR with NR state present, is 5G SA. + when 20 then iif(nr_state_val is null, '5G (SA or NSA)', '5G (SA)') + else data_conn + end as name + from radio_transport_join;`; + const TETHERING = ` with base as ( select @@ -1236,6 +1263,7 @@ class AndroidLongBatteryTracing implements Plugin { const e = ctx.engine; await e.query(NETWORK_SUMMARY); + await e.query(RADIO_TRANSPORT_TYPE); this.addSliceTrack(ctx, 'Default network', DEFAULT_NETWORK, groupName); @@ -1295,12 +1323,11 @@ class AndroidLongBatteryTracing implements Plugin { groupName, features, ); - this.addBatteryStatsState( + this.addSliceTrack( ctx, 'Cellular connection', - 'battery_stats.data_conn', + `select ts, dur, name from radio_transport`, groupName, - features, ); this.addBatteryStatsState( ctx, -- cgit v1.2.3