| -- Copyright 2023 The Chromium Authors |
| -- Use of this source code is governed by a BSD-style license that can be |
| -- found in the LICENSE file. |
| |
| -- TODO(b/306300843): The recorded navigation ids are not guaranteed to be |
| -- unique within a trace; they are only guaranteed to be unique within a single |
| -- chrome instance. Chrome instance id needs to be recorded, and used here in |
| -- combination with navigation id to uniquely identify page load metrics. |
| |
| INCLUDE PERFETTO MODULE slices.with_context; |
| |
| CREATE PERFETTO VIEW _fcp_metrics AS |
| SELECT |
| ts, |
| dur, |
| extract_arg(arg_set_id, 'page_load.navigation_id') AS navigation_id, |
| extract_arg(arg_set_id, 'page_load.url') AS url, |
| upid AS browser_upid |
| FROM process_slice |
| WHERE |
| name = 'PageLoadMetrics.NavigationToFirstContentfulPaint'; |
| |
| CREATE PERFETTO FUNCTION _page_load_metrics( |
| event_name STRING |
| ) |
| RETURNS TABLE ( |
| ts TIMESTAMP, |
| dur DURATION, |
| navigation_id LONG, |
| browser_upid LONG |
| ) AS |
| SELECT |
| ts, |
| dur, |
| extract_arg(arg_set_id, 'page_load.navigation_id') AS navigation_id, |
| upid AS browser_upid |
| FROM process_slice |
| WHERE |
| name = $event_name; |
| |
| -- Chrome page loads, including associated high-level metrics and properties. |
| CREATE PERFETTO TABLE chrome_page_loads ( |
| -- ID of the navigation and Chrome browser process; this combination is |
| -- unique to every individual navigation. |
| id LONG, |
| -- ID of the navigation associated with the page load (i.e. the cross-document |
| -- navigation in primary main frame which created this page's main document). |
| -- Also note that navigation_id is specific to a given Chrome browser process, |
| -- and not globally unique. |
| navigation_id LONG, |
| -- Timestamp of the start of navigation. |
| navigation_start_ts TIMESTAMP, |
| -- Duration between the navigation start and the first contentful paint event |
| -- (web.dev/fcp). |
| fcp LONG, |
| -- Timestamp of the first contentful paint. |
| fcp_ts TIMESTAMP, |
| -- Duration between the navigation start and the largest contentful paint event |
| -- (web.dev/lcp). |
| lcp LONG, |
| -- Timestamp of the largest contentful paint. |
| lcp_ts TIMESTAMP, |
| -- Timestamp of the DomContentLoaded event: |
| -- https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event |
| dom_content_loaded_event_ts TIMESTAMP, |
| -- Timestamp of the window load event: |
| -- https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event |
| load_event_ts TIMESTAMP, |
| -- Timestamp of the page self-reporting as fully loaded through the |
| -- performance.mark('mark_fully_loaded') API. |
| mark_fully_loaded_ts TIMESTAMP, |
| -- Timestamp of the page self-reporting as fully visible through the |
| -- performance.mark('mark_fully_visible') API. |
| mark_fully_visible_ts TIMESTAMP, |
| -- Timestamp of the page self-reporting as fully interactive through the |
| -- performance.mark('mark_interactive') API. |
| mark_interactive_ts TIMESTAMP, |
| -- URL at the page load event. |
| url STRING, |
| -- The unique process id (upid) of the browser process where the page load occurred. |
| browser_upid LONG |
| ) AS |
| SELECT |
| row_number() OVER (ORDER BY fcp.ts) AS id, |
| fcp.navigation_id, |
| fcp.ts AS navigation_start_ts, |
| fcp.dur AS fcp, |
| fcp.ts + fcp.dur AS fcp_ts, |
| lcp.dur AS lcp, |
| lcp.dur + lcp.ts AS lcp_ts, |
| load_fired.ts AS dom_content_loaded_event_ts, |
| start_load.ts AS load_event_ts, |
| timing_loaded.ts AS mark_fully_loaded_ts, |
| timing_visible.ts AS mark_fully_visible_ts, |
| timing_interactive.ts AS mark_interactive_ts, |
| fcp.url, |
| fcp.browser_upid |
| FROM _fcp_metrics AS fcp |
| LEFT JOIN _page_load_metrics('PageLoadMetrics.NavigationToLargestContentfulPaint') AS lcp |
| USING (navigation_id, browser_upid) |
| LEFT JOIN _page_load_metrics('PageLoadMetrics.NavigationToDOMContentLoadedEventFired') AS load_fired |
| USING (navigation_id, browser_upid) |
| LEFT JOIN _page_load_metrics('PageLoadMetrics.NavigationToMainFrameOnLoad') AS start_load |
| USING (navigation_id, browser_upid) |
| LEFT JOIN _page_load_metrics('PageLoadMetrics.UserTimingMarkFullyLoaded') AS timing_loaded |
| USING (navigation_id, browser_upid) |
| LEFT JOIN _page_load_metrics('PageLoadMetrics.UserTimingMarkFullyVisible') AS timing_visible |
| USING (navigation_id, browser_upid) |
| LEFT JOIN _page_load_metrics('PageLoadMetrics.UserTimingMarkInteractive') AS timing_interactive |
| USING (navigation_id, browser_upid); |