PreloadServingMetrics: Logs/metrics related to preload serving
Design doc: https://docs.google.com/document/d/1bBhfhO7BotUB7Myy_8mtFF_4lI5N8hUyNayV_gI019Y
This document will become truth once the CL https://crrev.com/c/6884362 has landed. TODO(crrev.com/360094997): Remove the above.
Goal
Enable collecting, recording, and analyzing serving metrics of preloads. For example:
- Continuously collect page load metrics for navigations under different conditions: without preloads, with prefetch used, and with prerender used. (E.g. to evaluate improvements of preload execution stacks.)
- Investigate the cause of regressions from new features by understanding what is happening during the serving phase.
Overview
Logs/metrics are processed in three steps:
- Log objects are recorded in each component of preloads.
- During a navigation, log objects are collected and associated with that navigation.
- At the end of the navigation, the collected logs are recorded as metrics (UMAs/UKMs) if certain conditions are met. (E.g. a prerender initial navigation is cancelled.)
Logs
PreloadServingMetrics collects per-navigation, serving-related data about
preloads, and contains logs objects collected from several preloading components.
While PreloadServingMetrics must be serving-side metrics, it also collects
and uses non-serving-side data (e.g., data about prefetching or the initial
prerender navigation) insofar as it relates to the serving navigation.
(Some of the non-serving-side data contained in log objects are also used for
non-serving-side metrics outside PreloadServingMetrics.)
Examples:
PreloadServingMetrics: Log of preloads associated with a navigation. May hold:PrefetchMatchMetricsandPreloadServingMetricsfor prerender initial navigation (if the navigation is prerender activation navigation).
PrefetchMatchMetrics: Log of prefetch matching. May holdPrefetchContainerMetrics.PrefetchContainerMetrics: Log ofPrefetchContainer.- This contains data about the prefetching phase.
- This is used for
PreloadServingMetrics, only in the context of serving metrics (e.g., when the corresponding prefetch received the non-redirect header relative to the serving/navigation timing). - This is also used for metrics outside
PreloadServingMetrics(including prefetching-side metrics).
The log objects are always:
struct- Passed by
std::unique_ptr<>. - Not movable.
Each log object is built by a related component, and becomes read-only outside
that component. For example, PrefetchContainerMetrics is built by
PrefetchContainer. It will be copied to a field of
PrefetchMatchMetrics, and read-only after the copy. See each log object's
comment to identify its builder component.
Life of PreloadServingMetrics {#life-of-PreloadServingMetrics}
A PreloadServingMetrics object is created per-navigation and is owned by
PreloadServingMetricsHolder until navigation commit or failure.
After that, the ownership is moved to:
PrerenderHostfor committed prerender initial navigation.- The
PreloadServingMetricsfrom the initial prerender navigation is then moved to the activation navigation'sPreloadServingMetricsand processed along with it.
- The
PreloadServingMetricsPageLoadMetricsObserver(viaPreloadServingMetricsCapsulethat exposesPreloadServingMetricsto//contentpublic) for committed non-prerender-initial navigation.PreloadServingMetricsPageLoadMetricsObserverrecords UMAs/UKMs based onPreloadServingMetrics, when a navigation is committed and FCP is received.
- Discarded with recording UMAs/UKMs if it is a failed prerender initial navigation.
- Discarded without recording UMAs/UKMs otherwise.
Non-prerender navigation:
flowchart LR
subgraph PreloadServingMetricsPageLoadObserver
PreloadServingMetricsCapsule
end
subgraph non-prerender-navigation
PreloadServingMetricsHolder
end
PreloadServingMetricsHolder --> PreloadServingMetricsCapsule
- If navigation is not committed,
PreloadServingMetricsis not taken.
Prerender navigations:
flowchart LR
subgraph PreloadServingMetricsPageLoadObserver
PreloadServingMetricsCapsule
end
subgraph prerender initial navigation
PreloadServingMetricsHolder-1
end
subgraph prerender activation navigation
PreloadServingMetricsHolder-2
end
PreloadServingMetricsHolder-1 --> PrerenderHost
PrerenderHost --> PreloadServingMetricsHolder-2
PreloadServingMetricsHolder-2 --> PreloadServingMetricsCapsule
- If the prerender initial navigation is not committed and fails,
PreloadServingMetricsis taken byPrerenderHostand used to report metrics for failure. - If the prerender initial navigation is committed but
PrerenderHostis cancelled, the same applies.
Test
Tests are managed in
- //content/browser/preloading/preload_serving_metrics_unittest.cc
- Detailed checks of the correspondence between the
PreloadServingMetricsstructure and the recorded metrics.
- Detailed checks of the correspondence between the
- //content/browser/preloading/prerenderer_impl_browsertest.cc
- End-to-end checks for basic scenarios.
- //chrome/browser/preloading/search_preload/search_preload_browsertest.cc
- End-to-end checks that include
PreloadServingMetricsPageLoadMetricsObserver.
- End-to-end checks that include