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 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 correlation_uma_logging_probability_( | 285 correlation_uma_logging_probability_( |
286 nqe::internal::correlation_uma_logging_probability(variation_params)), | 286 nqe::internal::correlation_uma_logging_probability(variation_params)), |
287 forced_effective_connection_type_set_( | 287 forced_effective_connection_type_set_( |
288 nqe::internal::forced_effective_connection_type_set( | 288 nqe::internal::forced_effective_connection_type_set( |
289 variation_params)), | 289 variation_params)), |
290 forced_effective_connection_type_( | 290 forced_effective_connection_type_( |
291 nqe::internal::forced_effective_connection_type(variation_params)), | 291 nqe::internal::forced_effective_connection_type(variation_params)), |
292 persistent_cache_reading_enabled_( | 292 persistent_cache_reading_enabled_( |
293 nqe::internal::persistent_cache_reading_enabled(variation_params)), | 293 nqe::internal::persistent_cache_reading_enabled(variation_params)), |
294 event_creator_(net_log), | 294 event_creator_(net_log), |
| 295 disallowed_observation_sources_for_http_( |
| 296 {NETWORK_QUALITY_OBSERVATION_SOURCE_TCP, |
| 297 NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC, |
| 298 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE, |
| 299 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM}), |
| 300 disallowed_observation_sources_for_transport_( |
| 301 {NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP, |
| 302 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE, |
| 303 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE, |
| 304 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_HTTP_FROM_PLATFORM}), |
295 weak_ptr_factory_(this) { | 305 weak_ptr_factory_(this) { |
296 // None of the algorithms can have an empty name. | 306 // None of the algorithms can have an empty name. |
297 DCHECK(algorithm_name_to_enum_.end() == | 307 DCHECK(algorithm_name_to_enum_.end() == |
298 algorithm_name_to_enum_.find(std::string())); | 308 algorithm_name_to_enum_.find(std::string())); |
299 | 309 |
300 DCHECK_EQ(algorithm_name_to_enum_.size(), | 310 DCHECK_EQ(algorithm_name_to_enum_.size(), |
301 static_cast<size_t>(EffectiveConnectionTypeAlgorithm:: | 311 static_cast<size_t>(EffectiveConnectionTypeAlgorithm:: |
302 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST)); | 312 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST)); |
303 DCHECK_NE(EffectiveConnectionTypeAlgorithm:: | 313 DCHECK_NE(EffectiveConnectionTypeAlgorithm:: |
304 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST, | 314 EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST, |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 | 899 |
890 base::TimeDelta rtt; | 900 base::TimeDelta rtt; |
891 if (GetRecentHttpRTT(base::TimeTicks(), &rtt)) { | 901 if (GetRecentHttpRTT(base::TimeTicks(), &rtt)) { |
892 // Add the 50th percentile value. | 902 // Add the 50th percentile value. |
893 base::HistogramBase* rtt_percentile = | 903 base::HistogramBase* rtt_percentile = |
894 GetHistogram("RTT.Percentile50.", current_network_id_.type, 10 * 1000); | 904 GetHistogram("RTT.Percentile50.", current_network_id_.type, 10 * 1000); |
895 rtt_percentile->Add(rtt.InMilliseconds()); | 905 rtt_percentile->Add(rtt.InMilliseconds()); |
896 | 906 |
897 // Add the remaining percentile values. | 907 // Add the remaining percentile values. |
898 static const int kPercentiles[] = {0, 10, 90, 100}; | 908 static const int kPercentiles[] = {0, 10, 90, 100}; |
899 std::vector<NetworkQualityObservationSource> disallowed_observation_sources; | |
900 disallowed_observation_sources.push_back( | |
901 NETWORK_QUALITY_OBSERVATION_SOURCE_TCP); | |
902 disallowed_observation_sources.push_back( | |
903 NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC); | |
904 disallowed_observation_sources.push_back( | |
905 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE); | |
906 disallowed_observation_sources.push_back( | |
907 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM); | |
908 for (size_t i = 0; i < arraysize(kPercentiles); ++i) { | 909 for (size_t i = 0; i < arraysize(kPercentiles); ++i) { |
909 rtt = GetRTTEstimateInternal(disallowed_observation_sources, | 910 rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_http_, |
910 base::TimeTicks(), kPercentiles[i]); | 911 base::TimeTicks(), kPercentiles[i]); |
911 | 912 |
912 rtt_percentile = GetHistogram( | 913 rtt_percentile = GetHistogram( |
913 "RTT.Percentile" + base::IntToString(kPercentiles[i]) + ".", | 914 "RTT.Percentile" + base::IntToString(kPercentiles[i]) + ".", |
914 current_network_id_.type, 10 * 1000); // 10 seconds | 915 current_network_id_.type, 10 * 1000); // 10 seconds |
915 rtt_percentile->Add(rtt.InMilliseconds()); | 916 rtt_percentile->Add(rtt.InMilliseconds()); |
916 } | 917 } |
917 } | 918 } |
918 | 919 |
919 if (GetRecentTransportRTT(base::TimeTicks(), &rtt)) { | 920 if (GetRecentTransportRTT(base::TimeTicks(), &rtt)) { |
920 // Add the 50th percentile value. | 921 // Add the 50th percentile value. |
921 base::HistogramBase* transport_rtt_percentile = GetHistogram( | 922 base::HistogramBase* transport_rtt_percentile = GetHistogram( |
922 "TransportRTT.Percentile50.", current_network_id_.type, 10 * 1000); | 923 "TransportRTT.Percentile50.", current_network_id_.type, 10 * 1000); |
923 transport_rtt_percentile->Add(rtt.InMilliseconds()); | 924 transport_rtt_percentile->Add(rtt.InMilliseconds()); |
924 | 925 |
925 // Add the remaining percentile values. | 926 // Add the remaining percentile values. |
926 static const int kPercentiles[] = {0, 10, 90, 100}; | 927 static const int kPercentiles[] = {0, 10, 90, 100}; |
927 std::vector<NetworkQualityObservationSource> disallowed_observation_sources; | |
928 disallowed_observation_sources.push_back( | |
929 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); | |
930 // Disallow external estimate provider since it provides RTT at HTTP layer. | |
931 disallowed_observation_sources.push_back( | |
932 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); | |
933 disallowed_observation_sources.push_back( | |
934 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE); | |
935 disallowed_observation_sources.push_back( | |
936 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_HTTP_FROM_PLATFORM); | |
937 for (size_t i = 0; i < arraysize(kPercentiles); ++i) { | 928 for (size_t i = 0; i < arraysize(kPercentiles); ++i) { |
938 rtt = GetRTTEstimateInternal(disallowed_observation_sources, | 929 rtt = |
939 base::TimeTicks(), kPercentiles[i]); | 930 GetRTTEstimateInternal(disallowed_observation_sources_for_transport_, |
| 931 base::TimeTicks(), kPercentiles[i]); |
940 | 932 |
941 transport_rtt_percentile = GetHistogram( | 933 transport_rtt_percentile = GetHistogram( |
942 "TransportRTT.Percentile" + base::IntToString(kPercentiles[i]) + ".", | 934 "TransportRTT.Percentile" + base::IntToString(kPercentiles[i]) + ".", |
943 current_network_id_.type, 10 * 1000); // 10 seconds | 935 current_network_id_.type, 10 * 1000); // 10 seconds |
944 transport_rtt_percentile->Add(rtt.InMilliseconds()); | 936 transport_rtt_percentile->Add(rtt.InMilliseconds()); |
945 } | 937 } |
946 } | 938 } |
947 } | 939 } |
948 | 940 |
949 void NetworkQualityEstimator::RecordNetworkIDAvailability() const { | 941 void NetworkQualityEstimator::RecordNetworkIDAvailability() const { |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1284 void NetworkQualityEstimator::RemoveRTTAndThroughputEstimatesObserver( | 1276 void NetworkQualityEstimator::RemoveRTTAndThroughputEstimatesObserver( |
1285 RTTAndThroughputEstimatesObserver* observer) { | 1277 RTTAndThroughputEstimatesObserver* observer) { |
1286 DCHECK(thread_checker_.CalledOnValidThread()); | 1278 DCHECK(thread_checker_.CalledOnValidThread()); |
1287 rtt_and_throughput_estimates_observer_list_.RemoveObserver(observer); | 1279 rtt_and_throughput_estimates_observer_list_.RemoveObserver(observer); |
1288 } | 1280 } |
1289 | 1281 |
1290 bool NetworkQualityEstimator::GetRecentHttpRTT( | 1282 bool NetworkQualityEstimator::GetRecentHttpRTT( |
1291 const base::TimeTicks& start_time, | 1283 const base::TimeTicks& start_time, |
1292 base::TimeDelta* rtt) const { | 1284 base::TimeDelta* rtt) const { |
1293 DCHECK(thread_checker_.CalledOnValidThread()); | 1285 DCHECK(thread_checker_.CalledOnValidThread()); |
1294 std::vector<NetworkQualityObservationSource> disallowed_observation_sources; | 1286 *rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_http_, |
1295 disallowed_observation_sources.push_back( | 1287 start_time, 50); |
1296 NETWORK_QUALITY_OBSERVATION_SOURCE_TCP); | |
1297 disallowed_observation_sources.push_back( | |
1298 NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC); | |
1299 disallowed_observation_sources.push_back( | |
1300 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE); | |
1301 disallowed_observation_sources.push_back( | |
1302 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM); | |
1303 *rtt = GetRTTEstimateInternal(disallowed_observation_sources, start_time, 50); | |
1304 return (*rtt != nqe::internal::InvalidRTT()); | 1288 return (*rtt != nqe::internal::InvalidRTT()); |
1305 } | 1289 } |
1306 | 1290 |
1307 bool NetworkQualityEstimator::GetRecentTransportRTT( | 1291 bool NetworkQualityEstimator::GetRecentTransportRTT( |
1308 const base::TimeTicks& start_time, | 1292 const base::TimeTicks& start_time, |
1309 base::TimeDelta* rtt) const { | 1293 base::TimeDelta* rtt) const { |
1310 DCHECK(thread_checker_.CalledOnValidThread()); | 1294 DCHECK(thread_checker_.CalledOnValidThread()); |
1311 std::vector<NetworkQualityObservationSource> disallowed_observation_sources; | 1295 *rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_transport_, |
1312 disallowed_observation_sources.push_back( | 1296 start_time, 50); |
1313 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); | |
1314 // Disallow external estimate provider since it provides RTT at HTTP layer. | |
1315 disallowed_observation_sources.push_back( | |
1316 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); | |
1317 disallowed_observation_sources.push_back( | |
1318 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE); | |
1319 disallowed_observation_sources.push_back( | |
1320 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_HTTP_FROM_PLATFORM); | |
1321 | |
1322 *rtt = GetRTTEstimateInternal(disallowed_observation_sources, start_time, 50); | |
1323 return (*rtt != nqe::internal::InvalidRTT()); | 1297 return (*rtt != nqe::internal::InvalidRTT()); |
1324 } | 1298 } |
1325 | 1299 |
1326 bool NetworkQualityEstimator::GetRecentDownlinkThroughputKbps( | 1300 bool NetworkQualityEstimator::GetRecentDownlinkThroughputKbps( |
1327 const base::TimeTicks& start_time, | 1301 const base::TimeTicks& start_time, |
1328 int32_t* kbps) const { | 1302 int32_t* kbps) const { |
1329 DCHECK(thread_checker_.CalledOnValidThread()); | 1303 DCHECK(thread_checker_.CalledOnValidThread()); |
1330 *kbps = GetDownlinkThroughputKbpsEstimateInternal(start_time, 50); | 1304 *kbps = GetDownlinkThroughputKbpsEstimateInternal(start_time, 50); |
1331 return (*kbps != nqe::internal::kInvalidThroughput); | 1305 return (*kbps != nqe::internal::kInvalidThroughput); |
1332 } | 1306 } |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1749 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE); | 1723 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE); |
1750 downstream_throughput_kbps_observations_.AddObservation( | 1724 downstream_throughput_kbps_observations_.AddObservation( |
1751 throughput_observation); | 1725 throughput_observation); |
1752 NotifyObserversOfThroughput(throughput_observation); | 1726 NotifyObserversOfThroughput(throughput_observation); |
1753 } | 1727 } |
1754 | 1728 |
1755 ComputeEffectiveConnectionType(); | 1729 ComputeEffectiveConnectionType(); |
1756 } | 1730 } |
1757 | 1731 |
1758 } // namespace net | 1732 } // namespace net |
OLD | NEW |