Index: chrome/browser/predictors/resource_prefetch_predictor.cc |
diff --git a/chrome/browser/predictors/resource_prefetch_predictor.cc b/chrome/browser/predictors/resource_prefetch_predictor.cc |
index d0b02a23f78ce0e8ef9c78a3566ea36f35e183f5..6fc6f595625666010b99376018b25d1c9aafe62d 100644 |
--- a/chrome/browser/predictors/resource_prefetch_predictor.cc |
+++ b/chrome/browser/predictors/resource_prefetch_predictor.cc |
@@ -34,6 +34,7 @@ |
#include "content/public/browser/resource_request_info.h" |
#include "content/public/browser/web_contents.h" |
#include "net/base/mime_util.h" |
+#include "net/base/network_change_notifier.h" |
#include "net/http/http_response_headers.h" |
#include "net/url_request/url_request.h" |
#include "net/url_request/url_request_context_getter.h" |
@@ -90,6 +91,103 @@ void RecordNavigationEvent(NavigationEvent event) { |
NAVIGATION_EVENT_COUNT); |
} |
+enum PagePrefetchedNetworkType { |
+ PAGE_PREFETCHED_NETWORK_TYPE_ALL = 0, |
+ PAGE_PREFETCHED_NETWORK_TYPE_NETWORK_UNKNOWN = 1, |
+ PAGE_PREFETCHED_NETWORK_TYPE_ETHERNET = 2, |
+ PAGE_PREFETCHED_NETWORK_TYPE_WIFI = 3, |
+ PAGE_PREFETCHED_NETWORK_TYPE_2G = 4, |
+ PAGE_PREFETCHED_NETWORK_TYPE_3G = 5, |
+ PAGE_PREFETCHED_NETWORK_TYPE_4G = 6, |
+ PAGE_PREFETCHED_NETWORK_TYPE_NETWORK_NONE = 7, |
+ PAGE_PREFETCHED_NETWORK_TYPE_BLUETOOTH = 8, |
+ PAGE_PREFETCHED_NETWORK_TYPE_CELLULAR = 9, |
+ PAGE_PREFETCHED_NETWORK_TYPE_COUNT = 10 |
+}; |
+ |
+enum PageNotPrefetchedNetworkType { |
tburkard
2014/10/08 07:58:29
can't these be combined into a single enum, or, be
Zhen Wang
2014/10/14 04:12:12
Reusing enum types from net now.
|
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_ALL = 0, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_NETWORK_UNKNOWN = 1, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_ETHERNET = 2, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_WIFI = 3, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_2G = 4, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_3G = 5, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_4G = 6, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_NETWORK_NONE = 7, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_BLUETOOTH = 8, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_CELLULAR = 9, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_COUNT = 10 |
+}; |
+ |
+std::string GetNetworkTypeString() { |
+ switch (net::NetworkChangeNotifier::GetConnectionType()) { |
+ case net::NetworkChangeNotifier::CONNECTION_ETHERNET: |
+ return "Ethernet"; |
+ case net::NetworkChangeNotifier::CONNECTION_WIFI: |
+ return "WiFi"; |
+ case net::NetworkChangeNotifier::CONNECTION_2G: |
+ return "2G"; |
+ case net::NetworkChangeNotifier::CONNECTION_3G: |
+ return "3G"; |
+ case net::NetworkChangeNotifier::CONNECTION_4G: |
+ return "4G"; |
+ case net::NetworkChangeNotifier::CONNECTION_NONE: |
+ return "NetworkNone"; |
+ case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH: |
+ return "Bluetooth"; |
+ case net::NetworkChangeNotifier::CONNECTION_UNKNOWN: |
+ default: |
+ break; |
+ } |
+ return "NetworkUnknown"; |
+} |
+ |
+PagePrefetchedNetworkType GetPagePrefetchedNetworkType() { |
+ switch (net::NetworkChangeNotifier::GetConnectionType()) { |
+ case net::NetworkChangeNotifier::CONNECTION_ETHERNET: |
+ return PAGE_PREFETCHED_NETWORK_TYPE_ETHERNET; |
+ case net::NetworkChangeNotifier::CONNECTION_WIFI: |
+ return PAGE_PREFETCHED_NETWORK_TYPE_WIFI; |
+ case net::NetworkChangeNotifier::CONNECTION_2G: |
+ return PAGE_PREFETCHED_NETWORK_TYPE_2G; |
+ case net::NetworkChangeNotifier::CONNECTION_3G: |
+ return PAGE_PREFETCHED_NETWORK_TYPE_3G; |
+ case net::NetworkChangeNotifier::CONNECTION_4G: |
+ return PAGE_PREFETCHED_NETWORK_TYPE_4G; |
+ case net::NetworkChangeNotifier::CONNECTION_NONE: |
+ return PAGE_PREFETCHED_NETWORK_TYPE_NETWORK_NONE; |
+ case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH: |
+ return PAGE_PREFETCHED_NETWORK_TYPE_BLUETOOTH; |
+ case net::NetworkChangeNotifier::CONNECTION_UNKNOWN: |
+ default: |
+ break; |
+ } |
+ return PAGE_PREFETCHED_NETWORK_TYPE_NETWORK_UNKNOWN; |
+} |
+ |
+PageNotPrefetchedNetworkType GetPageNotPrefetchedNetworkType() { |
+ switch (net::NetworkChangeNotifier::GetConnectionType()) { |
+ case net::NetworkChangeNotifier::CONNECTION_ETHERNET: |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_ETHERNET; |
+ case net::NetworkChangeNotifier::CONNECTION_WIFI: |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_WIFI; |
+ case net::NetworkChangeNotifier::CONNECTION_2G: |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_2G; |
+ case net::NetworkChangeNotifier::CONNECTION_3G: |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_3G; |
+ case net::NetworkChangeNotifier::CONNECTION_4G: |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_4G; |
+ case net::NetworkChangeNotifier::CONNECTION_NONE: |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_NETWORK_NONE; |
+ case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH: |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_BLUETOOTH; |
+ case net::NetworkChangeNotifier::CONNECTION_UNKNOWN: |
+ default: |
+ break; |
+ } |
+ return PAGE_NOT_PREFETCHED_NETWORK_TYPE_NETWORK_UNKNOWN; |
+} |
+ |
} // namespace |
namespace predictors { |
@@ -525,6 +623,8 @@ void ResourcePrefetchPredictor::OnNavigationComplete( |
RecordNavigationEvent(NAVIGATION_EVENT_ONLOAD_TRACKED_URL); |
// Report any stats. |
+ base::TimeDelta plt = base::TimeTicks::Now() - navigation_id.creation_time; |
+ ReportPageLoadTimeStats(plt); |
if (prefetch_manager_.get()) { |
ResultsMap::iterator results_it = results_map_.find(navigation_id); |
bool have_prefetch_results = results_it != results_map_.end(); |
@@ -534,6 +634,9 @@ void ResourcePrefetchPredictor::OnNavigationComplete( |
ReportAccuracyStats(results_it->second->key_type, |
*(nav_it->second), |
results_it->second->requests.get()); |
+ ReportPageLoadTimePrefetchedStats(results_it->second->key_type, plt); |
+ } else { |
+ ReportPageLoadTimeNotPrefetchedStats(plt); |
} |
} else { |
scoped_ptr<ResourcePrefetcher::RequestVector> requests( |
@@ -1001,7 +1104,96 @@ void ResourcePrefetchPredictor::LearnNavigation( |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// Accuracy measurement. |
+// Page load time and accuracy measurement. |
+ |
+#define REPORT_PLT(name, page_load_time) \ |
+ UMA_HISTOGRAM_CUSTOM_TIMES( \ |
+ name, \ |
+ page_load_time, \ |
+ base::TimeDelta::FromMilliseconds(10), \ |
+ base::TimeDelta::FromSeconds(60), \ |
+ 100) |
+ |
+ |
+void ResourcePrefetchPredictor::ReportPageLoadTimeStats( |
+ base::TimeDelta plt) const { |
+ bool on_cellular = |
+ net::NetworkChangeNotifier::IsConnectionCellular( |
+ net::NetworkChangeNotifier::GetConnectionType()); |
+ |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT", plt); |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT." + GetNetworkTypeString(), plt); |
+ if (on_cellular) |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.Cellular", plt); |
+} |
+ |
+void ResourcePrefetchPredictor::ReportPageLoadTimePrefetchedStats( |
+ PrefetchKeyType key_type, |
+ base::TimeDelta plt) const { |
+ bool on_cellular = |
+ net::NetworkChangeNotifier::IsConnectionCellular( |
+ net::NetworkChangeNotifier::GetConnectionType()); |
+ |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "ResourcePrefetchPredictor.PagePrefetchedNetworkType", |
+ PAGE_PREFETCHED_NETWORK_TYPE_ALL, |
+ PAGE_PREFETCHED_NETWORK_TYPE_COUNT); |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "ResourcePrefetchPredictor.PagePrefetchedNetworkType", |
+ GetPagePrefetchedNetworkType(), |
+ PAGE_PREFETCHED_NETWORK_TYPE_COUNT); |
+ if (on_cellular) { |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "ResourcePrefetchPredictor.PagePrefetchedNetworkType", |
+ PAGE_PREFETCHED_NETWORK_TYPE_CELLULAR, |
+ PAGE_PREFETCHED_NETWORK_TYPE_COUNT); |
+ } |
+ |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PagePrefetched", plt); |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PagePrefetched." |
+ + GetNetworkTypeString(), plt); |
+ if (on_cellular) |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PagePrefetched.Cellular", plt); |
+ |
+ std::string histogram_type = key_type == PREFETCH_KEY_TYPE_HOST ? "Host" : |
+ "Url"; |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PagePrefetched." + histogram_type, |
tburkard
2014/10/08 07:58:29
see comment below, this shouldn't work.
Zhen Wang
2014/10/14 04:12:12
Done.
|
+ plt); |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PagePrefetched." + histogram_type |
tburkard
2014/10/08 07:58:29
ditto
Zhen Wang
2014/10/14 04:12:12
Done.
|
+ + "." + GetNetworkTypeString(), plt); |
+ if (on_cellular) { |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PagePrefetched." + histogram_type |
+ + ".Cellular", plt); |
+ } |
+} |
+ |
+void ResourcePrefetchPredictor::ReportPageLoadTimeNotPrefetchedStats( |
+ base::TimeDelta plt) const { |
+ bool on_cellular = |
+ net::NetworkChangeNotifier::IsConnectionCellular( |
+ net::NetworkChangeNotifier::GetConnectionType()); |
+ |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "ResourcePrefetchPredictor.PageNotPrefetchedNetworkType", |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_ALL, |
+ PAGE_NOT_PREFETCHED_NETWORK_TYPE_COUNT); |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "ResourcePrefetchPredictor.PageNotPrefetchedNetworkType", |
+ GetPageNotPrefetchedNetworkType(), |
+ PAGE_PREFETCHED_NETWORK_TYPE_COUNT); |
+ if (on_cellular) { |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "ResourcePrefetchPredictor.PagePrefetchedNetworkType", |
+ PAGE_PREFETCHED_NETWORK_TYPE_CELLULAR, |
+ PAGE_PREFETCHED_NETWORK_TYPE_COUNT); |
+ } |
+ |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PageNotPrefetched", plt); |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PageNotPrefetched." |
+ + GetNetworkTypeString(), plt); |
tburkard
2014/10/08 07:58:29
This should not work, if the user switches network
Zhen Wang
2014/10/14 04:12:12
I see. I duplicate the UMA calls now.
|
+ if (on_cellular) |
+ REPORT_PLT("ResourcePrefetchPredictor.PLT.PageNotPrefetched.Cellular", plt); |
+} |
void ResourcePrefetchPredictor::ReportAccuracyStats( |
PrefetchKeyType key_type, |