Skip to content

Commit a724c2c

Browse files
Performance insight audits (#114)
* insights mapping * optimised performance insights * some optimizations * fix * fix rank * fmt * renamed * no mapping * keep absolute origins * fix * keep all audits * support data with no rank
1 parent 62409fc commit a724c2c

2 files changed

Lines changed: 132 additions & 162 deletions

File tree

definitions/output/reports/tech_crux.js

Lines changed: 124 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ const results = []
4242
for (const category of Object.keys(lighthouse?.categories ? lighthouse.categories : {})) {
4343
for (const audit of lighthouse.categories[category].auditRefs) {
4444
if (
45-
lighthouse.audits[audit.id].score === 1 &&
46-
!['metrics', 'hidden'].includes(audit.group)
45+
lighthouse.audits[audit.id].score === 1 // Only include audits that passed
46+
&& !['metrics', 'hidden'].includes(audit.group) // Exclude metrics and hidden audits
4747
) {
4848
results.push({
4949
category,
5050
id: audit.id
51-
})
51+
});
5252
}
5353
}
5454
}
@@ -70,7 +70,7 @@ WITH pages AS (
7070
${constants.devRankFilter}
7171
),
7272
73-
geo_summary AS (
73+
crux_base AS (
7474
SELECT
7575
\`chrome-ux-report\`.experimental.GET_COUNTRY(country_code) AS geo,
7676
rank,
@@ -135,43 +135,64 @@ geo_summary AS (
135135
crux AS (
136136
SELECT
137137
geo,
138-
CASE _rank
139-
WHEN 100000000 THEN 'ALL'
140-
WHEN 10000000 THEN 'Top 10M'
141-
WHEN 1000000 THEN 'Top 1M'
142-
WHEN 100000 THEN 'Top 100k'
143-
WHEN 10000 THEN 'Top 10k'
144-
WHEN 1000 THEN 'Top 1k'
145-
END AS rank,
146-
CONCAT(origin, '/') AS root_page,
147-
IF(device = 'desktop', 'desktop', 'mobile') AS client,
138+
rank,
139+
root_page,
140+
client,
141+
142+
any_fid,
143+
good_fid,
144+
any_cls,
145+
good_cls,
146+
any_lcp,
147+
good_lcp,
148+
good_cwv,
149+
150+
any_fcp,
151+
good_fcp,
152+
any_ttfb,
153+
good_ttfb,
154+
any_inp,
155+
good_inp
156+
FROM (
157+
SELECT
158+
geo,
159+
CASE
160+
WHEN rank <= 1000 THEN ['Top 1k', 'Top 10k', 'Top 100k', 'Top 1M', 'Top 10M', 'ALL']
161+
WHEN rank <= 10000 THEN ['Top 10k', 'Top 100k', 'Top 1M', 'Top 10M', 'ALL']
162+
WHEN rank <= 100000 THEN ['Top 100k', 'Top 1M', 'Top 10M', 'ALL']
163+
WHEN rank <= 1000000 THEN ['Top 1M', 'Top 10M', 'ALL']
164+
WHEN rank <= 10000000 THEN ['Top 10M', 'ALL']
165+
ELSE ['ALL']
166+
END AS eligible_ranks,
167+
CONCAT(origin, '/') AS root_page,
168+
IF(device = 'desktop', 'desktop', 'mobile') AS client,
148169
149-
# CWV
150-
IS_NON_ZERO(fast_fid, avg_fid, slow_fid) AS any_fid,
151-
IS_GOOD(fast_fid, avg_fid, slow_fid) AS good_fid,
152-
IS_NON_ZERO(small_cls, medium_cls, large_cls) AS any_cls,
153-
IS_GOOD(small_cls, medium_cls, large_cls) AS good_cls,
154-
IS_NON_ZERO(fast_lcp, avg_lcp, slow_lcp) AS any_lcp,
155-
IS_GOOD(fast_lcp, avg_lcp, slow_lcp) AS good_lcp,
156-
IF('${pastMonth}' < '2024-01-01',
157-
(IS_GOOD(fast_fid, avg_fid, slow_fid) OR fast_fid IS NULL) AND
158-
IS_GOOD(small_cls, medium_cls, large_cls) AND
159-
IS_GOOD(fast_lcp, avg_lcp, slow_lcp),
160-
(IS_GOOD(fast_inp, avg_inp, slow_inp) OR fast_inp IS NULL) AND
161-
IS_GOOD(small_cls, medium_cls, large_cls) AND
162-
IS_GOOD(fast_lcp, avg_lcp, slow_lcp)
163-
) AS good_cwv,
170+
# CWV
171+
IS_NON_ZERO(fast_fid, avg_fid, slow_fid) AS any_fid,
172+
IS_GOOD(fast_fid, avg_fid, slow_fid) AS good_fid,
173+
IS_NON_ZERO(small_cls, medium_cls, large_cls) AS any_cls,
174+
IS_GOOD(small_cls, medium_cls, large_cls) AS good_cls,
175+
IS_NON_ZERO(fast_lcp, avg_lcp, slow_lcp) AS any_lcp,
176+
IS_GOOD(fast_lcp, avg_lcp, slow_lcp) AS good_lcp,
177+
IF('${pastMonth}' < '2024-01-01',
178+
(IS_GOOD(fast_fid, avg_fid, slow_fid) OR fast_fid IS NULL) AND
179+
IS_GOOD(small_cls, medium_cls, large_cls) AND
180+
IS_GOOD(fast_lcp, avg_lcp, slow_lcp),
181+
(IS_GOOD(fast_inp, avg_inp, slow_inp) OR fast_inp IS NULL) AND
182+
IS_GOOD(small_cls, medium_cls, large_cls) AND
183+
IS_GOOD(fast_lcp, avg_lcp, slow_lcp)
184+
) AS good_cwv,
164185
165-
# WV
166-
IS_NON_ZERO(fast_fcp, avg_fcp, slow_fcp) AS any_fcp,
167-
IS_GOOD(fast_fcp, avg_fcp, slow_fcp) AS good_fcp,
168-
IS_NON_ZERO(fast_ttfb, avg_ttfb, slow_ttfb) AS any_ttfb,
169-
IS_GOOD(fast_ttfb, avg_ttfb, slow_ttfb) AS good_ttfb,
170-
IS_NON_ZERO(fast_inp, avg_inp, slow_inp) AS any_inp,
171-
IS_GOOD(fast_inp, avg_inp, slow_inp) AS good_inp
172-
FROM geo_summary,
173-
UNNEST([1000, 10000, 100000, 1000000, 10000000, 100000000]) AS _rank
174-
WHERE rank <= _rank
186+
# WV
187+
IS_NON_ZERO(fast_fcp, avg_fcp, slow_fcp) AS any_fcp,
188+
IS_GOOD(fast_fcp, avg_fcp, slow_fcp) AS good_fcp,
189+
IS_NON_ZERO(fast_ttfb, avg_ttfb, slow_ttfb) AS any_ttfb,
190+
IS_GOOD(fast_ttfb, avg_ttfb, slow_ttfb) AS good_ttfb,
191+
IS_NON_ZERO(fast_inp, avg_inp, slow_inp) AS any_inp,
192+
IS_GOOD(fast_inp, avg_inp, slow_inp) AS good_inp
193+
FROM crux_base
194+
),
195+
UNNEST(eligible_ranks) AS rank
175196
),
176197
177198
technologies AS (
@@ -210,56 +231,19 @@ technologies AS (
210231
),
211232
212233
lab_data AS (
213-
SELECT
214-
client,
215-
page,
216-
root_page,
217-
SAFE.INT64(summary.bytesTotal) AS bytesTotal,
218-
SAFE.INT64(summary.bytesJS) AS bytesJS,
219-
SAFE.INT64(summary.bytesImg) AS bytesImg,
220-
SAFE.FLOAT64(lighthouse.categories.accessibility.score) AS accessibility,
221-
SAFE.FLOAT64(lighthouse.categories['best-practices'].score) AS best_practices,
222-
SAFE.FLOAT64(lighthouse.categories.performance.score) AS performance,
223-
SAFE.FLOAT64(lighthouse.categories.seo.score) AS seo
224-
FROM pages
225-
),
226-
227-
audits AS (
228-
SELECT DISTINCT
229-
client,
230-
root_page,
231-
technology,
232-
version,
233-
audit_category,
234-
audit_id
235-
FROM (
236-
SELECT
237-
client,
238-
page,
239-
root_page,
240-
audits.category AS audit_category,
241-
audits.id AS audit_id
242-
FROM pages
243-
INNER JOIN UNNEST(get_passed_audits(pages.lighthouse)) AS audits
244-
) AS audits_data
245-
INNER JOIN technologies
246-
USING (client, page)
247-
),
248-
249-
lab_metrics AS (
250234
SELECT
251235
client,
252236
root_page,
253237
technology,
254238
version,
255-
AVG(bytesTotal) AS bytesTotal,
256-
AVG(bytesJS) AS bytesJS,
257-
AVG(bytesImg) AS bytesImg,
258-
AVG(accessibility) AS accessibility,
259-
AVG(best_practices) AS best_practices,
260-
AVG(performance) AS performance,
261-
AVG(seo) AS seo
262-
FROM lab_data
239+
AVG(SAFE.INT64(summary.bytesTotal)) AS bytesTotal,
240+
AVG(SAFE.INT64(summary.bytesJS)) AS bytesJS,
241+
AVG(SAFE.INT64(summary.bytesImg)) AS bytesImg,
242+
AVG(SAFE.FLOAT64(lighthouse.categories.accessibility.score)) AS accessibility,
243+
AVG(SAFE.FLOAT64(lighthouse.categories['best-practices'].score)) AS best_practices,
244+
AVG(SAFE.FLOAT64(lighthouse.categories.performance.score)) AS performance,
245+
AVG(SAFE.FLOAT64(lighthouse.categories.seo.score)) AS seo
246+
FROM pages
263247
INNER JOIN technologies
264248
USING (client, page)
265249
GROUP BY
@@ -269,15 +253,47 @@ lab_metrics AS (
269253
version
270254
),
271255
272-
origins_summary AS (
256+
base_summary AS (
273257
SELECT
274258
geo,
275259
client,
276260
rank,
277261
technology,
278262
version,
263+
264+
STRUCT(
265+
COUNTIF(good_fid) AS origins_with_good_fid,
266+
COUNTIF(good_cls) AS origins_with_good_cls,
267+
COUNTIF(good_lcp) AS origins_with_good_lcp,
268+
COUNTIF(good_fcp) AS origins_with_good_fcp,
269+
COUNTIF(good_ttfb) AS origins_with_good_ttfb,
270+
COUNTIF(good_inp) AS origins_with_good_inp,
271+
COUNTIF(any_fid) AS origins_with_any_fid,
272+
COUNTIF(any_cls) AS origins_with_any_cls,
273+
COUNTIF(any_lcp) AS origins_with_any_lcp,
274+
COUNTIF(any_fcp) AS origins_with_any_fcp,
275+
COUNTIF(any_ttfb) AS origins_with_any_ttfb,
276+
COUNTIF(any_inp) AS origins_with_any_inp,
277+
COUNTIF(good_cwv) AS origins_with_good_cwv,
278+
COUNTIF(any_lcp AND any_cls) AS origins_eligible_for_cwv,
279+
SAFE_DIVIDE(COUNTIF(good_cwv), COUNTIF(any_lcp AND any_cls)) AS pct_eligible_origins_with_good_cwv
280+
) AS crux,
281+
282+
STRUCT(
283+
SAFE_CAST(APPROX_QUANTILES(accessibility, 1000)[OFFSET(500)] AS NUMERIC) AS accessibility,
284+
SAFE_CAST(APPROX_QUANTILES(best_practices, 1000)[OFFSET(500)] AS NUMERIC) AS best_practices,
285+
SAFE_CAST(APPROX_QUANTILES(performance, 1000)[OFFSET(500)] AS NUMERIC) AS performance,
286+
SAFE_CAST(APPROX_QUANTILES(seo, 1000)[OFFSET(500)] AS NUMERIC) AS seo
287+
) AS median_lighthouse_score,
288+
289+
STRUCT(
290+
SAFE_CAST(APPROX_QUANTILES(bytesTotal, 1000)[OFFSET(500)] AS INT64) AS total,
291+
SAFE_CAST(APPROX_QUANTILES(bytesJS, 1000)[OFFSET(500)] AS INT64) AS js,
292+
SAFE_CAST(APPROX_QUANTILES(bytesImg, 1000)[OFFSET(500)] AS INT64) AS images
293+
) AS median_page_weight_bytes,
294+
279295
COUNT(DISTINCT root_page) AS origins
280-
FROM lab_metrics
296+
FROM lab_data
281297
INNER JOIN crux
282298
USING (client, root_page)
283299
GROUP BY
@@ -286,10 +302,8 @@ origins_summary AS (
286302
rank,
287303
technology,
288304
version
289-
290305
),
291306
292-
293307
audits_summary AS (
294308
SELECT
295309
geo,
@@ -298,9 +312,9 @@ audits_summary AS (
298312
technology,
299313
version,
300314
ARRAY_AGG(STRUCT(
301-
audit_category AS category,
302-
audit_id AS id,
303-
SAFE_DIVIDE(audits.origins, origins_summary.origins) AS pass_rate
315+
category,
316+
id,
317+
pass_origins
304318
)) AS audits
305319
FROM (
306320
SELECT
@@ -309,10 +323,21 @@ audits_summary AS (
309323
rank,
310324
technology,
311325
version,
312-
audit_category,
313-
audit_id,
314-
COUNT(DISTINCT root_page) AS origins
315-
FROM audits
326+
category,
327+
id,
328+
COUNT(DISTINCT root_page) AS pass_origins
329+
FROM (
330+
SELECT DISTINCT
331+
client,
332+
page,
333+
root_page,
334+
audits.category,
335+
audits.id
336+
FROM pages
337+
INNER JOIN UNNEST(get_passed_audits(pages.lighthouse)) AS audits
338+
) AS audits_data
339+
INNER JOIN technologies
340+
USING (client, page)
316341
INNER JOIN crux
317342
USING (client, root_page)
318343
GROUP BY
@@ -321,61 +346,9 @@ audits_summary AS (
321346
rank,
322347
technology,
323348
version,
324-
audit_category,
325-
audit_id
326-
) AS audits
327-
LEFT JOIN origins_summary
328-
USING (geo, client, rank, technology, version)
329-
GROUP BY
330-
geo,
331-
client,
332-
rank,
333-
technology,
334-
version
335-
),
336-
337-
other_summary AS (
338-
SELECT
339-
geo,
340-
client,
341-
rank,
342-
technology,
343-
version,
344-
345-
STRUCT(
346-
COUNTIF(good_fid) AS origins_with_good_fid,
347-
COUNTIF(good_cls) AS origins_with_good_cls,
348-
COUNTIF(good_lcp) AS origins_with_good_lcp,
349-
COUNTIF(good_fcp) AS origins_with_good_fcp,
350-
COUNTIF(good_ttfb) AS origins_with_good_ttfb,
351-
COUNTIF(good_inp) AS origins_with_good_inp,
352-
COUNTIF(any_fid) AS origins_with_any_fid,
353-
COUNTIF(any_cls) AS origins_with_any_cls,
354-
COUNTIF(any_lcp) AS origins_with_any_lcp,
355-
COUNTIF(any_fcp) AS origins_with_any_fcp,
356-
COUNTIF(any_ttfb) AS origins_with_any_ttfb,
357-
COUNTIF(any_inp) AS origins_with_any_inp,
358-
COUNTIF(good_cwv) AS origins_with_good_cwv,
359-
COUNTIF(any_lcp AND any_cls) AS origins_eligible_for_cwv,
360-
SAFE_DIVIDE(COUNTIF(good_cwv), COUNTIF(any_lcp AND any_cls)) AS pct_eligible_origins_with_good_cwv
361-
) AS crux,
362-
363-
STRUCT(
364-
SAFE_CAST(APPROX_QUANTILES(accessibility, 1000)[OFFSET(500)] AS NUMERIC) AS accessibility,
365-
SAFE_CAST(APPROX_QUANTILES(best_practices, 1000)[OFFSET(500)] AS NUMERIC) AS best_practices,
366-
SAFE_CAST(APPROX_QUANTILES(performance, 1000)[OFFSET(500)] AS NUMERIC) AS performance,
367-
SAFE_CAST(APPROX_QUANTILES(seo, 1000)[OFFSET(500)] AS NUMERIC) AS seo
368-
) AS median_lighthouse_score,
369-
370-
STRUCT(
371-
SAFE_CAST(APPROX_QUANTILES(bytesTotal, 1000)[OFFSET(500)] AS INT64) AS total,
372-
SAFE_CAST(APPROX_QUANTILES(bytesJS, 1000)[OFFSET(500)] AS INT64) AS js,
373-
SAFE_CAST(APPROX_QUANTILES(bytesImg, 1000)[OFFSET(500)] AS INT64) AS images
374-
) AS median_page_weight_bytes
375-
376-
FROM lab_metrics
377-
INNER JOIN crux
378-
USING (client, root_page)
349+
category,
350+
id
351+
)
379352
GROUP BY
380353
geo,
381354
client,
@@ -392,15 +365,12 @@ SELECT
392365
technology,
393366
version,
394367
395-
# Metrics
396368
origins,
397369
crux,
398370
median_lighthouse_score,
399371
median_page_weight_bytes,
400372
audits
401-
FROM origins_summary
402-
LEFT JOIN other_summary
403-
USING (geo, client, rank, technology, version)
373+
FROM base_summary
404374
LEFT JOIN audits_summary
405375
USING (geo, client, rank, technology, version)
406376
`)

0 commit comments

Comments
 (0)