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

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

Issue 2740403002: Persist EffectiveConnectionType in UKM on navigation start. (Closed)
Patch Set: fix ordering 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"
8 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service_factory.h"
7 #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"
8 #include "components/ukm/ukm_entry_builder.h" 11 #include "components/ukm/ukm_entry_builder.h"
9 #include "components/ukm/ukm_service.h" 12 #include "components/ukm/ukm_service.h"
13 #include "content/public/browser/web_contents.h"
10 14
11 namespace internal { 15 namespace internal {
12 16
13 const char kUkmPageLoadEventName[] = "PageLoad"; 17 const char kUkmPageLoadEventName[] = "PageLoad";
14 const char kUkmParseStartName[] = "ParseTiming.NavigationToParseStart"; 18 const char kUkmParseStartName[] = "ParseTiming.NavigationToParseStart";
15 const char kUkmDomContentLoadedName[] = 19 const char kUkmDomContentLoadedName[] =
16 "DocumentTiming.NavigationToDOMContentLoadedEventFired"; 20 "DocumentTiming.NavigationToDOMContentLoadedEventFired";
17 const char kUkmLoadEventName[] = "DocumentTiming.NavigationToLoadEventFired"; 21 const char kUkmLoadEventName[] = "DocumentTiming.NavigationToLoadEventFired";
18 const char kUkmFirstContentfulPaintName[] = 22 const char kUkmFirstContentfulPaintName[] =
19 "PaintTiming.NavigationToFirstContentfulPaint"; 23 "PaintTiming.NavigationToFirstContentfulPaint";
20 const char kUkmFirstMeaningfulPaintName[] = 24 const char kUkmFirstMeaningfulPaintName[] =
21 "Experimental.PaintTiming.NavigationToFirstMeaningfulPaint"; 25 "Experimental.PaintTiming.NavigationToFirstMeaningfulPaint";
22 const char kUkmForegroundDurationName[] = "PageTiming.ForegroundDuration"; 26 const char kUkmForegroundDurationName[] = "PageTiming.ForegroundDuration";
27 const char kUkmEffectiveConnectionType[] =
28 "Net.EffectiveConnectionType.OnNavigationStart";
23 29
24 } // namespace internal 30 } // namespace internal
25 31
32 namespace {
33
34 UINetworkQualityEstimatorService* GetNQEService(
35 content::WebContents* web_contents) {
36 Profile* profile =
37 Profile::FromBrowserContext(web_contents->GetBrowserContext());
38 if (!profile)
39 return nullptr;
40 return UINetworkQualityEstimatorServiceFactory::GetForProfile(profile);
41 }
42
43 } // namespace
44
26 // static 45 // static
27 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver> 46 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver>
28 UkmPageLoadMetricsObserver::CreateIfNeeded() { 47 UkmPageLoadMetricsObserver::CreateIfNeeded(content::WebContents* web_contents) {
29 if (!g_browser_process->ukm_service()) { 48 if (!g_browser_process->ukm_service()) {
30 return nullptr; 49 return nullptr;
31 } 50 }
32 51 return base::MakeUnique<UkmPageLoadMetricsObserver>(
33 return base::MakeUnique<UkmPageLoadMetricsObserver>(); 52 GetNQEService(web_contents));
34 } 53 }
35 54
36 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver() 55 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver(
37 : source_id_(ukm::UkmService::GetNewSourceID()) {} 56 net::NetworkQualityEstimator::NetworkQualityProvider*
57 network_quality_provider)
58 : network_quality_provider_(network_quality_provider),
59 source_id_(ukm::UkmService::GetNewSourceID()) {}
38 60
39 UkmPageLoadMetricsObserver::~UkmPageLoadMetricsObserver() = default; 61 UkmPageLoadMetricsObserver::~UkmPageLoadMetricsObserver() = default;
40 62
41 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart( 63 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart(
42 content::NavigationHandle* navigation_handle, 64 content::NavigationHandle* navigation_handle,
43 const GURL& currently_committed_url, 65 const GURL& currently_committed_url,
44 bool started_in_foreground) { 66 bool started_in_foreground) {
45 if (!started_in_foreground) 67 if (!started_in_foreground)
46 return STOP_OBSERVING; 68 return STOP_OBSERVING;
47 69
48 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); 70 // When OnStart is invoked, we don't yet know whether we're observing a web
49 ukm_service->UpdateSourceURL(source_id_, navigation_handle->GetURL()); 71 // 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
73 // 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
75 // a web page load.
76
77 if (network_quality_provider_) {
78 effective_connection_type_ =
79 network_quality_provider_->GetEffectiveConnectionType();
80 }
50 return CONTINUE_OBSERVING; 81 return CONTINUE_OBSERVING;
51 } 82 }
52 83
53 UkmPageLoadMetricsObserver::ObservePolicy 84 UkmPageLoadMetricsObserver::ObservePolicy
54 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( 85 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground(
55 const page_load_metrics::PageLoadTiming& timing, 86 const page_load_metrics::PageLoadTiming& timing,
56 const page_load_metrics::PageLoadExtraInfo& info) { 87 const page_load_metrics::PageLoadExtraInfo& info) {
88 RecordPageLoadExtraInfoMetrics(info, base::TimeTicks::Now());
57 RecordTimingMetrics(timing); 89 RecordTimingMetrics(timing);
58 RecordPageLoadExtraInfoMetrics(info, base::TimeTicks::Now());
59 return STOP_OBSERVING; 90 return STOP_OBSERVING;
60 } 91 }
61 92
62 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( 93 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden(
63 const page_load_metrics::PageLoadTiming& timing, 94 const page_load_metrics::PageLoadTiming& timing,
64 const page_load_metrics::PageLoadExtraInfo& info) { 95 const page_load_metrics::PageLoadExtraInfo& info) {
65 RecordTimingMetrics(timing);
66 RecordPageLoadExtraInfoMetrics( 96 RecordPageLoadExtraInfoMetrics(
67 info, base::TimeTicks() /* no app_background_time */); 97 info, base::TimeTicks() /* no app_background_time */);
98 RecordTimingMetrics(timing);
68 return STOP_OBSERVING; 99 return STOP_OBSERVING;
69 } 100 }
70 101
71 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad( 102 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad(
72 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info, 103 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info,
73 const page_load_metrics::PageLoadExtraInfo& extra_info) { 104 const page_load_metrics::PageLoadExtraInfo& extra_info) {
74 RecordPageLoadExtraInfoMetrics( 105 RecordPageLoadExtraInfoMetrics(
75 extra_info, base::TimeTicks() /* no app_background_time */); 106 extra_info, base::TimeTicks() /* no app_background_time */);
76 } 107 }
77 108
78 void UkmPageLoadMetricsObserver::OnComplete( 109 void UkmPageLoadMetricsObserver::OnComplete(
79 const page_load_metrics::PageLoadTiming& timing, 110 const page_load_metrics::PageLoadTiming& timing,
80 const page_load_metrics::PageLoadExtraInfo& info) { 111 const page_load_metrics::PageLoadExtraInfo& info) {
81 RecordTimingMetrics(timing);
82 RecordPageLoadExtraInfoMetrics( 112 RecordPageLoadExtraInfoMetrics(
83 info, base::TimeTicks() /* no app_background_time */); 113 info, base::TimeTicks() /* no app_background_time */);
114 RecordTimingMetrics(timing);
84 } 115 }
85 116
86 void UkmPageLoadMetricsObserver::RecordTimingMetrics( 117 void UkmPageLoadMetricsObserver::RecordTimingMetrics(
87 const page_load_metrics::PageLoadTiming& timing) { 118 const page_load_metrics::PageLoadTiming& timing) {
88 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); 119 ukm::UkmService* ukm_service = g_browser_process->ukm_service();
89 std::unique_ptr<ukm::UkmEntryBuilder> builder = 120 std::unique_ptr<ukm::UkmEntryBuilder> builder =
90 ukm_service->GetEntryBuilder(source_id_, internal::kUkmPageLoadEventName); 121 ukm_service->GetEntryBuilder(source_id_, internal::kUkmPageLoadEventName);
91 if (timing.parse_start) { 122 if (timing.parse_start) {
92 builder->AddMetric(internal::kUkmParseStartName, 123 builder->AddMetric(internal::kUkmParseStartName,
93 timing.parse_start.value().InMilliseconds()); 124 timing.parse_start.value().InMilliseconds());
(...skipping 14 matching lines...) Expand all
108 if (timing.first_meaningful_paint) { 139 if (timing.first_meaningful_paint) {
109 builder->AddMetric(internal::kUkmFirstMeaningfulPaintName, 140 builder->AddMetric(internal::kUkmFirstMeaningfulPaintName,
110 timing.first_meaningful_paint.value().InMilliseconds()); 141 timing.first_meaningful_paint.value().InMilliseconds());
111 } 142 }
112 } 143 }
113 144
114 void UkmPageLoadMetricsObserver::RecordPageLoadExtraInfoMetrics( 145 void UkmPageLoadMetricsObserver::RecordPageLoadExtraInfoMetrics(
115 const page_load_metrics::PageLoadExtraInfo& info, 146 const page_load_metrics::PageLoadExtraInfo& info,
116 base::TimeTicks app_background_time) { 147 base::TimeTicks app_background_time) {
117 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); 148 ukm::UkmService* ukm_service = g_browser_process->ukm_service();
149 ukm_service->UpdateSourceURL(source_id_, info.start_url);
118 ukm_service->UpdateSourceURL(source_id_, info.url); 150 ukm_service->UpdateSourceURL(source_id_, info.url);
119 151
152 std::unique_ptr<ukm::UkmEntryBuilder> builder =
153 ukm_service->GetEntryBuilder(source_id_, internal::kUkmPageLoadEventName);
120 base::Optional<base::TimeDelta> foreground_duration = 154 base::Optional<base::TimeDelta> foreground_duration =
121 page_load_metrics::GetInitialForegroundDuration(info, 155 page_load_metrics::GetInitialForegroundDuration(info,
122 app_background_time); 156 app_background_time);
123 if (foreground_duration) { 157 if (foreground_duration) {
124 std::unique_ptr<ukm::UkmEntryBuilder> builder =
125 ukm_service->GetEntryBuilder(source_id_,
126 internal::kUkmPageLoadEventName);
127 builder->AddMetric(internal::kUkmForegroundDurationName, 158 builder->AddMetric(internal::kUkmForegroundDurationName,
128 foreground_duration.value().InMilliseconds()); 159 foreground_duration.value().InMilliseconds());
129 } 160 }
161 if (effective_connection_type_ != net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {
162 builder->AddMetric(internal::kUkmEffectiveConnectionType,
163 static_cast<int64_t>(effective_connection_type_));
164 }
130 } 165 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698