Add PrewarmPrerenderCoverageStatus metric and fix prewarm telemetry [chromium/src : main]

0 views
Skip to first unread message

Jiacheng Guo (Gerrit)

unread,
Aug 19, 2026, 4:54:32 AM (yesterday) Aug 19
to prerendering-reviews, chromium...@chromium.org, Chromium Metrics Reviews, asvitkine...@chromium.org, bmcquad...@chromium.org, csharris...@chromium.org, speed-metrics...@chromium.org, gavin...@chromium.org, loading-rev...@chromium.org, tburkar...@chromium.org, speed-metr...@chromium.org

Jiacheng Guo has uploaded the change for review

Commit message

Add PrewarmPrerenderCoverageStatus metric and fix prewarm telemetry

Introduce a two-tiered prewarm state tracking mechanism to resolve
telemetry blind spots during in-flight process reuse, process allocation
misses, and survivorship bias for DSE prewarming and prerendering.

This change records PageLoad.Clients.GoogleSearch.
PrewarmPrerenderCoverageStatus representing 11 coverage outcomes
(including in-flight prewarm reuse, committed prewarm reuse, prerender
host reuse, and process allocation misses). The legacy metrics
PrewarmNavigationStatus2 and HadPriorPrewarmCommitStatus2 are deprecated.

OBSOLETE_HISTOGRAM[PageLoad.Clients.GoogleSearch.Prerender.PrewarmNavigationStatus2{InitiatorOfNavigation}{PrerenderStatus}]=Replaced by PageLoad.Clients.GoogleSearch.PrewarmPrerenderCoverageStatus{InitiatorOfNavigation}{PrerenderStatus}
OBSOLETE_HISTOGRAM[PageLoad.Clients.GoogleSearch.HadPriorPrewarmCommitStatus2{InitiatorOfNavigation}{PrerenderStatus}]=Replaced by PageLoad.Clients.GoogleSearch.PrewarmPrerenderCoverageStatus{InitiatorOfNavigation}{PrerenderStatus}
Bug: 473593133
Change-Id: I38f3edd968f229b1b4d99cbc3695c49b577dd12a

Change diff


Change information

Files:
  • M chrome/browser/page_load_metrics/observers/gws_page_load_metrics_observer_unittest.cc
  • M chrome/browser/preloading/prerender/prerender_manager.cc
  • M chrome/browser/preloading/prerender/search_prewarm_progress_service.cc
  • M chrome/browser/preloading/prerender/search_prewarm_progress_service.h
  • M components/page_load_metrics/google/browser/BUILD.gn
  • M components/page_load_metrics/google/browser/gws_page_load_metrics_observer.cc
  • M components/page_load_metrics/google/browser/gws_page_load_metrics_observer.h
  • D components/page_load_metrics/google/browser/prerender_prewarm_navigation_data.cc
  • D components/page_load_metrics/google/browser/prerender_prewarm_navigation_data.h
  • A components/page_load_metrics/google/browser/prerender_prewarm_process_data.cc
  • A components/page_load_metrics/google/browser/prerender_prewarm_process_data.h
  • A components/page_load_metrics/google/browser/search_prewarm_types.cc
  • A components/page_load_metrics/google/browser/search_prewarm_types.h
  • M tools/metrics/histograms/metadata/page/enums.xml
  • M tools/metrics/histograms/metadata/page/histograms.xml
Change size: L
Delta: 15 files changed, 536 insertions(+), 227 deletions(-)
Open in Gerrit

Related details

Attention set is empty
Submit Requirements:
  • requirement satisfiedCode-Coverage
  • requirement is not satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: newchange
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: I38f3edd968f229b1b4d99cbc3695c49b577dd12a
Gerrit-Change-Number: 8264053
Gerrit-PatchSet: 1
Gerrit-Owner: Jiacheng Guo <g...@google.com>
Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
Gerrit-CC: prerendering-reviews <prerenderi...@chromium.org>
satisfied_requirement
unsatisfied_requirement
open
diffy

