| 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 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 use_small_responses_(use_smaller_responses_for_tests), | 238 use_small_responses_(use_smaller_responses_for_tests), |
| 239 disable_offline_check_(false), | 239 disable_offline_check_(false), |
| 240 add_default_platform_observations_(add_default_platform_observations), | 240 add_default_platform_observations_(add_default_platform_observations), |
| 241 tick_clock_(new base::DefaultTickClock()), | 241 tick_clock_(new base::DefaultTickClock()), |
| 242 last_connection_change_(tick_clock_->NowTicks()), | 242 last_connection_change_(tick_clock_->NowTicks()), |
| 243 current_network_id_(nqe::internal::NetworkID( | 243 current_network_id_(nqe::internal::NetworkID( |
| 244 NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, | 244 NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, |
| 245 std::string())), | 245 std::string())), |
| 246 downstream_throughput_kbps_observations_( | 246 downstream_throughput_kbps_observations_( |
| 247 params_->weight_multiplier_per_second(), | 247 params_->weight_multiplier_per_second(), |
| 248 params_->weight_multiplier_per_dbm()), | 248 params_->weight_multiplier_per_signal_strength_level()), |
| 249 rtt_observations_(params_->weight_multiplier_per_second(), | 249 rtt_observations_(params_->weight_multiplier_per_second(), |
| 250 params_->weight_multiplier_per_dbm()), | 250 params_->weight_multiplier_per_signal_strength_level()), |
| 251 effective_connection_type_at_last_main_frame_( | 251 effective_connection_type_at_last_main_frame_( |
| 252 EFFECTIVE_CONNECTION_TYPE_UNKNOWN), | 252 EFFECTIVE_CONNECTION_TYPE_UNKNOWN), |
| 253 external_estimate_provider_(std::move(external_estimates_provider)), | 253 external_estimate_provider_(std::move(external_estimates_provider)), |
| 254 effective_connection_type_recomputation_interval_( | 254 effective_connection_type_recomputation_interval_( |
| 255 base::TimeDelta::FromSeconds(10)), | 255 base::TimeDelta::FromSeconds(10)), |
| 256 rtt_observations_size_at_last_ect_computation_(0), | 256 rtt_observations_size_at_last_ect_computation_(0), |
| 257 throughput_observations_size_at_last_ect_computation_(0), | 257 throughput_observations_size_at_last_ect_computation_(0), |
| 258 effective_connection_type_(EFFECTIVE_CONNECTION_TYPE_UNKNOWN), | 258 effective_connection_type_(EFFECTIVE_CONNECTION_TYPE_UNKNOWN), |
| 259 signal_strength_dbm_(INT32_MIN), | |
| 260 min_signal_strength_since_connection_change_(INT32_MAX), | |
| 261 max_signal_strength_since_connection_change_(INT32_MIN), | |
| 262 event_creator_(net_log), | 259 event_creator_(net_log), |
| 263 disallowed_observation_sources_for_http_( | 260 disallowed_observation_sources_for_http_( |
| 264 {NETWORK_QUALITY_OBSERVATION_SOURCE_TCP, | 261 {NETWORK_QUALITY_OBSERVATION_SOURCE_TCP, |
| 265 NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC, | 262 NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC, |
| 266 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE, | 263 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE, |
| 267 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM}), | 264 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM}), |
| 268 disallowed_observation_sources_for_transport_( | 265 disallowed_observation_sources_for_transport_( |
| 269 {NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP, | 266 {NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP, |
| 270 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE, | 267 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE, |
| 271 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE, | 268 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE, |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 base::TimeDelta observed_http_rtt = | 428 base::TimeDelta observed_http_rtt = |
| 432 load_timing_info.receive_headers_end - load_timing_info.send_start; | 429 load_timing_info.receive_headers_end - load_timing_info.send_start; |
| 433 DCHECK_GE(observed_http_rtt, base::TimeDelta()); | 430 DCHECK_GE(observed_http_rtt, base::TimeDelta()); |
| 434 if (observed_http_rtt < peak_network_quality_.http_rtt() || | 431 if (observed_http_rtt < peak_network_quality_.http_rtt() || |
| 435 peak_network_quality_.http_rtt() == nqe::internal::InvalidRTT()) { | 432 peak_network_quality_.http_rtt() == nqe::internal::InvalidRTT()) { |
| 436 peak_network_quality_ = nqe::internal::NetworkQuality( | 433 peak_network_quality_ = nqe::internal::NetworkQuality( |
| 437 observed_http_rtt, peak_network_quality_.transport_rtt(), | 434 observed_http_rtt, peak_network_quality_.transport_rtt(), |
| 438 peak_network_quality_.downstream_throughput_kbps()); | 435 peak_network_quality_.downstream_throughput_kbps()); |
| 439 } | 436 } |
| 440 | 437 |
| 441 RttObservation http_rtt_observation( | 438 RttObservation http_rtt_observation(observed_http_rtt, |
| 442 observed_http_rtt, tick_clock_->NowTicks(), signal_strength_dbm_, | 439 tick_clock_->NowTicks(), signal_strength_, |
| 443 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); | 440 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); |
| 444 rtt_observations_.AddObservation(http_rtt_observation); | 441 rtt_observations_.AddObservation(http_rtt_observation); |
| 445 NotifyObserversOfRTT(http_rtt_observation); | 442 NotifyObserversOfRTT(http_rtt_observation); |
| 446 } | 443 } |
| 447 | 444 |
| 448 void NetworkQualityEstimator::RecordAccuracyAfterMainFrame( | 445 void NetworkQualityEstimator::RecordAccuracyAfterMainFrame( |
| 449 base::TimeDelta measuring_duration) const { | 446 base::TimeDelta measuring_duration) const { |
| 450 DCHECK(thread_checker_.CalledOnValidThread()); | 447 DCHECK(thread_checker_.CalledOnValidThread()); |
| 451 DCHECK_EQ(0, measuring_duration.InMilliseconds() % 1000); | 448 DCHECK_EQ(0, measuring_duration.InMilliseconds() % 1000); |
| 452 DCHECK(ContainsValue(GetAccuracyRecordingIntervals(), measuring_duration)); | 449 DCHECK(ContainsValue(GetAccuracyRecordingIntervals(), measuring_duration)); |
| 453 | 450 |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 798 last_effective_connection_type_computation_, | 795 last_effective_connection_type_computation_, |
| 799 network_quality_, effective_connection_type_)); | 796 network_quality_, effective_connection_type_)); |
| 800 | 797 |
| 801 // Clear the local state. | 798 // Clear the local state. |
| 802 last_connection_change_ = tick_clock_->NowTicks(); | 799 last_connection_change_ = tick_clock_->NowTicks(); |
| 803 peak_network_quality_ = nqe::internal::NetworkQuality(); | 800 peak_network_quality_ = nqe::internal::NetworkQuality(); |
| 804 downstream_throughput_kbps_observations_.Clear(); | 801 downstream_throughput_kbps_observations_.Clear(); |
| 805 rtt_observations_.Clear(); | 802 rtt_observations_.Clear(); |
| 806 | 803 |
| 807 #if defined(OS_ANDROID) | 804 #if defined(OS_ANDROID) |
| 808 if (params_->weight_multiplier_per_dbm() < 1.0 && | 805 if (params_->weight_multiplier_per_signal_strength_level() < 1.0 && |
| 809 NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) { | 806 NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) { |
| 810 UMA_HISTOGRAM_BOOLEAN( | 807 bool signal_strength_available = |
| 811 "NQE.CellularSignalStrengthAvailable", | 808 min_signal_strength_since_connection_change_ && |
| 812 min_signal_strength_since_connection_change_ != INT32_MAX && | 809 max_signal_strength_since_connection_change_; |
| 813 max_signal_strength_since_connection_change_ != INT32_MIN); | 810 UMA_HISTOGRAM_BOOLEAN("NQE.CellularSignalStrength.LevelAvailable", |
| 811 signal_strength_available); |
| 814 | 812 |
| 815 if (min_signal_strength_since_connection_change_ != INT32_MAX && | 813 if (signal_strength_available) { |
| 816 max_signal_strength_since_connection_change_ != INT32_MIN) { | |
| 817 UMA_HISTOGRAM_COUNTS_100( | 814 UMA_HISTOGRAM_COUNTS_100( |
| 818 "NQE.CellularSignalStrengthDifference", | 815 "NQE.CellularSignalStrength.LevelDifference", |
| 819 max_signal_strength_since_connection_change_ - | 816 max_signal_strength_since_connection_change_.value() - |
| 820 min_signal_strength_since_connection_change_); | 817 min_signal_strength_since_connection_change_.value()); |
| 821 } | 818 } |
| 822 } | 819 } |
| 823 #endif // OS_ANDROID | 820 #endif // OS_ANDROID |
| 824 signal_strength_dbm_ = INT32_MIN; | 821 signal_strength_.reset(); |
| 825 min_signal_strength_since_connection_change_ = INT32_MAX; | 822 min_signal_strength_since_connection_change_.reset(); |
| 826 max_signal_strength_since_connection_change_ = INT32_MIN; | 823 max_signal_strength_since_connection_change_.reset(); |
| 827 network_quality_ = nqe::internal::NetworkQuality(); | 824 network_quality_ = nqe::internal::NetworkQuality(); |
| 828 effective_connection_type_ = EFFECTIVE_CONNECTION_TYPE_UNKNOWN; | 825 effective_connection_type_ = EFFECTIVE_CONNECTION_TYPE_UNKNOWN; |
| 829 effective_connection_type_at_last_main_frame_ = | 826 effective_connection_type_at_last_main_frame_ = |
| 830 EFFECTIVE_CONNECTION_TYPE_UNKNOWN; | 827 EFFECTIVE_CONNECTION_TYPE_UNKNOWN; |
| 831 rtt_observations_size_at_last_ect_computation_ = 0; | 828 rtt_observations_size_at_last_ect_computation_ = 0; |
| 832 throughput_observations_size_at_last_ect_computation_ = 0; | 829 throughput_observations_size_at_last_ect_computation_ = 0; |
| 833 | 830 |
| 834 // Update the local state as part of preparation for the new connection. | 831 // Update the local state as part of preparation for the new connection. |
| 835 current_network_id_ = GetCurrentNetworkID(); | 832 current_network_id_ = GetCurrentNetworkID(); |
| 836 RecordNetworkIDAvailability(); | 833 RecordNetworkIDAvailability(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 859 current_network_id_.type != NetworkChangeNotifier::CONNECTION_UNKNOWN && | 856 current_network_id_.type != NetworkChangeNotifier::CONNECTION_UNKNOWN && |
| 860 current_network_id_.type != NetworkChangeNotifier::CONNECTION_ETHERNET && | 857 current_network_id_.type != NetworkChangeNotifier::CONNECTION_ETHERNET && |
| 861 current_network_id_.type != NetworkChangeNotifier::CONNECTION_BLUETOOTH) { | 858 current_network_id_.type != NetworkChangeNotifier::CONNECTION_BLUETOOTH) { |
| 862 RecordExternalEstimateProviderMetrics( | 859 RecordExternalEstimateProviderMetrics( |
| 863 EXTERNAL_ESTIMATE_PROVIDER_STATUS_QUERIED); | 860 EXTERNAL_ESTIMATE_PROVIDER_STATUS_QUERIED); |
| 864 external_estimate_provider_->Update(); | 861 external_estimate_provider_->Update(); |
| 865 } | 862 } |
| 866 } | 863 } |
| 867 | 864 |
| 868 void NetworkQualityEstimator::UpdateSignalStrength() { | 865 void NetworkQualityEstimator::UpdateSignalStrength() { |
| 866 DCHECK(thread_checker_.CalledOnValidThread()); |
| 867 |
| 868 signal_strength_.reset(); |
| 869 #if defined(OS_ANDROID) | 869 #if defined(OS_ANDROID) |
| 870 if (params_->weight_multiplier_per_dbm() >= 1.0 || | 870 if (params_->weight_multiplier_per_signal_strength_level() >= 1.0) |
| 871 !NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type) || | 871 return; |
| 872 !android::cellular_signal_strength::GetSignalStrengthDbm( | 872 if (!NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) |
| 873 &signal_strength_dbm_)) { | 873 return; |
| 874 signal_strength_dbm_ = INT32_MIN; | 874 |
| 875 } | 875 signal_strength_ = |
| 876 min_signal_strength_since_connection_change_ = std::min( | 876 android::cellular_signal_strength::GetSignalStrengthLevel(); |
| 877 min_signal_strength_since_connection_change_, signal_strength_dbm_); | 877 |
| 878 max_signal_strength_since_connection_change_ = std::max( | 878 if (!signal_strength_) |
| 879 max_signal_strength_since_connection_change_, signal_strength_dbm_); | 879 return; |
| 880 |
| 881 min_signal_strength_since_connection_change_ = |
| 882 std::min(min_signal_strength_since_connection_change_.value_or(INT32_MAX), |
| 883 signal_strength_.value()); |
| 884 max_signal_strength_since_connection_change_ = |
| 885 std::max(max_signal_strength_since_connection_change_.value_or(INT32_MIN), |
| 886 signal_strength_.value()); |
| 880 #endif // OS_ANDROID | 887 #endif // OS_ANDROID |
| 881 } | 888 } |
| 882 | 889 |
| 883 void NetworkQualityEstimator::RecordMetricsOnConnectionTypeChanged() const { | 890 void NetworkQualityEstimator::RecordMetricsOnConnectionTypeChanged() const { |
| 884 DCHECK(thread_checker_.CalledOnValidThread()); | 891 DCHECK(thread_checker_.CalledOnValidThread()); |
| 885 if (peak_network_quality_.http_rtt() != nqe::internal::InvalidRTT()) { | 892 if (peak_network_quality_.http_rtt() != nqe::internal::InvalidRTT()) { |
| 886 base::HistogramBase* rtt_histogram = | 893 base::HistogramBase* rtt_histogram = |
| 887 GetHistogram("FastestRTT.", current_network_id_.type, 10 * 1000); | 894 GetHistogram("FastestRTT.", current_network_id_.type, 10 * 1000); |
| 888 rtt_histogram->Add(peak_network_quality_.http_rtt().InMilliseconds()); | 895 rtt_histogram->Add(peak_network_quality_.http_rtt().InMilliseconds()); |
| 889 } | 896 } |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1341 const base::Optional<Statistic>& statistic, | 1348 const base::Optional<Statistic>& statistic, |
| 1342 int percentile) const { | 1349 int percentile) const { |
| 1343 DCHECK(thread_checker_.CalledOnValidThread()); | 1350 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1344 | 1351 |
| 1345 // RTT observations are sorted by duration from shortest to longest, thus | 1352 // RTT observations are sorted by duration from shortest to longest, thus |
| 1346 // a higher percentile RTT will have a longer RTT than a lower percentile. | 1353 // a higher percentile RTT will have a longer RTT than a lower percentile. |
| 1347 base::TimeDelta rtt = nqe::internal::InvalidRTT(); | 1354 base::TimeDelta rtt = nqe::internal::InvalidRTT(); |
| 1348 | 1355 |
| 1349 if (!statistic) { | 1356 if (!statistic) { |
| 1350 // Use default statistic algorithm. | 1357 // Use default statistic algorithm. |
| 1351 if (!rtt_observations_.GetPercentile(start_time, signal_strength_dbm_, &rtt, | 1358 if (!rtt_observations_.GetPercentile(start_time, signal_strength_, &rtt, |
| 1352 percentile, | 1359 percentile, |
| 1353 disallowed_observation_sources)) { | 1360 disallowed_observation_sources)) { |
| 1354 return nqe::internal::InvalidRTT(); | 1361 return nqe::internal::InvalidRTT(); |
| 1355 } | 1362 } |
| 1356 return rtt; | 1363 return rtt; |
| 1357 } | 1364 } |
| 1358 | 1365 |
| 1359 switch (statistic.value()) { | 1366 switch (statistic.value()) { |
| 1360 case STATISTIC_LAST: | 1367 case STATISTIC_LAST: |
| 1361 NOTREACHED(); | 1368 NOTREACHED(); |
| 1362 return nqe::internal::InvalidRTT(); | 1369 return nqe::internal::InvalidRTT(); |
| 1363 case STATISTIC_WEIGHTED_AVERAGE: | 1370 case STATISTIC_WEIGHTED_AVERAGE: |
| 1364 if (!rtt_observations_.GetWeightedAverage( | 1371 if (!rtt_observations_.GetWeightedAverage(start_time, signal_strength_, |
| 1365 start_time, signal_strength_dbm_, disallowed_observation_sources, | 1372 disallowed_observation_sources, |
| 1366 &rtt)) { | 1373 &rtt)) { |
| 1367 return nqe::internal::InvalidRTT(); | 1374 return nqe::internal::InvalidRTT(); |
| 1368 } | 1375 } |
| 1369 return rtt; | 1376 return rtt; |
| 1370 case STATISTIC_UNWEIGHTED_AVERAGE: | 1377 case STATISTIC_UNWEIGHTED_AVERAGE: |
| 1371 if (!rtt_observations_.GetUnweightedAverage( | 1378 if (!rtt_observations_.GetUnweightedAverage( |
| 1372 start_time, signal_strength_dbm_, disallowed_observation_sources, | 1379 start_time, signal_strength_, disallowed_observation_sources, |
| 1373 &rtt)) { | 1380 &rtt)) { |
| 1374 return nqe::internal::InvalidRTT(); | 1381 return nqe::internal::InvalidRTT(); |
| 1375 } | 1382 } |
| 1376 return rtt; | 1383 return rtt; |
| 1377 } | 1384 } |
| 1378 NOTREACHED(); | 1385 NOTREACHED(); |
| 1379 return nqe::internal::InvalidRTT(); | 1386 return nqe::internal::InvalidRTT(); |
| 1380 } | 1387 } |
| 1381 | 1388 |
| 1382 int32_t NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimateInternal( | 1389 int32_t NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimateInternal( |
| 1383 const base::TimeTicks& start_time, | 1390 const base::TimeTicks& start_time, |
| 1384 int percentile) const { | 1391 int percentile) const { |
| 1385 DCHECK(thread_checker_.CalledOnValidThread()); | 1392 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1386 | 1393 |
| 1387 // Throughput observations are sorted by kbps from slowest to fastest, | 1394 // Throughput observations are sorted by kbps from slowest to fastest, |
| 1388 // thus a higher percentile throughput will be faster than a lower one. | 1395 // thus a higher percentile throughput will be faster than a lower one. |
| 1389 int32_t kbps = nqe::internal::kInvalidThroughput; | 1396 int32_t kbps = nqe::internal::kInvalidThroughput; |
| 1390 if (!downstream_throughput_kbps_observations_.GetPercentile( | 1397 if (!downstream_throughput_kbps_observations_.GetPercentile( |
| 1391 start_time, signal_strength_dbm_, &kbps, 100 - percentile, | 1398 start_time, signal_strength_, &kbps, 100 - percentile, |
| 1392 std::vector<NetworkQualityObservationSource>())) { | 1399 std::vector<NetworkQualityObservationSource>())) { |
| 1393 return nqe::internal::kInvalidThroughput; | 1400 return nqe::internal::kInvalidThroughput; |
| 1394 } | 1401 } |
| 1395 return kbps; | 1402 return kbps; |
| 1396 } | 1403 } |
| 1397 | 1404 |
| 1398 nqe::internal::NetworkID NetworkQualityEstimator::GetCurrentNetworkID() const { | 1405 nqe::internal::NetworkID NetworkQualityEstimator::GetCurrentNetworkID() const { |
| 1399 DCHECK(thread_checker_.CalledOnValidThread()); | 1406 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1400 | 1407 |
| 1401 // TODO(tbansal): crbug.com/498068 Add NetworkQualityEstimatorAndroid class | 1408 // TODO(tbansal): crbug.com/498068 Add NetworkQualityEstimatorAndroid class |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1504 RecordExternalEstimateProviderMetrics( | 1511 RecordExternalEstimateProviderMetrics( |
| 1505 EXTERNAL_ESTIMATE_PROVIDER_STATUS_CALLBACK); | 1512 EXTERNAL_ESTIMATE_PROVIDER_STATUS_CALLBACK); |
| 1506 | 1513 |
| 1507 external_estimate_provider_quality_ = nqe::internal::NetworkQuality(); | 1514 external_estimate_provider_quality_ = nqe::internal::NetworkQuality(); |
| 1508 | 1515 |
| 1509 if (rtt > base::TimeDelta()) { | 1516 if (rtt > base::TimeDelta()) { |
| 1510 RecordExternalEstimateProviderMetrics( | 1517 RecordExternalEstimateProviderMetrics( |
| 1511 EXTERNAL_ESTIMATE_PROVIDER_STATUS_RTT_AVAILABLE); | 1518 EXTERNAL_ESTIMATE_PROVIDER_STATUS_RTT_AVAILABLE); |
| 1512 UMA_HISTOGRAM_TIMES("NQE.ExternalEstimateProvider.RTT", rtt); | 1519 UMA_HISTOGRAM_TIMES("NQE.ExternalEstimateProvider.RTT", rtt); |
| 1513 RttObservation rtt_observation( | 1520 RttObservation rtt_observation( |
| 1514 rtt, tick_clock_->NowTicks(), signal_strength_dbm_, | 1521 rtt, tick_clock_->NowTicks(), signal_strength_, |
| 1515 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); | 1522 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); |
| 1516 rtt_observations_.AddObservation(rtt_observation); | 1523 rtt_observations_.AddObservation(rtt_observation); |
| 1517 external_estimate_provider_quality_.set_http_rtt(rtt); | 1524 external_estimate_provider_quality_.set_http_rtt(rtt); |
| 1518 NotifyObserversOfRTT(rtt_observation); | 1525 NotifyObserversOfRTT(rtt_observation); |
| 1519 } | 1526 } |
| 1520 | 1527 |
| 1521 if (downstream_throughput_kbps > 0) { | 1528 if (downstream_throughput_kbps > 0) { |
| 1522 RecordExternalEstimateProviderMetrics( | 1529 RecordExternalEstimateProviderMetrics( |
| 1523 EXTERNAL_ESTIMATE_PROVIDER_STATUS_DOWNLINK_BANDWIDTH_AVAILABLE); | 1530 EXTERNAL_ESTIMATE_PROVIDER_STATUS_DOWNLINK_BANDWIDTH_AVAILABLE); |
| 1524 UMA_HISTOGRAM_COUNTS("NQE.ExternalEstimateProvider.DownlinkBandwidth", | 1531 UMA_HISTOGRAM_COUNTS("NQE.ExternalEstimateProvider.DownlinkBandwidth", |
| 1525 downstream_throughput_kbps); | 1532 downstream_throughput_kbps); |
| 1526 ThroughputObservation throughput_observation( | 1533 ThroughputObservation throughput_observation( |
| 1527 downstream_throughput_kbps, tick_clock_->NowTicks(), | 1534 downstream_throughput_kbps, tick_clock_->NowTicks(), signal_strength_, |
| 1528 signal_strength_dbm_, | |
| 1529 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); | 1535 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); |
| 1530 downstream_throughput_kbps_observations_.AddObservation( | 1536 downstream_throughput_kbps_observations_.AddObservation( |
| 1531 throughput_observation); | 1537 throughput_observation); |
| 1532 external_estimate_provider_quality_.set_downstream_throughput_kbps( | 1538 external_estimate_provider_quality_.set_downstream_throughput_kbps( |
| 1533 downstream_throughput_kbps); | 1539 downstream_throughput_kbps); |
| 1534 NotifyObserversOfThroughput(throughput_observation); | 1540 NotifyObserversOfThroughput(throughput_observation); |
| 1535 } | 1541 } |
| 1536 } | 1542 } |
| 1537 | 1543 |
| 1538 void NetworkQualityEstimator::SetTickClockForTesting( | 1544 void NetworkQualityEstimator::SetTickClockForTesting( |
| 1539 std::unique_ptr<base::TickClock> tick_clock) { | 1545 std::unique_ptr<base::TickClock> tick_clock) { |
| 1540 DCHECK(thread_checker_.CalledOnValidThread()); | 1546 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1541 tick_clock_ = std::move(tick_clock); | 1547 tick_clock_ = std::move(tick_clock); |
| 1542 } | 1548 } |
| 1543 | 1549 |
| 1544 double NetworkQualityEstimator::RandDouble() const { | 1550 double NetworkQualityEstimator::RandDouble() const { |
| 1545 return base::RandDouble(); | 1551 return base::RandDouble(); |
| 1546 } | 1552 } |
| 1547 | 1553 |
| 1548 void NetworkQualityEstimator::OnUpdatedRTTAvailable( | 1554 void NetworkQualityEstimator::OnUpdatedRTTAvailable( |
| 1549 SocketPerformanceWatcherFactory::Protocol protocol, | 1555 SocketPerformanceWatcherFactory::Protocol protocol, |
| 1550 const base::TimeDelta& rtt) { | 1556 const base::TimeDelta& rtt) { |
| 1551 DCHECK(thread_checker_.CalledOnValidThread()); | 1557 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1552 DCHECK_NE(nqe::internal::InvalidRTT(), rtt); | 1558 DCHECK_NE(nqe::internal::InvalidRTT(), rtt); |
| 1553 | 1559 |
| 1554 RttObservation observation(rtt, tick_clock_->NowTicks(), signal_strength_dbm_, | 1560 RttObservation observation(rtt, tick_clock_->NowTicks(), signal_strength_, |
| 1555 ProtocolSourceToObservationSource(protocol)); | 1561 ProtocolSourceToObservationSource(protocol)); |
| 1556 NotifyObserversOfRTT(observation); | 1562 NotifyObserversOfRTT(observation); |
| 1557 rtt_observations_.AddObservation(observation); | 1563 rtt_observations_.AddObservation(observation); |
| 1558 } | 1564 } |
| 1559 | 1565 |
| 1560 void NetworkQualityEstimator::NotifyObserversOfRTT( | 1566 void NetworkQualityEstimator::NotifyObserversOfRTT( |
| 1561 const RttObservation& observation) { | 1567 const RttObservation& observation) { |
| 1562 DCHECK(thread_checker_.CalledOnValidThread()); | 1568 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1563 DCHECK_NE(nqe::internal::InvalidRTT(), observation.value); | 1569 DCHECK_NE(nqe::internal::InvalidRTT(), observation.value); |
| 1564 DCHECK_GT(NETWORK_QUALITY_OBSERVATION_SOURCE_MAX, observation.source); | 1570 DCHECK_GT(NETWORK_QUALITY_OBSERVATION_SOURCE_MAX, observation.source); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1603 DCHECK_NE(nqe::internal::kInvalidThroughput, downstream_kbps); | 1609 DCHECK_NE(nqe::internal::kInvalidThroughput, downstream_kbps); |
| 1604 | 1610 |
| 1605 if (downstream_kbps > peak_network_quality_.downstream_throughput_kbps() || | 1611 if (downstream_kbps > peak_network_quality_.downstream_throughput_kbps() || |
| 1606 peak_network_quality_.downstream_throughput_kbps() == | 1612 peak_network_quality_.downstream_throughput_kbps() == |
| 1607 nqe::internal::kInvalidThroughput) { | 1613 nqe::internal::kInvalidThroughput) { |
| 1608 peak_network_quality_ = nqe::internal::NetworkQuality( | 1614 peak_network_quality_ = nqe::internal::NetworkQuality( |
| 1609 peak_network_quality_.http_rtt(), peak_network_quality_.transport_rtt(), | 1615 peak_network_quality_.http_rtt(), peak_network_quality_.transport_rtt(), |
| 1610 downstream_kbps); | 1616 downstream_kbps); |
| 1611 } | 1617 } |
| 1612 ThroughputObservation throughput_observation( | 1618 ThroughputObservation throughput_observation( |
| 1613 downstream_kbps, tick_clock_->NowTicks(), signal_strength_dbm_, | 1619 downstream_kbps, tick_clock_->NowTicks(), signal_strength_, |
| 1614 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); | 1620 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); |
| 1615 downstream_throughput_kbps_observations_.AddObservation( | 1621 downstream_throughput_kbps_observations_.AddObservation( |
| 1616 throughput_observation); | 1622 throughput_observation); |
| 1617 NotifyObserversOfThroughput(throughput_observation); | 1623 NotifyObserversOfThroughput(throughput_observation); |
| 1618 } | 1624 } |
| 1619 | 1625 |
| 1620 void NetworkQualityEstimator::MaybeComputeEffectiveConnectionType() { | 1626 void NetworkQualityEstimator::MaybeComputeEffectiveConnectionType() { |
| 1621 DCHECK(thread_checker_.CalledOnValidThread()); | 1627 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1622 | 1628 |
| 1623 const base::TimeTicks now = tick_clock_->NowTicks(); | 1629 const base::TimeTicks now = tick_clock_->NowTicks(); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1820 return "UnweightedAverage"; | 1826 return "UnweightedAverage"; |
| 1821 case STATISTIC_LAST: | 1827 case STATISTIC_LAST: |
| 1822 NOTREACHED(); | 1828 NOTREACHED(); |
| 1823 return ""; | 1829 return ""; |
| 1824 } | 1830 } |
| 1825 NOTREACHED(); | 1831 NOTREACHED(); |
| 1826 return ""; | 1832 return ""; |
| 1827 } | 1833 } |
| 1828 | 1834 |
| 1829 } // namespace net | 1835 } // namespace net |
| OLD | NEW |