| -- |
| -- Copyright 2022 The Android Open Source Project |
| -- |
| -- Licensed under the Apache License, Version 2.0 (the "License"); |
| -- you may not use this file except in compliance with the License. |
| -- You may obtain a copy of the License at |
| -- |
| -- https://www.apache.org/licenses/LICENSE-2.0 |
| -- |
| -- Unless required by applicable law or agreed to in writing, software |
| -- distributed under the License is distributed on an "AS IS" BASIS, |
| -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| -- See the License for the specific language governing permissions and |
| -- limitations under the License. |
| |
| -- Find all long EventLatency slices > 100ms and also get the |
| -- type of the event stored as 'debug.event' argument. |
| -- In order to group all events |
| -- Note that a long latency event is represented by the ending time |
| -- of an EventLatency slice, i.e. the timestamp of the frame presentation |
| -- that reflects the event. |
| DROP VIEW IF EXISTS long_eventlatency_slice; |
| CREATE VIEW long_eventlatency_slice AS |
| SELECT |
| ts + dur AS ts, |
| dur, |
| id, |
| track_id, |
| EXTRACT_ARG(arg_set_id, 'debug.event') AS event_type |
| FROM slice WHERE name = 'EventLatency' AND dur > 100000000; |
| |
| -- Find the upid of the proccesses where the long latency occur. |
| DROP VIEW IF EXISTS long_latency_with_upid; |
| CREATE VIEW long_latency_with_upid AS |
| SELECT |
| long_eventlatency_slice.ts, |
| long_eventlatency_slice.event_type, |
| process_track.upid |
| FROM long_eventlatency_slice |
| JOIN process_track |
| ON long_eventlatency_slice.track_id = process_track.id; |
| |
| -- Find the name and pid of the processes. |
| -- Long latency events with the same timestamp and from the same process |
| -- are considered one single long latency occurrence. |
| -- If the process name represents a file's pathname, the path part will be |
| -- removed from the display name of the process. |
| DROP VIEW IF EXISTS long_latency_with_process_info; |
| CREATE VIEW long_latency_with_process_info AS |
| SELECT |
| long_latency_with_upid.ts, |
| GROUP_CONCAT(DISTINCT long_latency_with_upid.event_type) AS event_type, |
| REPLACE( |
| process.name, |
| RTRIM( |
| process.name, |
| REPLACE(process.name, '/', '') |
| ), |
| '') AS process_name, |
| process.pid AS process_id |
| FROM long_latency_with_upid |
| JOIN process |
| ON long_latency_with_upid.upid = process.upid |
| GROUP BY ts, process.pid; |
| |
| -- Create the derived event track for long latency. |
| -- All tracks generated from chrome_long_latency_event are |
| -- placed under a track group named 'Long Latency', whose summary |
| -- track is the first track ('All Processes') in chrome_long_latency_event. |
| -- Note that the 'All Processes' track is generated only when there are more |
| -- than one source of long latency events. |
| DROP VIEW IF EXISTS chrome_long_latency_event; |
| CREATE VIEW chrome_long_latency_event AS |
| SELECT |
| 'slice' AS track_type, |
| 'All Processes' AS track_name, |
| ts, |
| 0 AS dur, |
| event_type AS slice_name, |
| 'Long Latency' AS group_name |
| FROM long_latency_with_process_info |
| WHERE (SELECT COUNT(DISTINCT process_id) |
| FROM long_latency_with_process_info) > 1 |
| GROUP BY ts |
| UNION ALL |
| SELECT |
| 'slice' AS track_type, |
| process_name || ' ' || process_id AS track_name, |
| ts, |
| 0 AS dur, |
| event_type AS slice_name, |
| 'Long Latency' AS group_name |
| FROM long_latency_with_process_info |
| GROUP BY ts; |
| |
| -- Create the long latency metric output. |
| DROP VIEW IF EXISTS chrome_long_latency_output; |
| CREATE VIEW chrome_long_latency_output AS |
| SELECT ChromeLongLatency( |
| 'long_latency', ( |
| SELECT RepeatedField( |
| ChromeLongLatency_LongLatency( |
| 'ts', ts, |
| 'event_type', event_type, |
| 'process_name', process_name, |
| 'pid', process_id |
| ) |
| ) |
| FROM long_latency_with_process_info |
| ORDER BY ts |
| ) |
| ); |