Jiacheng Guo (Gerrit)

unread,
4:00 AM (8 hours ago) 4:00 AM
to Chromium Metrics Reviews, chromium...@chromium.org, prerendering-reviews, asvitkine...@chromium.org, bmcquad...@chromium.org, csharris...@chromium.org, gavin...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, tburkar...@chromium.org

Jiacheng Guo added 11 comments

Commit Message
File-level comment, Patchset 1 (Latest):
Jiacheng Guo . unresolved

Please fix this WARNING reported by Metrics: An obsoletion message has been added to following histograms: PageLoad.Clients.G...

An obsoletion message has been added to following histograms: PageLoad.Clients.GoogleSearch.Prerender.PrewarmNavigationStatus2{InitiatorOfNavigation}{PrerenderStatus}, PageLoad.Clients.GoogleSearch.HadPriorPrewarmCommitStatus2{InitiatorOfNavigation}{PrerenderStatus}, but they are not removed. Please double check if there're typos.

File chrome/browser/preloading/prerender/prerender_manager.cc
Line 436, Patchset 1 (Latest): SearchPrewarmProgressServiceFactory::GetForProfile(profile)) {
Jiacheng Guo . unresolved

If we are tracking prerender as well in `SearchPrewarmProgressServiceFactory`, consider renaming it.

Line 438, Patchset 1 (Latest): web_contents(), features::kPrerender2ReuseSearchResultHost.Get());
Jiacheng Guo . unresolved

Checking only the feature is not correct, we should check if prewarm host is really reused.

Line 611, Patchset 1 (Latest): content::RenderProcessHost* rph =
Jiacheng Guo . unresolved

The SiteInstance won't be necessarily present for the navigation request when it is initiated by prerendering. Also the bound process may change when we receive the response. We may first tie the `PrerenderPrewarmProcessData` to the NavigationRequest and then set the data to the renderer process in RenderFrameHostManager::GetFrameHostForNavigation. Please also add comments here about this mechanism.

File chrome/browser/preloading/prerender/search_prewarm_progress_service.h
Line 49, Patchset 1 (Latest): void OnSearchPrewarmStarted(content::PrerenderHostId host_id);
Jiacheng Guo . unresolved

Remove this old API.

