Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "net/nqe/network_quality_estimator.h" | 5 #include "net/nqe/network_quality_estimator.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 38 #include "net/nqe/throughput_analyzer.h" | 38 #include "net/nqe/throughput_analyzer.h" |
| 39 #include "net/url_request/url_request.h" | 39 #include "net/url_request/url_request.h" |
| 40 #include "net/url_request/url_request_status.h" | 40 #include "net/url_request/url_request_status.h" |
| 41 #include "url/gurl.h" | 41 #include "url/gurl.h" |
| 42 | 42 |
| 43 #if defined(OS_ANDROID) | 43 #if defined(OS_ANDROID) |
| 44 #include "net/android/cellular_signal_strength.h" | 44 #include "net/android/cellular_signal_strength.h" |
| 45 #include "net/android/network_library.h" | 45 #include "net/android/network_library.h" |
| 46 #endif // OS_ANDROID | 46 #endif // OS_ANDROID |
| 47 | 47 |
| 48 namespace net { | |
|
RyanSturm
2016/12/13 18:02:20
Is this part of the change related? Can you add to
tbansal1
2016/12/13 21:21:13
Done.
| |
| 49 | |
| 48 namespace { | 50 namespace { |
| 49 | 51 |
| 50 // Returns the histogram that should be used to record the given statistic. | 52 // Returns the histogram that should be used to record the given statistic. |
| 51 // |max_limit| is the maximum value that can be stored in the histogram. | 53 // |max_limit| is the maximum value that can be stored in the histogram. |
| 52 base::HistogramBase* GetHistogram( | 54 base::HistogramBase* GetHistogram(const std::string& statistic_name, |
| 53 const std::string& statistic_name, | 55 NetworkChangeNotifier::ConnectionType type, |
| 54 net::NetworkChangeNotifier::ConnectionType type, | 56 int32_t max_limit) { |
| 55 int32_t max_limit) { | |
| 56 const base::LinearHistogram::Sample kLowerLimit = 1; | 57 const base::LinearHistogram::Sample kLowerLimit = 1; |
| 57 DCHECK_GT(max_limit, kLowerLimit); | 58 DCHECK_GT(max_limit, kLowerLimit); |
| 58 const size_t kBucketCount = 50; | 59 const size_t kBucketCount = 50; |
| 59 | 60 |
| 60 return base::Histogram::FactoryGet( | 61 return base::Histogram::FactoryGet( |
| 61 "NQE." + statistic_name + | 62 "NQE." + statistic_name + nqe::internal::GetNameForConnectionType(type), |
| 62 net::nqe::internal::GetNameForConnectionType(type), | |
| 63 kLowerLimit, max_limit, kBucketCount, | 63 kLowerLimit, max_limit, kBucketCount, |
| 64 base::HistogramBase::kUmaTargetedHistogramFlag); | 64 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 65 } | 65 } |
| 66 | 66 |
| 67 net::NetworkQualityObservationSource ProtocolSourceToObservationSource( | 67 NetworkQualityObservationSource ProtocolSourceToObservationSource( |
| 68 net::SocketPerformanceWatcherFactory::Protocol protocol) { | 68 SocketPerformanceWatcherFactory::Protocol protocol) { |
| 69 switch (protocol) { | 69 switch (protocol) { |
| 70 case net::SocketPerformanceWatcherFactory::PROTOCOL_TCP: | 70 case SocketPerformanceWatcherFactory::PROTOCOL_TCP: |
| 71 return net::NETWORK_QUALITY_OBSERVATION_SOURCE_TCP; | 71 return NETWORK_QUALITY_OBSERVATION_SOURCE_TCP; |
| 72 case net::SocketPerformanceWatcherFactory::PROTOCOL_QUIC: | 72 case SocketPerformanceWatcherFactory::PROTOCOL_QUIC: |
| 73 return net::NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC; | 73 return NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC; |
| 74 } | 74 } |
| 75 NOTREACHED(); | 75 NOTREACHED(); |
| 76 return net::NETWORK_QUALITY_OBSERVATION_SOURCE_TCP; | 76 return NETWORK_QUALITY_OBSERVATION_SOURCE_TCP; |
| 77 } | 77 } |
| 78 | 78 |
| 79 // Returns true if the scheme of the |request| is either HTTP or HTTPS. | 79 // Returns true if the scheme of the |request| is either HTTP or HTTPS. |
| 80 bool RequestSchemeIsHTTPOrHTTPS(const net::URLRequest& request) { | 80 bool RequestSchemeIsHTTPOrHTTPS(const URLRequest& request) { |
| 81 return request.url().is_valid() && request.url().SchemeIsHTTPOrHTTPS(); | 81 return request.url().is_valid() && request.url().SchemeIsHTTPOrHTTPS(); |
| 82 } | 82 } |
| 83 | 83 |
| 84 // Returns the suffix of the histogram that should be used for recording the | 84 // Returns the suffix of the histogram that should be used for recording the |
| 85 // accuracy when the observed RTT is |observed_rtt|. The width of the intervals | 85 // accuracy when the observed RTT is |observed_rtt|. The width of the intervals |
| 86 // are in exponentially increasing order. | 86 // are in exponentially increasing order. |
| 87 const char* GetHistogramSuffixObservedRTT(const base::TimeDelta& observed_rtt) { | 87 const char* GetHistogramSuffixObservedRTT(const base::TimeDelta& observed_rtt) { |
| 88 const float rtt_milliseconds = observed_rtt.InMillisecondsF(); | 88 const float rtt_milliseconds = observed_rtt.InMillisecondsF(); |
| 89 DCHECK_GE(rtt_milliseconds, 0); | 89 DCHECK_GE(rtt_milliseconds, 0); |
| 90 | 90 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 base::HistogramBase* histogram = base::Histogram::FactoryGet( | 182 base::HistogramBase* histogram = base::Histogram::FactoryGet( |
| 183 histogram_name, 1, 1000 * 1000 /* 1 Gbps */, 50 /* Number of buckets */, | 183 histogram_name, 1, 1000 * 1000 /* 1 Gbps */, 50 /* Number of buckets */, |
| 184 base::HistogramBase::kUmaTargetedHistogramFlag); | 184 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 185 histogram->Add(std::abs(metric)); | 185 histogram->Add(std::abs(metric)); |
| 186 } | 186 } |
| 187 | 187 |
| 188 void RecordEffectiveConnectionTypeAccuracy( | 188 void RecordEffectiveConnectionTypeAccuracy( |
| 189 const char* prefix, | 189 const char* prefix, |
| 190 int32_t metric, | 190 int32_t metric, |
| 191 base::TimeDelta measuring_duration, | 191 base::TimeDelta measuring_duration, |
| 192 net::EffectiveConnectionType observed_effective_connection_type) { | 192 EffectiveConnectionType observed_effective_connection_type) { |
| 193 const std::string histogram_name = | 193 const std::string histogram_name = base::StringPrintf( |
| 194 base::StringPrintf("%s.EstimatedObservedDiff.%s.%d.%s", prefix, | 194 "%s.EstimatedObservedDiff.%s.%d.%s", prefix, |
| 195 metric >= 0 ? "Positive" : "Negative", | 195 metric >= 0 ? "Positive" : "Negative", |
| 196 static_cast<int32_t>(measuring_duration.InSeconds()), | 196 static_cast<int32_t>(measuring_duration.InSeconds()), |
| 197 net::GetNameForEffectiveConnectionType( | 197 GetNameForEffectiveConnectionType(observed_effective_connection_type)); |
| 198 observed_effective_connection_type)); | |
| 199 | 198 |
| 200 base::HistogramBase* histogram = base::Histogram::FactoryGet( | 199 base::HistogramBase* histogram = base::Histogram::FactoryGet( |
| 201 histogram_name, 0, net::EFFECTIVE_CONNECTION_TYPE_LAST, | 200 histogram_name, 0, EFFECTIVE_CONNECTION_TYPE_LAST, |
| 202 net::EFFECTIVE_CONNECTION_TYPE_LAST /* Number of buckets */, | 201 EFFECTIVE_CONNECTION_TYPE_LAST /* Number of buckets */, |
| 203 base::HistogramBase::kUmaTargetedHistogramFlag); | 202 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 204 histogram->Add(std::abs(metric)); | 203 histogram->Add(std::abs(metric)); |
| 205 } | 204 } |
| 206 | 205 |
| 207 } // namespace | 206 } // namespace |
| 208 | 207 |
| 209 namespace net { | |
| 210 | |
| 211 NetworkQualityEstimator::NetworkQualityEstimator( | 208 NetworkQualityEstimator::NetworkQualityEstimator( |
| 212 std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, | 209 std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, |
| 213 const std::map<std::string, std::string>& variation_params) | 210 const std::map<std::string, std::string>& variation_params) |
| 214 : NetworkQualityEstimator(std::move(external_estimates_provider), | 211 : NetworkQualityEstimator(std::move(external_estimates_provider), |
| 215 variation_params, | 212 variation_params, |
| 216 false, | 213 false, |
| 217 false) {} | 214 false) {} |
| 218 | 215 |
| 219 NetworkQualityEstimator::NetworkQualityEstimator( | 216 NetworkQualityEstimator::NetworkQualityEstimator( |
| 220 std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, | 217 std::unique_ptr<ExternalEstimateProvider> external_estimates_provider, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 239 {"TransportRTTOrDownstreamThroughput", | 236 {"TransportRTTOrDownstreamThroughput", |
| 240 EffectiveConnectionTypeAlgorithm:: | 237 EffectiveConnectionTypeAlgorithm:: |
| 241 TRANSPORT_RTT_OR_DOWNSTREAM_THROUGHOUT}}), | 238 TRANSPORT_RTT_OR_DOWNSTREAM_THROUGHOUT}}), |
| 242 use_localhost_requests_(use_local_host_requests_for_tests), | 239 use_localhost_requests_(use_local_host_requests_for_tests), |
| 243 use_small_responses_(use_smaller_responses_for_tests), | 240 use_small_responses_(use_smaller_responses_for_tests), |
| 244 add_default_platform_observations_(add_default_platform_observations), | 241 add_default_platform_observations_(add_default_platform_observations), |
| 245 weight_multiplier_per_second_( | 242 weight_multiplier_per_second_( |
| 246 nqe::internal::GetWeightMultiplierPerSecond(variation_params)), | 243 nqe::internal::GetWeightMultiplierPerSecond(variation_params)), |
| 247 effective_connection_type_algorithm_( | 244 effective_connection_type_algorithm_( |
| 248 algorithm_name_to_enum_.find( | 245 algorithm_name_to_enum_.find( |
| 249 net::nqe::internal::GetEffectiveConnectionTypeAlgorithm( | 246 nqe::internal::GetEffectiveConnectionTypeAlgorithm( |
| 250 variation_params)) == algorithm_name_to_enum_.end() | 247 variation_params)) == algorithm_name_to_enum_.end() |
| 251 ? kDefaultEffectiveConnectionTypeAlgorithm | 248 ? kDefaultEffectiveConnectionTypeAlgorithm |
| 252 : algorithm_name_to_enum_ | 249 : algorithm_name_to_enum_ |
| 253 .find( | 250 .find(nqe::internal::GetEffectiveConnectionTypeAlgorithm( |
| 254 net::nqe::internal::GetEffectiveConnectionTypeAlgorithm( | 251 variation_params)) |
| 255 variation_params)) | |
| 256 ->second), | 252 ->second), |
| 257 tick_clock_(new base::DefaultTickClock()), | 253 tick_clock_(new base::DefaultTickClock()), |
| 258 last_connection_change_(tick_clock_->NowTicks()), | 254 last_connection_change_(tick_clock_->NowTicks()), |
| 259 current_network_id_(nqe::internal::NetworkID( | 255 current_network_id_(nqe::internal::NetworkID( |
| 260 NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, | 256 NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, |
| 261 std::string())), | 257 std::string())), |
| 262 downstream_throughput_kbps_observations_(weight_multiplier_per_second_), | 258 downstream_throughput_kbps_observations_(weight_multiplier_per_second_), |
| 263 rtt_observations_(weight_multiplier_per_second_), | 259 rtt_observations_(weight_multiplier_per_second_), |
| 264 effective_connection_type_at_last_main_frame_( | 260 effective_connection_type_at_last_main_frame_( |
| 265 EFFECTIVE_CONNECTION_TYPE_UNKNOWN), | 261 EFFECTIVE_CONNECTION_TYPE_UNKNOWN), |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 | 396 |
| 401 if (!RequestSchemeIsHTTPOrHTTPS(request) || | 397 if (!RequestSchemeIsHTTPOrHTTPS(request) || |
| 402 !RequestProvidesRTTObservation(request)) { | 398 !RequestProvidesRTTObservation(request)) { |
| 403 return; | 399 return; |
| 404 } | 400 } |
| 405 | 401 |
| 406 const base::TimeTicks now = tick_clock_->NowTicks(); | 402 const base::TimeTicks now = tick_clock_->NowTicks(); |
| 407 | 403 |
| 408 // Update |estimated_quality_at_last_main_frame_| if this is a main frame | 404 // Update |estimated_quality_at_last_main_frame_| if this is a main frame |
| 409 // request. | 405 // request. |
| 410 if (request.load_flags() & LOAD_MAIN_FRAME_DEPRECATED) { | 406 if (request.load_flags() & LOAD_MAIN_FRAME_DEPRECATED) { |
|
RyanSturm
2016/12/13 18:02:20
In a later CL can you refactor this block into a m
tbansal1
2016/12/13 21:21:13
Done.
| |
| 411 last_main_frame_request_ = now; | 407 last_main_frame_request_ = now; |
| 412 | 408 |
| 413 ComputeEffectiveConnectionType(); | 409 ComputeEffectiveConnectionType(); |
| 414 effective_connection_type_at_last_main_frame_ = effective_connection_type_; | 410 effective_connection_type_at_last_main_frame_ = effective_connection_type_; |
| 415 estimated_quality_at_last_main_frame_ = network_quality_; | 411 estimated_quality_at_last_main_frame_ = network_quality_; |
| 416 | 412 |
| 417 RecordMetricsOnMainFrameRequest(); | 413 RecordMetricsOnMainFrameRequest(); |
| 418 MaybeQueryExternalEstimateProvider(); | 414 MaybeQueryExternalEstimateProvider(); |
| 419 | 415 |
| 420 // Post the tasks which will run in the future and record the estimation | 416 // Post the tasks which will run in the future and record the estimation |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 767 peak_network_quality_ = nqe::internal::NetworkQuality(); | 763 peak_network_quality_ = nqe::internal::NetworkQuality(); |
| 768 downstream_throughput_kbps_observations_.Clear(); | 764 downstream_throughput_kbps_observations_.Clear(); |
| 769 rtt_observations_.Clear(); | 765 rtt_observations_.Clear(); |
| 770 | 766 |
| 771 #if defined(OS_ANDROID) | 767 #if defined(OS_ANDROID) |
| 772 if (NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) { | 768 if (NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) { |
| 773 UMA_HISTOGRAM_BOOLEAN( | 769 UMA_HISTOGRAM_BOOLEAN( |
| 774 "NQE.CellularSignalStrengthAvailable", | 770 "NQE.CellularSignalStrengthAvailable", |
| 775 min_signal_strength_since_connection_change_ != INT32_MAX && | 771 min_signal_strength_since_connection_change_ != INT32_MAX && |
| 776 max_signal_strength_since_connection_change_ != INT32_MIN); | 772 max_signal_strength_since_connection_change_ != INT32_MIN); |
| 773 | |
| 774 if (min_signal_strength_since_connection_change_ != INT32_MAX && | |
| 775 max_signal_strength_since_connection_change_ != INT32_MIN) { | |
| 776 UMA_HISTOGRAM_COUNTS_100( | |
| 777 "NQE.CellularSignalStrengthDifference", | |
| 778 max_signal_strength_since_connection_change_ - | |
| 779 min_signal_strength_since_connection_change_); | |
| 780 } | |
| 777 } | 781 } |
| 778 #endif // OS_ANDROID | 782 #endif // OS_ANDROID |
| 783 | |
| 779 min_signal_strength_since_connection_change_ = INT32_MAX; | 784 min_signal_strength_since_connection_change_ = INT32_MAX; |
| 780 max_signal_strength_since_connection_change_ = INT32_MIN; | 785 max_signal_strength_since_connection_change_ = INT32_MIN; |
| 781 network_quality_ = nqe::internal::NetworkQuality(); | 786 network_quality_ = nqe::internal::NetworkQuality(); |
| 782 effective_connection_type_ = EFFECTIVE_CONNECTION_TYPE_UNKNOWN; | 787 effective_connection_type_ = EFFECTIVE_CONNECTION_TYPE_UNKNOWN; |
| 783 effective_connection_type_at_last_main_frame_ = | 788 effective_connection_type_at_last_main_frame_ = |
| 784 EFFECTIVE_CONNECTION_TYPE_UNKNOWN; | 789 EFFECTIVE_CONNECTION_TYPE_UNKNOWN; |
| 785 | 790 |
| 786 // Update the local state as part of preparation for the new connection. | 791 // Update the local state as part of preparation for the new connection. |
| 787 current_network_id_ = GetCurrentNetworkID(); | 792 current_network_id_ = GetCurrentNetworkID(); |
| 788 RecordNetworkIDAvailability(); | 793 RecordNetworkIDAvailability(); |
| (...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1593 void NetworkQualityEstimator::OnPrefsRead( | 1598 void NetworkQualityEstimator::OnPrefsRead( |
| 1594 const std::map<nqe::internal::NetworkID, | 1599 const std::map<nqe::internal::NetworkID, |
| 1595 nqe::internal::CachedNetworkQuality> read_prefs) { | 1600 nqe::internal::CachedNetworkQuality> read_prefs) { |
| 1596 DCHECK(thread_checker_.CalledOnValidThread()); | 1601 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1597 UMA_HISTOGRAM_COUNTS("NQE.Prefs.ReadSize", read_prefs.size()); | 1602 UMA_HISTOGRAM_COUNTS("NQE.Prefs.ReadSize", read_prefs.size()); |
| 1598 // TODO(tbansal): crbug.com/490870. Incorporate the network quality into the | 1603 // TODO(tbansal): crbug.com/490870. Incorporate the network quality into the |
| 1599 // current estimates. | 1604 // current estimates. |
| 1600 } | 1605 } |
| 1601 | 1606 |
| 1602 } // namespace net | 1607 } // namespace net |
| OLD | NEW |