blob: 73e44e9e7f549ff8cd6c6fd2f54d3a0118418636 [file] [log] [blame]
-- 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);