File chrome/browser/preloading/prerender/search_prewarm_progress_service.cc
Line 59, Patchset 1 (Latest): if (web_contents) {
Jiacheng Guo . unresolved

Are there cases where web_contents can be nullptr? If not, we should convert this to a CHECK.

Line 70, Patchset 1 (Latest): if (web_contents) {
Jiacheng Guo . unresolved

Are there cases where web_contents can be nullptr? If not, we should convert this to a CHECK.

File components/page_load_metrics/google/browser/gws_page_load_metrics_observer.cc
Line 683, Patchset 1 (Latest): page_load_metrics::SearchPrewarmPrerenderCoverageStatus::
Jiacheng Guo . unresolved

The reused prerender host doesn't necessarily come from prewarm. We may rename `kPrerenderActivated_WithPrewarmHostReuse` to `kPrerenderActivated_WithPrerenderHostReuse`.

Line 697, Patchset 1 (Latest): content::SiteInstanceProcessAssignment::REUSED_EXISTING_PROCESS;
Jiacheng Guo . unresolved

Reusing a renderer process doesn't necessarily mean it comes from a prewarm or prerender (it can be spare process or kept-alive process). We need to further track the source of the reuse process.
If tracking these source is too difficult, then maybe we can only track the cases where we fail to reuse any process and have one single UMA entry for prerender not activated but process reused.

Line 716, Patchset 1 (Latest): auto* prewarm_process_data =
Jiacheng Guo . unresolved

Overall is checking process level tracking data still required if we can further track down the reuse source of the reused renderer process? Then we can simply log whether we have attempted a prewarm and whether the prewarmed process is reused for the actual navigation.

File components/page_load_metrics/google/browser/search_prewarm_types.h
Line 81, Patchset 1 (Latest): bool prewarm_attempted() const { return prewarm_attempted_; }
Jiacheng Guo . unresolved

Maybe `search_prewarm` and `search_prerender` rather than only `prewarm` and `prerender`.

Open in Gerrit

Related details

Attention set is empty
Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: I38f3edd968f229b1b4d99cbc3695c49b577dd12a
    Gerrit-Change-Number: 8264053
    Gerrit-PatchSet: 1
    Gerrit-Owner: Jiacheng Guo <g...@google.com>
    Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
    Gerrit-CC: prerendering-reviews <prerenderi...@chromium.org>
    Gerrit-Comment-Date: Thu, 20 Aug 2026 08:00:18 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Jiacheng Guo (Gerrit)

    unread,
    5:52 AM (6 hours ago) 5:52 AM
    to Chromium Metrics Reviews, chromium...@chromium.org, prerendering-reviews, lingqi...@chromium.org, asvitkine...@chromium.org, bmcquad...@chromium.org, csharris...@chromium.org, gavin...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, tburkar...@chromium.org

    Jiacheng Guo added 10 comments

    Commit Message
    File-level comment, Patchset 1:
    Jiacheng Guo . resolved

    Please fix this WARNING reported by Metrics: An obsoletion message has been added to following histograms: PageLoad.Clients.G...

    An obsoletion message has been added to following histograms: PageLoad.Clients.GoogleSearch.Prerender.PrewarmNavigationStatus2{InitiatorOfNavigation}{PrerenderStatus}, PageLoad.Clients.GoogleSearch.HadPriorPrewarmCommitStatus2{InitiatorOfNavigation}{PrerenderStatus}, but they are not removed. Please double check if there're typos.

    Jiacheng Guo

    Done

    Line 7, Patchset 2 (Latest):Add PrewarmPrerenderCoverageStatus metric and fix prewarm telemetry
    Jiacheng Guo . unresolved

    Overall comment: This has become a very large change. Can we split it a bit. Maybe first a CL for renaming search prewarm service. Then a CL for fixing the prewarm data missing in the renderer process user data before prewarm commit. Then another CL for recording whether prerender reuses the prewarm process. Finally a CL for adding the metrics.

    File chrome/browser/preloading/prerender/prerender_manager.cc
    Line 436, Patchset 1: SearchPrewarmProgressServiceFactory::GetForProfile(profile)) {
    Jiacheng Guo . resolved

    If we are tracking prerender as well in `SearchPrewarmProgressServiceFactory`, consider renaming it.

    Jiacheng Guo

    Done

    Line 438, Patchset 1: web_contents(), features::kPrerender2ReuseSearchResultHost.Get());
    Jiacheng Guo . resolved

    Checking only the feature is not correct, we should check if prewarm host is really reused.

    Jiacheng Guo

    Done

    Line 611, Patchset 1: content::RenderProcessHost* rph =
    Jiacheng Guo . resolved

    The SiteInstance won't be necessarily present for the navigation request when it is initiated by prerendering. Also the bound process may change when we receive the response. We may first tie the `PrerenderPrewarmProcessData` to the NavigationRequest and then set the data to the renderer process in RenderFrameHostManager::GetFrameHostForNavigation. Please also add comments here about this mechanism.

    Jiacheng Guo

    Done

    Line 631, Patchset 2 (Latest): ? navigation_handle.GetStartingSiteInstance()->GetProcess()
    Jiacheng Guo . unresolved

    (Same for AttachSearchPrerenderNavigationHandleUserData): We are assuming the renderer process and the SiteInstance is reused in the navigation for the prerender process. In practice, this is correct since we are always starting from either a blank page or a same-origin reused page. However this assumption is implicit and dangerous. Can we consider moving this logic to PrerenderHost so that the assumption becomes explicit. We need to add comments there and add logic to ensure the process stays the same during navigation.

    File components/page_load_metrics/google/browser/gws_page_load_metrics_observer.cc
    Line 683, Patchset 1: page_load_metrics::SearchPrewarmPrerenderCoverageStatus::
    Jiacheng Guo . resolved

    The reused prerender host doesn't necessarily come from prewarm. We may rename `kPrerenderActivated_WithPrewarmHostReuse` to `kPrerenderActivated_WithPrerenderHostReuse`.

    Jiacheng Guo

    Done

    Line 697, Patchset 1: content::SiteInstanceProcessAssignment::REUSED_EXISTING_PROCESS;
    Jiacheng Guo . resolved

    Reusing a renderer process doesn't necessarily mean it comes from a prewarm or prerender (it can be spare process or kept-alive process). We need to further track the source of the reuse process.
    If tracking these source is too difficult, then maybe we can only track the cases where we fail to reuse any process and have one single UMA entry for prerender not activated but process reused.

    Jiacheng Guo

    Done

    Line 716, Patchset 1: auto* prewarm_process_data =
    Jiacheng Guo . resolved

    Overall is checking process level tracking data still required if we can further track down the reuse source of the reused renderer process? Then we can simply log whether we have attempted a prewarm and whether the prewarmed process is reused for the actual navigation.

    Jiacheng Guo

    Done

    File components/page_load_metrics/google/browser/search_prewarm_types.h
    Line 81, Patchset 1: bool prewarm_attempted() const { return prewarm_attempted_; }
    Jiacheng Guo . resolved

    Maybe `search_prewarm` and `search_prerender` rather than only `prewarm` and `prerender`.

    Jiacheng Guo

    Done

    Open in Gerrit

    Related details

    Attention set is empty
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: I38f3edd968f229b1b4d99cbc3695c49b577dd12a
    Gerrit-Change-Number: 8264053
    Gerrit-PatchSet: 2
    Gerrit-Owner: Jiacheng Guo <g...@google.com>
    Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
    Gerrit-CC: prerendering-reviews <prerenderi...@chromium.org>
    Gerrit-Comment-Date: Thu, 20 Aug 2026 09:51:28 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Jiacheng Guo <g...@google.com>
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Jiacheng Guo (Gerrit)

    unread,
    5:52 AM (6 hours ago) 5:52 AM
    to Chromium Metrics Reviews, chromium...@chromium.org, prerendering-reviews, lingqi...@chromium.org, asvitkine...@chromium.org, bmcquad...@chromium.org, csharris...@chromium.org, gavin...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, tburkar...@chromium.org

    Jiacheng Guo added 3 comments

    File chrome/browser/preloading/prerender/search_prewarm_progress_service.h
    Line 49, Patchset 1: void OnSearchPrewarmStarted(content::PrerenderHostId host_id);
    Jiacheng Guo . resolved

    Remove this old API.

    Jiacheng Guo

    Done

    File chrome/browser/preloading/prerender/search_prewarm_progress_service.cc
    Line 59, Patchset 1: if (web_contents) {
    Jiacheng Guo . resolved

    Are there cases where web_contents can be nullptr? If not, we should convert this to a CHECK.

    Jiacheng Guo

    Done

    Line 70, Patchset 1: if (web_contents) {
    Jiacheng Guo . resolved

    Are there cases where web_contents can be nullptr? If not, we should convert this to a CHECK.

    Jiacheng Guo

    Done

    Open in Gerrit

    Related details

    Attention set is empty
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: I38f3edd968f229b1b4d99cbc3695c49b577dd12a
    Gerrit-Change-Number: 8264053
    Gerrit-PatchSet: 2
    Gerrit-Owner: Jiacheng Guo <g...@google.com>
    Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
    Gerrit-CC: prerendering-reviews <prerenderi...@chromium.org>
    Gerrit-Comment-Date: Thu, 20 Aug 2026 09:51:52 +0000
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy
    Reply all
    Reply to author
    Forward
    0 new messages