-- 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 common.slices; CREATE PERFETTO VIEW internal_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 internal_page_load_metrics(event_name STRING) RETURNS TABLE( ts LONG, dur LONG, navigation_id INT, browser_upid INT ) 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 INT, -- 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 INT, -- Timestamp of the start of navigation. navigation_start_ts INT, -- Duration between the navigation start and the first contentful paint event -- (web.dev/fcp). fcp INT, -- Timestamp of the first contentful paint. fcp_ts INT, -- Duration between the navigation start and the largest contentful paint event -- (web.dev/lcp). lcp INT, -- Timestamp of the largest contentful paint. lcp_ts INT, -- Timestamp of the DomContentLoaded event: -- https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event dom_content_loaded_event_ts INT, -- Timestamp of the window load event: -- https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event load_event_ts INT, -- Timestamp of the page self-reporting as fully loaded through the -- performance.mark('mark_fully_loaded') API. mark_fully_loaded_ts INT, -- Timestamp of the page self-reporting as fully visible through the -- performance.mark('mark_fully_visible') API. mark_fully_visible_ts INT, -- Timestamp of the page self-reporting as fully interactive through the -- performance.mark('mark_interactive') API. mark_interactive_ts INT, -- URL at the page load event. url STRING, -- The unique process id (upid) of the browser process where the page load occurred. browser_upid INT ) 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 internal_fcp_metrics fcp LEFT JOIN internal_page_load_metrics('PageLoadMetrics.NavigationToLargestContentfulPaint') lcp USING (navigation_id, browser_upid) LEFT JOIN internal_page_load_metrics('PageLoadMetrics.NavigationToDOMContentLoadedEventFired') load_fired USING (navigation_id, browser_upid) LEFT JOIN internal_page_load_metrics('PageLoadMetrics.NavigationToMainFrameOnLoad') start_load USING (navigation_id, browser_upid) LEFT JOIN internal_page_load_metrics('PageLoadMetrics.UserTimingMarkFullyLoaded') timing_loaded USING (navigation_id, browser_upid) LEFT JOIN internal_page_load_metrics('PageLoadMetrics.UserTimingMarkFullyVisible') timing_visible USING (navigation_id, browser_upid) LEFT JOIN internal_page_load_metrics('PageLoadMetrics.UserTimingMarkInteractive') timing_interactive USING (navigation_id, browser_upid);