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

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

Issue 2717413003: Add support for logging additional metrics in UKM. (Closed)
Patch Set: record URL at nav start 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 "components/ukm/ukm_service.h" 7 #include "components/ukm/ukm_service.h"
8 #include "components/ukm/ukm_source.h" 8 #include "components/ukm/ukm_source.h"
9 9
10 // static 10 // static
11 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver> 11 std::unique_ptr<page_load_metrics::PageLoadMetricsObserver>
12 UkmPageLoadMetricsObserver::CreateIfNeeded() { 12 UkmPageLoadMetricsObserver::CreateIfNeeded() {
13 if (!g_browser_process->ukm_service()) { 13 if (!g_browser_process->ukm_service()) {
14 return nullptr; 14 return nullptr;
15 } 15 }
16 16
17 return base::MakeUnique<UkmPageLoadMetricsObserver>(); 17 return base::MakeUnique<UkmPageLoadMetricsObserver>();
18 } 18 }
19 19
20 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver() {} 20 UkmPageLoadMetricsObserver::UkmPageLoadMetricsObserver()
21 : source_(base::MakeUnique<ukm::UkmSource>()) {}
22
23 UkmPageLoadMetricsObserver::~UkmPageLoadMetricsObserver() = default;
21 24
22 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart( 25 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnStart(
23 content::NavigationHandle* navigation_handle, 26 content::NavigationHandle* navigation_handle,
24 const GURL& currently_committed_url, 27 const GURL& currently_committed_url,
25 bool started_in_foreground) { 28 bool started_in_foreground) {
29 source_->set_url(navigation_handle->GetURL());
30 navigation_start_ = navigation_handle->NavigationStart();
26 return started_in_foreground ? CONTINUE_OBSERVING : STOP_OBSERVING; 31 return started_in_foreground ? CONTINUE_OBSERVING : STOP_OBSERVING;
27 } 32 }
28 33
29 UkmPageLoadMetricsObserver::ObservePolicy 34 UkmPageLoadMetricsObserver::ObservePolicy
30 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( 35 UkmPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground(
31 const page_load_metrics::PageLoadTiming& timing, 36 const page_load_metrics::PageLoadTiming& timing,
32 const page_load_metrics::PageLoadExtraInfo& info) { 37 const page_load_metrics::PageLoadExtraInfo& info) {
33 SendMetricsToUkm(timing, info); 38 PopulateTiming(timing);
39 PopulatePageLoadExtraInfo(info);
40
41 // FlushMetricsOnAppEnterBackground may be invoked in cases where the page
42 // load isn't 'done', but Chrome is being backgrounded and may be killed
43 // without any subsequent noifications. In these cases, if we don't have an
44 // end time already, we synthesize an end time using the current time.
45 if (!source_->total_time())
46 source_->set_total_time(base::TimeTicks::Now() - navigation_start_);
47
48 SendMetricsToUkm();
34 return STOP_OBSERVING; 49 return STOP_OBSERVING;
35 } 50 }
36 51
37 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden( 52 UkmPageLoadMetricsObserver::ObservePolicy UkmPageLoadMetricsObserver::OnHidden(
38 const page_load_metrics::PageLoadTiming& timing, 53 const page_load_metrics::PageLoadTiming& timing,
39 const page_load_metrics::PageLoadExtraInfo& info) { 54 const page_load_metrics::PageLoadExtraInfo& info) {
40 SendMetricsToUkm(timing, info); 55 PopulateTiming(timing);
56 PopulatePageLoadExtraInfo(info);
57 SendMetricsToUkm();
41 return STOP_OBSERVING; 58 return STOP_OBSERVING;
42 } 59 }
43 60
61 void UkmPageLoadMetricsObserver::OnFailedProvisionalLoad(
62 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info,
63 const page_load_metrics::PageLoadExtraInfo& extra_info) {
64 PopulatePageLoadExtraInfo(extra_info);
65 SendMetricsToUkm();
66 }
67
44 void UkmPageLoadMetricsObserver::OnComplete( 68 void UkmPageLoadMetricsObserver::OnComplete(
45 const page_load_metrics::PageLoadTiming& timing, 69 const page_load_metrics::PageLoadTiming& timing,
46 const page_load_metrics::PageLoadExtraInfo& info) { 70 const page_load_metrics::PageLoadExtraInfo& info) {
47 SendMetricsToUkm(timing, info); 71 PopulateTiming(timing);
72 PopulatePageLoadExtraInfo(info);
73 SendMetricsToUkm();
48 } 74 }
49 75
50 void UkmPageLoadMetricsObserver::SendMetricsToUkm( 76 void UkmPageLoadMetricsObserver::PopulateTiming(
51 const page_load_metrics::PageLoadTiming& timing, 77 const page_load_metrics::PageLoadTiming& timing) {
78 if (timing.parse_start)
79 source_->set_parse_start(timing.parse_start.value());
80 if (timing.first_contentful_paint)
81 source_->set_first_contentful_paint(timing.first_contentful_paint.value());
82 if (timing.first_meaningful_paint)
83 source_->set_first_meaningful_paint(timing.first_meaningful_paint.value());
84 }
85
86 void UkmPageLoadMetricsObserver::PopulatePageLoadExtraInfo(
52 const page_load_metrics::PageLoadExtraInfo& info) { 87 const page_load_metrics::PageLoadExtraInfo& info) {
53 if (!info.did_commit || !timing.first_contentful_paint) 88 source_->set_url(info.url);
54 return;
55 89
90 if (info.first_background_time) {
91 source_->set_total_time(info.first_background_time.value());
92 } else if (info.page_end_time) {
93 source_->set_total_time(info.page_end_time.value());
94 }
95 }
96
97 void UkmPageLoadMetricsObserver::SendMetricsToUkm() {
56 ukm::UkmService* ukm_service = g_browser_process->ukm_service(); 98 ukm::UkmService* ukm_service = g_browser_process->ukm_service();
57 DCHECK(ukm_service); 99 DCHECK(ukm_service);
58 100 ukm_service->RecordSource(std::move(source_));
59 std::unique_ptr<ukm::UkmSource> source = base::MakeUnique<ukm::UkmSource>(); 101 source_.reset();
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 } 102 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698