Skip to content

Commit c87719f

Browse files
khokhlov962copybara-github
authored andcommitted
LoadLine 2 queries for the Perfetto SQL library
Adds LoadLine 2 queries to the chrome stdlib, so that LoadLine 2 breakdown and score are available in Perfetto. PERFETTO_TESTS=`autoninja -C out/Default perfetto_diff_tests && out/Default/bin/run_perfetto_diff_tests` Change-Id: Ic425dfa5ad3e5fd55b852f65a618b95f095802a8 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7159093 Reviewed-by: Victor Vianna <[email protected]> Commit-Queue: Mikhail Khokhlov <[email protected]> Cr-Commit-Position: refs/heads/main@{#1550509} NOKEYCHECK=True GitOrigin-RevId: 814f18098f603f316b31dfbad68690dda40887bc
1 parent 52d39ee commit c87719f

File tree

4 files changed

+309
-0
lines changed

4 files changed

+309
-0
lines changed
Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
-- Copyright 2025 The Chromium Authors
2+
-- Use of this source code is governed by a BSD-style license that can be
3+
-- found in the LICENSE file.
4+
5+
INCLUDE PERFETTO MODULE slices.with_context;
6+
7+
-- Gets the presentation time of the first frame committed after ts
8+
-- in the renderer process with pid.
9+
CREATE PERFETTO FUNCTION _chrome_get_next_presentation_time_by_pid(
10+
ts INT, pid INT)
11+
RETURNS INT
12+
AS
13+
SELECT MIN(a.ts + a.dur) AS ts
14+
FROM process_slice s, ancestor_slice(s.id) a
15+
WHERE
16+
s.name = 'Commit'
17+
AND a.name = 'PipelineReporter'
18+
AND s.depth - 1 = a.depth
19+
AND s.ts > $ts
20+
AND s.pid = $pid
21+
-- TODO(crbug.com/409484302): Once we are no longer interested in Chrome
22+
-- versions <=M136, leave only 'frame_reporter'.
23+
AND COALESCE(
24+
EXTRACT_ARG(a.arg_set_id, 'frame_reporter.state'),
25+
EXTRACT_ARG(a.arg_set_id, 'chrome_frame_reporter.state')
26+
) = 'STATE_PRESENTED_ALL';
27+
28+
-- User timing trace events can be emitted by either performance.mark() or
29+
-- performance.measure(). The former appear on the CrRendererMain thread track,
30+
-- the latter on their own custom track inside the Renderer process.
31+
-- This query looks for the event track info in both thread_track and
32+
-- process_track to support both cases.
33+
CREATE PERFETTO VIEW _chrome_loadline2_marks_with_pid (
34+
-- Mark timestamp
35+
ts TIMESTAMP,
36+
-- Name of the page
37+
page STRING,
38+
-- Name of the mark
39+
mark STRING,
40+
-- PID of the Renderer process
41+
pid LONG
42+
) AS
43+
SELECT
44+
ts,
45+
STR_SPLIT(s.name, '/', 1) AS page,
46+
STR_SPLIT(s.name, '/', 2) AS mark,
47+
pid
48+
FROM slice s
49+
LEFT JOIN thread_track tt ON s.track_id = tt.id
50+
LEFT JOIN process_track pt ON s.track_id = pt.id
51+
LEFT JOIN thread t ON tt.utid = t.utid
52+
JOIN process p ON p.upid = COALESCE(t.upid, pt.upid)
53+
WHERE s.category = 'blink.user_timing' AND s.name GLOB 'LoadLine2/*/*';
54+
55+
-- Story start for each page
56+
CREATE PERFETTO TABLE _chrome_loadline2_story_start (
57+
-- Name of the page
58+
page STRING,
59+
-- Story start timestamp
60+
story_start TIMESTAMP
61+
) AS
62+
SELECT
63+
page,
64+
ts AS story_start
65+
FROM _chrome_loadline2_marks_with_pid
66+
WHERE mark = 'start';
67+
68+
-- Renderer process pid for each page
69+
CREATE PERFETTO TABLE _chrome_loadline2_story_pid (
70+
-- Name of the page
71+
page STRING,
72+
-- PID of the Renderer process
73+
pid LONG
74+
) AS
75+
SELECT
76+
page,
77+
pid
78+
FROM _chrome_loadline2_marks_with_pid
79+
WHERE mark = 'finish';
80+
81+
-- Story start and Renderer pid for each page
82+
CREATE PERFETTO TABLE _chrome_loadline2_story_start_with_pid (
83+
-- Name of the page
84+
page STRING,
85+
-- Story start timestamp
86+
story_start TIMESTAMP,
87+
-- PID of the Renderer process
88+
pid LONG
89+
) AS
90+
SELECT
91+
page,
92+
story_start,
93+
pid
94+
FROM _chrome_loadline2_story_start JOIN _chrome_loadline2_story_pid USING (page);
95+
96+
-- Start timestamp for the first network request for each page
97+
CREATE PERFETTO TABLE _chrome_loadline2_start_request (
98+
-- Name of the page
99+
page STRING,
100+
-- Start request timestamp
101+
start_request TIMESTAMP
102+
) AS
103+
SELECT
104+
page,
105+
MIN(ts) AS start_request
106+
FROM slice, _chrome_loadline2_story_start_with_pid
107+
WHERE
108+
name = 'WillStartRequest'
109+
AND ts >= story_start
110+
GROUP BY page;
111+
112+
-- Finish timestamp for the first network request for each page
113+
CREATE PERFETTO TABLE _chrome_loadline2_end_request (
114+
-- Name of the page
115+
page STRING,
116+
-- End request timestamp
117+
end_request TIMESTAMP
118+
) AS
119+
SELECT
120+
page,
121+
MIN(ts) AS end_request
122+
FROM slice, _chrome_loadline2_story_start_with_pid
123+
WHERE
124+
name = 'CommitSentToFirstSubresourceLoadStart'
125+
AND ts >= story_start
126+
GROUP BY page;
127+
128+
-- Renderer ready for each page
129+
CREATE PERFETTO TABLE _chrome_loadline2_renderer_ready (
130+
-- Name of the page
131+
page STRING,
132+
-- Renderer ready timestamp
133+
renderer_ready TIMESTAMP
134+
) AS
135+
SELECT
136+
page,
137+
MIN(ts) AS renderer_ready
138+
FROM thread_slice
139+
JOIN _chrome_loadline2_story_start_with_pid USING (pid)
140+
WHERE
141+
name = 'DocumentLoader::CommitNavigation'
142+
AND ts >= story_start
143+
GROUP BY page;
144+
145+
-- Visual mark for each page
146+
CREATE PERFETTO TABLE _chrome_loadline2_visual_mark (
147+
-- Name of the page
148+
page STRING,
149+
-- Visual mark timestamp
150+
visual_mark TIMESTAMP,
151+
-- PID of the Renderer process
152+
pid LONG
153+
) AS
154+
SELECT
155+
page,
156+
ts AS visual_mark,
157+
pid
158+
FROM _chrome_loadline2_marks_with_pid
159+
WHERE mark = 'visual';
160+
161+
-- Timestamp of the second rAF after visual mark for each page
162+
CREATE PERFETTO TABLE _chrome_loadline2_visual_raf (
163+
-- Name of the page
164+
page STRING,
165+
-- Visual raf timestamp
166+
visual_raf TIMESTAMP
167+
) AS
168+
SELECT
169+
page,
170+
ts AS visual_raf
171+
FROM _chrome_loadline2_marks_with_pid
172+
WHERE mark = 'visual_raf';
173+
174+
-- Visual presentation for each page
175+
CREATE PERFETTO TABLE _chrome_loadline2_visual_presentation (
176+
-- Name of the page
177+
page STRING,
178+
-- Visual presentation timestamp
179+
visual_presentation TIMESTAMP
180+
) AS
181+
SELECT
182+
page,
183+
_chrome_get_next_presentation_time_by_pid(visual_mark, pid) AS visual_presentation
184+
FROM _chrome_loadline2_visual_mark;
185+
186+
-- Interactive mark for each page
187+
CREATE PERFETTO TABLE _chrome_loadline2_interactive_mark (
188+
-- Name of the page
189+
page STRING,
190+
-- Interactive mark timestamp
191+
interactive_mark TIMESTAMP,
192+
-- PID of the Renderer process
193+
pid LONG
194+
) AS
195+
SELECT
196+
page,
197+
ts AS interactive_mark,
198+
pid
199+
FROM _chrome_loadline2_marks_with_pid
200+
WHERE mark = 'interactive';
201+
202+
-- Timestamp of the second rAF after interactive mark for each page
203+
CREATE PERFETTO TABLE _chrome_loadline2_interactive_raf (
204+
-- Name of the page
205+
page STRING,
206+
-- Interactive raf timestamp
207+
interactive_raf TIMESTAMP
208+
) AS
209+
SELECT
210+
page,
211+
ts AS interactive_raf
212+
FROM _chrome_loadline2_marks_with_pid
213+
WHERE mark = 'interactive_raf';
214+
215+
-- Interactive presentation for each page
216+
CREATE PERFETTO TABLE _chrome_loadline2_interactive_presentation (
217+
-- Name of the page
218+
page STRING,
219+
-- Interactive presentation timestamp
220+
interactive_presentation TIMESTAMP
221+
) AS
222+
SELECT
223+
page,
224+
_chrome_get_next_presentation_time_by_pid(interactive_mark, pid) AS interactive_presentation
225+
FROM _chrome_loadline2_interactive_mark;
226+
227+
-- Story finish for each page
228+
CREATE PERFETTO TABLE _chrome_loadline2_story_finish (
229+
-- Name of the page
230+
page STRING,
231+
-- Story finish timestamp
232+
story_finish TIMESTAMP
233+
) AS
234+
SELECT
235+
page,
236+
ts AS story_finish
237+
FROM _chrome_loadline2_marks_with_pid
238+
WHERE mark = 'finish';
239+
240+
-- All LoadLine2 stages per page
241+
CREATE PERFETTO TABLE chrome_loadline2_stages (
242+
-- Name of the page
243+
page STRING,
244+
-- Story start timestamp
245+
story_start TIMESTAMP,
246+
-- Start request timestamp
247+
start_request TIMESTAMP,
248+
-- End request timestamp
249+
end_request TIMESTAMP,
250+
-- Renderer ready timestamp
251+
renderer_ready TIMESTAMP,
252+
-- Visual mark timestamp
253+
visual_mark TIMESTAMP,
254+
-- Visual rAF timestamp
255+
visual_raf TIMESTAMP,
256+
-- Visual presentation timestamp
257+
visual_presentation TIMESTAMP,
258+
-- Interactive mark timestamp
259+
interactive_mark TIMESTAMP,
260+
-- Interactive rAF timestamp
261+
interactive_raf TIMESTAMP,
262+
-- Interactive presentation timestamp
263+
interactive_presentation TIMESTAMP,
264+
-- Story finish timestamp
265+
story_finish TIMESTAMP
266+
) AS
267+
SELECT
268+
page,
269+
story_start,
270+
start_request,
271+
end_request,
272+
renderer_ready,
273+
visual_mark,
274+
visual_raf,
275+
visual_presentation,
276+
interactive_mark,
277+
interactive_raf,
278+
interactive_presentation,
279+
story_finish
280+
FROM _chrome_loadline2_story_start_with_pid
281+
LEFT JOIN _chrome_loadline2_start_request USING (page)
282+
LEFT JOIN _chrome_loadline2_end_request USING (page)
283+
LEFT JOIN _chrome_loadline2_renderer_ready USING (page)
284+
LEFT JOIN _chrome_loadline2_visual_mark USING (page)
285+
LEFT JOIN _chrome_loadline2_visual_raf USING (page)
286+
LEFT JOIN _chrome_loadline2_visual_presentation USING (page)
287+
LEFT JOIN _chrome_loadline2_interactive_mark USING (page)
288+
LEFT JOIN _chrome_loadline2_interactive_raf USING (page)
289+
LEFT JOIN _chrome_loadline2_interactive_presentation USING (page)
290+
LEFT JOIN _chrome_loadline2_story_finish USING (page);

tracing/stdlib/chrome/perfetto_sql_files.gni

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ chrome_stdlib_sql_files = [
1111
"graphics_pipeline.sql",
1212
"histograms.sql",
1313
"interactions.sql",
14+
"loadline_2.sql",
1415
"metadata.sql",
1516
"input.sql",
1617
"page_loads.sql",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
446e12518282e078360cb1ab55ebb3e3788c3863b269601d2392c9e5d058a92c

tracing/test/trace_processor/diff_tests/chrome/tests.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,23 @@ def test_speedometer_3_renderer_main_utid(self):
215215
2
216216
"""))
217217

218+
def test_loadline_2_stages(self):
219+
return DiffTestBlueprint(
220+
trace=DataPath('loadline2_phone_perfetto_trace.pb.gz'),
221+
query="""
222+
INCLUDE PERFETTO MODULE chrome.loadline_2;
223+
224+
SELECT * FROM chrome_loadline2_stages;
225+
""",
226+
out=Csv("""
227+
"page","story_start","start_request","end_request","renderer_ready","visual_mark","visual_raf","visual_presentation","interactive_mark","interactive_raf","interactive_presentation","story_finish"
228+
"amazon_product",92168959184844,92168964292547,92168971170844,92168972399547,92169083553844,92169188454844,92169184256844,92169685753844,92169695454844,92169733497844,92169878447844
229+
"cnn_article",92171089712844,92171099378547,92171106636844,92171107875858,92171191827844,92171329926844,92171248159844,92171413627844,92171450327844,92171481210844,92171558926844
230+
"wikipedia_article",92172730780844,92172739162547,92172746708844,92172747906244,92172801226844,92172843126844,92172846114844,92172826526844,92172877126844,92172879408844,92173054810844
231+
"globo_homepage",92174078990844,92174091306547,92174101735844,92174091680202,92174166369844,92174220769844,92174277596844,92174638068844,92174679269844,92174710386844,92175115291844
232+
"google_search_result",92176269047844,92176276990547,92176286094844,92176276922481,92176326400844,92176365000844,92176391496844,92176571700844,92176587400844,92176607896844,92176764223844
233+
"""))
234+
218235
def test_chrome_graphics_pipeline_surface_frame_steps(self):
219236
return DiffTestBlueprint(
220237
trace=DataPath('scroll_m131.pftrace'),

0 commit comments

Comments
 (0)