Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(351)

Side by Side Diff: chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc

Issue 2719823003: Convert first contentful paint logging to the new UKM client API (Closed)
Patch Set: limit to fcp Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_obser ver.h" 5 #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_obser ver.h"
6 #include "chrome/browser/browser_process.h" 6 #include "chrome/browser/browser_process.h"
7 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
7 #include "components/ukm/ukm_service.h" 8 #include "components/ukm/ukm_service.h"
8 #include "components/ukm/ukm_source.h" 9
10 namespace internal {
11
12 const char kUkmPageLoadEventName[] = "PageLoad";
13 const char kUkmFirstContentfulPaintName[] =
14 "PaintTiming.NavigationToFirstContentfulPaint";
15
16 } // namespace internal
17
18 namespace {
19
20 // We need to provide a unique GlobalRequestID for each page load. Ideally, we'd
21 // use the GlobalRequestID of the main resource request of the page load, but
22 // the content API doesn't yet provide a convenient way to discover the
23 // GlobalRequestID early in the navigation flow. Thus, until
24 // https://docs.google.com/document/d/1FqxC_mgBEi5N1tVCxgj3M7P2yrRTOdxZdShzEpxdk nM/edit
25 // is addressed, we synthesize a fake GlobalRequestID for each new page load.
26 content::GlobalRequestID NewGlobalRequestID() {
27 // We use int_max as our fake child_id value to minimize the chances of
28 // colliding with a real GlobalRequestID value from another UKM client.
29 static constexpr int kFakeChildId = std::numeric_limits<int>::max();
30
31 static int unique_identifier = 0;
32 return content::GlobalRequestID(kFakeChildId, unique_identifier++);
33 }
34
35 } // namespace
9 36
10 // static 37 // static
11 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver> 38 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver>
12 UkmPageLoadMetricsObserver::CreateIfNeeded() { 39 UkmPageLoadMetricsObserver::CreateIfNeeded() {
13 if (!g_browser_process->ukm_service()) { 40 if (!g_browser_process->ukm_service()) {
14 return nullptr; 41 return nullptr;
15 } 42 }
16 43
17 return base::MakeUnique<UkmPageLoadMetricsObserver>(); 44 return base::MakeUnique<UkmPageLoadMetricsObserver>();
18 } 45 }
19 46
20 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver() {} 47 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver()
48 : global_request_id_(NewGlobalRequestID()) {}
49
50 UkmPageLoadMetricsObserver::~UkmPageLoadMetricsObserver() = default;
21 51
22 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart( 52 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart(
23 content::NavigationHandle* navigation_handle, 53 content::NavigationHandle* navigation_handle,
24 const GURL& currently_committed_url, 54 const GURL& currently_committed_url,
25 bool started_in_foreground) { 55 bool started_in_foreground) {
26 return started_in_foreground ? CONTINUE_OBSERVING : STOP_OBSERVING; 56 if (!started_in_foreground)
57 return STOP_OBSERVING;
58
59 ukm::UkmService* ukm_service = g_browser_process->ukm_service();
60 ukm_service->UpdateSourceURL(global_request_id_, navigation_handle->GetURL());
61 builder_ = ukm_service->GetEntryBuilder(global_request_id_,
62 internal::kUkmPageLoadEventName);
63 return CONTINUE_OBSERVING;
27 } 64 }
28 65
29 UkmPageLoadMetricsObserver::ObservePolicy 66 UkmPageLoadMetricsObserver::ObservePolicy
30 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( 67 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground(
31 const page_load_metrics::PageLoadTiming& timing, 68 const page_load_metrics::PageLoadTiming& timing,
32 const page_load_metrics::PageLoadExtraInfo& info) { 69 const page_load_metrics::PageLoadExtraInfo& info) {
33 SendMetricsToUkm(timing, info); 70 AddTimingMetrics(timing);
71 AddPageLoadExtraInfoMetrics(info, base::TimeTicks::Now());
34 return STOP_OBSERVING; 72 return STOP_OBSERVING;
35 } 73 }
36 74
37 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( 75 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden(
38 const page_load_metrics::PageLoadTiming& timing, 76 const page_load_metrics::PageLoadTiming& timing,
39 const page_load_metrics::PageLoadExtraInfo& info) { 77 const page_load_metrics::PageLoadExtraInfo& info) {
40 SendMetricsToUkm(timing, info); 78 AddTimingMetrics(timing);
79 AddPageLoadExtraInfoMetrics(info, base::TimeTicks());
41 return STOP_OBSERVING; 80 return STOP_OBSERVING;
42 } 81 }
43 82
83 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad(
84 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info,
85 const page_load_metrics::PageLoadExtraInfo& extra_info) {
86 AddPageLoadExtraInfoMetrics(extra_info, base::TimeTicks());
87 }
88
44 void UkmPageLoadMetricsObserver::OnComplete( 89 void UkmPageLoadMetricsObserver::OnComplete(
45 const page_load_metrics::PageLoadTiming& timing, 90 const page_load_metrics::PageLoadTiming& timing,
46 const page_load_metrics::PageLoadExtraInfo& info) { 91 const page_load_metrics::PageLoadExtraInfo& info) {
47 SendMetricsToUkm(timing, info); 92 AddTimingMetrics(timing);
93 AddPageLoadExtraInfoMetrics(info, base::TimeTicks());
48 } 94 }
49 95
50 void UkmPageLoadMetricsObserver::SendMetricsToUkm( 96 void UkmPageLoadMetricsObserver::AddTimingMetrics(
51 const page_load_metrics::PageLoadTiming& timing, 97 const page_load_metrics::PageLoadTiming& timing) {
52 const page_load_metrics::PageLoadExtraInfo& info) { 98 if (timing.first_contentful_paint) {
53 if (!info.did_commit || !timing.first_contentful_paint) 99 builder_->AddMetric(internal::kUkmFirstContentfulPaintName,
54 return; 100 timing.first_contentful_paint.value().InMilliseconds());
101 }
102 }
55 103
104 void UkmPageLoadMetricsObserver::AddPageLoadExtraInfoMetrics(
105 const page_load_metrics::PageLoadExtraInfo& info,
106 base::TimeTicks app_background_time) {
56 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); 107 ukm::UkmService* ukm_service = g_browser_process->ukm_service();
57 DCHECK(ukm_service); 108 ukm_service->UpdateSourceURL(global_request_id_, info.url);
58
59 std::unique_ptr<ukm::UkmSource> source = base::MakeUnique<ukm::UkmSource>();
60 source->set_committed_url(info.url);
61 source->set_first_contentful_paint(timing.first_contentful_paint.value());
62
63 ukm_service->RecordSource(std::move(source));
64 } 109 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698