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

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

Issue 2747173003: UKM: log PageTransition and failed provisional load info (Closed)
Patch Set: fix comment 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/net/nqe/ui_network_quality_estimator_service.h" 7 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service.h"
8 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service_factory.h" 8 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service_factory.h"
9 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" 9 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
10 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/browser/profiles/profile.h"
11 #include "components/ukm/ukm_entry_builder.h" 11 #include "components/ukm/ukm_entry_builder.h"
12 #include "components/ukm/ukm_service.h" 12 #include "components/ukm/ukm_service.h"
13 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
14 14
15 namespace internal { 15 namespace internal {
16 16
17 const char kUkmPageLoadEventName[] = "PageLoad"; 17 const char kUkmPageLoadEventName[] = "PageLoad";
18 const char kUkmParseStartName[] = "ParseTiming.NavigationToParseStart"; 18 const char kUkmParseStartName[] = "ParseTiming.NavigationToParseStart";
19 const char kUkmDomContentLoadedName[] = 19 const char kUkmDomContentLoadedName[] =
20 "DocumentTiming.NavigationToDOMContentLoadedEventFired"; 20 "DocumentTiming.NavigationToDOMContentLoadedEventFired";
21 const char kUkmLoadEventName[] = "DocumentTiming.NavigationToLoadEventFired"; 21 const char kUkmLoadEventName[] = "DocumentTiming.NavigationToLoadEventFired";
22 const char kUkmFirstContentfulPaintName[] = 22 const char kUkmFirstContentfulPaintName[] =
23 "PaintTiming.NavigationToFirstContentfulPaint"; 23 "PaintTiming.NavigationToFirstContentfulPaint";
24 const char kUkmFirstMeaningfulPaintName[] = 24 const char kUkmFirstMeaningfulPaintName[] =
25 "Experimental.PaintTiming.NavigationToFirstMeaningfulPaint"; 25 "Experimental.PaintTiming.NavigationToFirstMeaningfulPaint";
26 const char kUkmForegroundDurationName[] = "PageTiming.ForegroundDuration"; 26 const char kUkmForegroundDurationName[] = "PageTiming.ForegroundDuration";
27 const char kUkmFailedProvisionaLoadName[] =
28 "PageTiming.NavigationToFailedProvisionalLoad";
27 const char kUkmEffectiveConnectionType[] = 29 const char kUkmEffectiveConnectionType[] =
28 "Net.EffectiveConnectionType.OnNavigationStart"; 30 "Net.EffectiveConnectionType.OnNavigationStart";
31 const char kUkmNetErrorCode[] = "Net.ErrorCode.OnFailedProvisionalLoad";
32 const char kUkmPageTransition[] = "Navigation.PageTransition";
29 33
30 } // namespace internal 34 } // namespace internal
31 35
32 namespace { 36 namespace {
33 37
34 UINetworkQualityEstimatorService* GetNQEService( 38 UINetworkQualityEstimatorService* GetNQEService(
35 content::WebContents* web_contents) { 39 content::WebContents* web_contents) {
36 Profile* profile = 40 Profile* profile =
37 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 41 Profile::FromBrowserContext(web_contents->GetBrowserContext());
38 if (!profile) 42 if (!profile)
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 // page load, vs another kind of load (e.g. a download or a PDF). Thus, 75 // page load, vs another kind of load (e.g. a download or a PDF). Thus,
72 // metrics and source information should not be recorded here. Instead, we 76 // metrics and source information should not be recorded here. Instead, we
73 // store data we might want to persist in member variables below, and later 77 // store data we might want to persist in member variables below, and later
74 // record UKM metrics for that data once we've confirmed that we're observing 78 // record UKM metrics for that data once we've confirmed that we're observing
75 // a web page load. 79 // a web page load.
76 80
77 if (network_quality_provider_) { 81 if (network_quality_provider_) {
78 effective_connection_type_ = 82 effective_connection_type_ =
79 network_quality_provider_->GetEffectiveConnectionType(); 83 network_quality_provider_->GetEffectiveConnectionType();
80 } 84 }
85 page_transition_ = navigation_handle->GetPageTransition();
81 return CONTINUE_OBSERVING; 86 return CONTINUE_OBSERVING;
82 } 87 }
83 88
89 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnCommit(
90 content::NavigationHandle* navigation_handle) {
91 // The PageTransition for the navigation may be updated on commit.
92 page_transition_ = navigation_handle->GetPageTransition();
93 return CONTINUE_OBSERVING;
94 }
95
84 UkmPageLoadMetricsObserver::ObservePolicy 96 UkmPageLoadMetricsObserver::ObservePolicy
85 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( 97 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground(
86 const page_load_metrics::PageLoadTiming& timing, 98 const page_load_metrics::PageLoadTiming& timing,
87 const page_load_metrics::PageLoadExtraInfo& info) { 99 const page_load_metrics::PageLoadExtraInfo& info) {
88 RecordPageLoadExtraInfoMetrics(info, base::TimeTicks::Now()); 100 RecordPageLoadExtraInfoMetrics(info, base::TimeTicks::Now());
89 RecordTimingMetrics(timing); 101 RecordTimingMetrics(timing);
90 return STOP_OBSERVING; 102 return STOP_OBSERVING;
91 } 103 }
92 104
93 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( 105 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden(
94 const page_load_metrics::PageLoadTiming& timing, 106 const page_load_metrics::PageLoadTiming& timing,
95 const page_load_metrics::PageLoadExtraInfo& info) { 107 const page_load_metrics::PageLoadExtraInfo& info) {
96 RecordPageLoadExtraInfoMetrics( 108 RecordPageLoadExtraInfoMetrics(
97 info, base::TimeTicks() /* no app_background_time */); 109 info, base::TimeTicks() /* no app_background_time */);
98 RecordTimingMetrics(timing); 110 RecordTimingMetrics(timing);
99 return STOP_OBSERVING; 111 return STOP_OBSERVING;
100 } 112 }
101 113
102 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad( 114 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad(
103 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info, 115 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info,
104 const page_load_metrics::PageLoadExtraInfo& extra_info) { 116 const page_load_metrics::PageLoadExtraInfo& extra_info) {
105 RecordPageLoadExtraInfoMetrics( 117 RecordPageLoadExtraInfoMetrics(
106 extra_info, base::TimeTicks() /* no app_background_time */); 118 extra_info, base::TimeTicks() /* no app_background_time */);
119
120 ukm::UkmService* ukm_service = g_browser_process->ukm_service();
121 std::unique_ptr<ukm::UkmEntryBuilder> builder =
122 ukm_service->GetEntryBuilder(source_id_, internal::kUkmPageLoadEventName);
123 // Error codes have negative values, however we log net error code enum values
124 // for UMA histograms using the equivalent positive value. For consistency in
125 // UKM, we convert to a positive value here.
126 int64_t net_error_code = static_cast<int64_t>(failed_load_info.error) * -1;
127 DCHECK_GE(net_error_code, 0);
128 builder->AddMetric(internal::kUkmNetErrorCode, net_error_code);
129 builder->AddMetric(
130 internal::kUkmFailedProvisionaLoadName,
131 failed_load_info.time_to_failed_provisional_load.InMilliseconds());
107 } 132 }
108 133
109 void UkmPageLoadMetricsObserver::OnComplete( 134 void UkmPageLoadMetricsObserver::OnComplete(
110 const page_load_metrics::PageLoadTiming& timing, 135 const page_load_metrics::PageLoadTiming& timing,
111 const page_load_metrics::PageLoadExtraInfo& info) { 136 const page_load_metrics::PageLoadExtraInfo& info) {
112 RecordPageLoadExtraInfoMetrics( 137 RecordPageLoadExtraInfoMetrics(
113 info, base::TimeTicks() /* no app_background_time */); 138 info, base::TimeTicks() /* no app_background_time */);
114 RecordTimingMetrics(timing); 139 RecordTimingMetrics(timing);
115 } 140 }
116 141
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 page_load_metrics::GetInitialForegroundDuration(info, 180 page_load_metrics::GetInitialForegroundDuration(info,
156 app_background_time); 181 app_background_time);
157 if (foreground_duration) { 182 if (foreground_duration) {
158 builder->AddMetric(internal::kUkmForegroundDurationName, 183 builder->AddMetric(internal::kUkmForegroundDurationName,
159 foreground_duration.value().InMilliseconds()); 184 foreground_duration.value().InMilliseconds());
160 } 185 }
161 if (effective_connection_type_ != net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) { 186 if (effective_connection_type_ != net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {
162 builder->AddMetric(internal::kUkmEffectiveConnectionType, 187 builder->AddMetric(internal::kUkmEffectiveConnectionType,
163 static_cast<int64_t>(effective_connection_type_)); 188 static_cast<int64_t>(effective_connection_type_));
164 } 189 }
190 // page_transition_ fits in a uint32_t, so we can safely cast to int64_t.
191 builder->AddMetric(internal::kUkmPageTransition,
192 static_cast<int64_t>(page_transition_));
165 } 193 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698