Chromium Code Reviews| Index: net/nqe/network_quality_estimator.cc |
| diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc |
| index 41947a4f325297846fc42ca5fecd3c3460af5f03..e5d59ef01da2d8b8fdf5c17f5b765e1002717ca7 100644 |
| --- a/net/nqe/network_quality_estimator.cc |
| +++ b/net/nqe/network_quality_estimator.cc |
| @@ -30,6 +30,7 @@ |
| #include "net/base/network_interfaces.h" |
| #include "net/base/url_util.h" |
| #include "net/http/http_status_code.h" |
| +#include "net/nqe/network_quality_estimator_params.h" |
| #include "net/nqe/socket_watcher_factory.h" |
| #include "net/nqe/throughput_analyzer.h" |
| #include "net/url_request/url_request.h" |
| @@ -43,92 +44,6 @@ |
| namespace { |
| -// Default value of the half life (in seconds) for computing time weighted |
| -// percentiles. Every half life, the weight of all observations reduces by |
| -// half. Lowering the half life would reduce the weight of older values faster. |
| -const int kDefaultHalfLifeSeconds = 60; |
| - |
| -// Name of the variation parameter that holds the value of the half life (in |
| -// seconds) of the observations. |
| -const char kHalfLifeSecondsParamName[] = "HalfLifeSeconds"; |
| - |
| -// Returns a descriptive name corresponding to |connection_type|. |
| -const char* GetNameForConnectionType( |
| - net::NetworkChangeNotifier::ConnectionType connection_type) { |
| - switch (connection_type) { |
| - case net::NetworkChangeNotifier::CONNECTION_UNKNOWN: |
| - return "Unknown"; |
| - 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 "None"; |
| - case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH: |
| - return "Bluetooth"; |
| - default: |
| - NOTREACHED(); |
| - break; |
| - } |
| - return ""; |
| -} |
| - |
| -// Suffix of the name of the variation parameter that contains the default RTT |
| -// observation (in milliseconds). Complete name of the variation parameter |
| -// would be |ConnectionType|.|kDefaultRTTMsecObservationSuffix| where |
| -// |ConnectionType| is from |kConnectionTypeNames|. For example, variation |
| -// parameter for Wi-Fi would be "WiFi.DefaultMedianRTTMsec". |
| -const char kDefaultRTTMsecObservationSuffix[] = ".DefaultMedianRTTMsec"; |
| - |
| -// Suffix of the name of the variation parameter that contains the default |
| -// downstream throughput observation (in Kbps). Complete name of the variation |
| -// parameter would be |ConnectionType|.|kDefaultKbpsObservationSuffix| where |
| -// |ConnectionType| is from |kConnectionTypeNames|. For example, variation |
| -// parameter for Wi-Fi would be "WiFi.DefaultMedianKbps". |
| -const char kDefaultKbpsObservationSuffix[] = ".DefaultMedianKbps"; |
| - |
| -// Suffix of the name of the variation parameter that contains the threshold |
| -// HTTP RTTs (in milliseconds) for different effective connection types. |
| -// Complete name of the variation parameter would be |
| -// |EffectiveConnectionType|.|kThresholdURLRTTMsecSuffix|. |
| -const char kThresholdURLRTTMsecSuffix[] = ".ThresholdMedianHttpRTTMsec"; |
| - |
| -// Suffix of the name of the variation parameter that contains the threshold |
| -// transport RTTs (in milliseconds) for different effective connection types. |
| -// Complete name of the variation parameter would be |
| -// |EffectiveConnectionType|.|kThresholdTransportRTTMsecSuffix|. |
| -const char kThresholdTransportRTTMsecSuffix[] = |
| - ".ThresholdMedianTransportRTTMsec"; |
| - |
| -// Suffix of the name of the variation parameter that contains the threshold |
| -// downlink throughput (in kbps) for different effective connection types. |
| -// Complete name of the variation parameter would be |
| -// |EffectiveConnectionType|.|kThresholdKbpsSuffix|. |
| -const char kThresholdKbpsSuffix[] = ".ThresholdMedianKbps"; |
| - |
| -// Computes and returns the weight multiplier per second. |
| -// |variation_params| is the map containing all field trial parameters |
| -// related to NetworkQualityEstimator field trial. |
| -double GetWeightMultiplierPerSecond( |
| - const std::map<std::string, std::string>& variation_params) { |
| - int half_life_seconds = kDefaultHalfLifeSeconds; |
| - int32_t variations_value = 0; |
| - auto it = variation_params.find(kHalfLifeSecondsParamName); |
| - if (it != variation_params.end() && |
| - base::StringToInt(it->second, &variations_value) && |
| - variations_value >= 1) { |
| - half_life_seconds = variations_value; |
| - } |
| - DCHECK_GT(half_life_seconds, 0); |
| - return exp(log(0.5) / half_life_seconds); |
| -} |
| - |
| // Returns the histogram that should be used to record the given statistic. |
| // |max_limit| is the maximum value that can be stored in the histogram. |
| base::HistogramBase* GetHistogram( |
| @@ -142,63 +57,10 @@ base::HistogramBase* GetHistogram( |
| // Prefix of network quality estimator histograms. |
| const char prefix[] = "NQE."; |
| return base::Histogram::FactoryGet( |
| - prefix + statistic_name + GetNameForConnectionType(type), kLowerLimit, |
| - max_limit, kBucketCount, base::HistogramBase::kUmaTargetedHistogramFlag); |
| -} |
| - |
| -// Sets |variations_value| to the value of |parameter_name| read from |
| -// |variation_params|. If the value is unavailable from |variation_params|, then |
| -// |variations_value| is set to |default_value|. |
| -void GetValueForVariationParam( |
| - const std::map<std::string, std::string>& variation_params, |
| - const std::string& parameter_name, |
| - int64_t default_value, |
| - int64_t* variations_value) { |
| - const auto it = variation_params.find(parameter_name); |
| - if (it != variation_params.end() && |
| - base::StringToInt64(it->second, variations_value)) { |
| - return; |
| - } |
| - *variations_value = default_value; |
| -} |
| - |
| -// Returns the variation value for |parameter_name|. If the value is |
| -// unavailable, |default_value| is returned. |
| -double GetDoubleValueForVariationParamWithDefaultValue( |
| - const std::map<std::string, std::string>& variation_params, |
| - const std::string& parameter_name, |
| - double default_value) { |
| - const auto it = variation_params.find(parameter_name); |
| - if (it == variation_params.end()) |
| - return default_value; |
| - |
| - double variations_value = default_value; |
| - if (!base::StringToDouble(it->second, &variations_value)) |
| - return default_value; |
| - return variations_value; |
| -} |
| - |
| -// Returns the variation value for |parameter_name|. If the value is |
| -// unavailable, |default_value| is returned. |
| -std::string GetStringValueForVariationParamWithDefaultValue( |
| - const std::map<std::string, std::string>& variation_params, |
| - const std::string& parameter_name, |
| - const std::string& default_value) { |
| - const auto it = variation_params.find(parameter_name); |
| - if (it == variation_params.end()) |
| - return default_value; |
| - return it->second; |
| -} |
| - |
| -// Returns the algorithm that should be used for computing effective connection |
| -// type based on field trial params. Returns an empty string if a valid |
| -// algorithm paramter is not present in the field trial params. |
| -std::string GetEffectiveConnectionTypeAlgorithm( |
| - const std::map<std::string, std::string>& variation_params) { |
| - const auto it = variation_params.find("effective_connection_type_algorithm"); |
| - if (it == variation_params.end()) |
| - return std::string(); |
| - return it->second; |
| + prefix + statistic_name + |
|
bengr
2016/10/27 16:12:29
You could just move "NQE." to this line.
tbansal1
2016/10/28 20:26:04
Done.
|
| + net::nqe::internal::GetNameForConnectionType(type), |
| + kLowerLimit, max_limit, kBucketCount, |
| + base::HistogramBase::kUmaTargetedHistogramFlag); |
| } |
| net::NetworkQualityObservationSource ProtocolSourceToObservationSource( |
| @@ -367,13 +229,16 @@ NetworkQualityEstimator::NetworkQualityEstimator( |
| use_localhost_requests_(use_local_host_requests_for_tests), |
| use_small_responses_(use_smaller_responses_for_tests), |
| weight_multiplier_per_second_( |
| - GetWeightMultiplierPerSecond(variation_params)), |
| + nqe::internal::GetWeightMultiplierPerSecond(variation_params)), |
| effective_connection_type_algorithm_( |
| - algorithm_name_to_enum_.find(GetEffectiveConnectionTypeAlgorithm( |
| - variation_params)) == algorithm_name_to_enum_.end() |
| + algorithm_name_to_enum_.find( |
| + net::nqe::internal::GetEffectiveConnectionTypeAlgorithm( |
| + variation_params)) == algorithm_name_to_enum_.end() |
| ? kDefaultEffectiveConnectionTypeAlgorithm |
| : algorithm_name_to_enum_ |
| - .find(GetEffectiveConnectionTypeAlgorithm(variation_params)) |
| + .find( |
| + net::nqe::internal::GetEffectiveConnectionTypeAlgorithm( |
| + variation_params)) |
| ->second), |
| tick_clock_(new base::DefaultTickClock()), |
| last_connection_change_(tick_clock_->NowTicks()), |
| @@ -396,19 +261,13 @@ NetworkQualityEstimator::NetworkQualityEstimator( |
| min_signal_strength_since_connection_change_(INT32_MAX), |
| max_signal_strength_since_connection_change_(INT32_MIN), |
| correlation_uma_logging_probability_( |
| - GetDoubleValueForVariationParamWithDefaultValue( |
| - variation_params, |
| - "correlation_logging_probability", |
| - 0.0)), |
| + nqe::internal::correlation_uma_logging_probability(variation_params)), |
| forced_effective_connection_type_set_( |
| - !GetStringValueForVariationParamWithDefaultValue( |
| - variation_params, |
| - "force_effective_connection_type", |
| - "") |
| - .empty()), |
| + nqe::internal::forced_effective_connection_type_set( |
| + variation_params)), |
| + forced_effective_connection_type_( |
| + nqe::internal::forced_effective_connection_type(variation_params)), |
| weak_ptr_factory_(this) { |
| - static_assert(kDefaultHalfLifeSeconds > 0, |
| - "Default half life duration must be > 0"); |
| // None of the algorithms can have an empty name. |
| DCHECK(algorithm_name_to_enum_.end() == |
| algorithm_name_to_enum_.find(std::string())); |
| @@ -419,12 +278,9 @@ NetworkQualityEstimator::NetworkQualityEstimator( |
| DCHECK_NE(EffectiveConnectionTypeAlgorithm:: |
| EFFECTIVE_CONNECTION_TYPE_ALGORITHM_LAST, |
| effective_connection_type_algorithm_); |
| - DCHECK_LE(0.0, correlation_uma_logging_probability_); |
| - DCHECK_GE(1.0, correlation_uma_logging_probability_); |
| network_quality_store_.reset(new nqe::internal::NetworkQualityStore()); |
| ObtainOperatingParams(variation_params); |
| - ObtainEffectiveConnectionTypeModelParams(variation_params); |
| NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| if (external_estimate_provider_) { |
| RecordExternalEstimateProviderMetrics( |
| @@ -454,146 +310,15 @@ NetworkQualityEstimator::NetworkQualityEstimator( |
| accuracy_recording_intervals_.push_back(base::TimeDelta::FromSeconds(15)); |
| accuracy_recording_intervals_.push_back(base::TimeDelta::FromSeconds(30)); |
| accuracy_recording_intervals_.push_back(base::TimeDelta::FromSeconds(60)); |
| - |
| - if (forced_effective_connection_type_set_) { |
| - std::string forced_value = GetStringValueForVariationParamWithDefaultValue( |
| - variation_params, "force_effective_connection_type", |
| - GetNameForEffectiveConnectionType(EFFECTIVE_CONNECTION_TYPE_UNKNOWN)); |
| - DCHECK(!forced_value.empty()); |
| - bool effective_connection_type_available = |
| - GetEffectiveConnectionTypeForName(forced_value, |
| - &forced_effective_connection_type_); |
| - DCHECK(effective_connection_type_available); |
| - |
| - // Silence unused variable warning in release builds. |
| - (void)effective_connection_type_available; |
| - } |
| } |
| void NetworkQualityEstimator::ObtainOperatingParams( |
| const std::map<std::string, std::string>& variation_params) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - |
| - for (size_t i = 0; i <= NetworkChangeNotifier::CONNECTION_LAST; ++i) { |
| - NetworkChangeNotifier::ConnectionType type = |
| - static_cast<NetworkChangeNotifier::ConnectionType>(i); |
| - DCHECK_EQ(nqe::internal::InvalidRTT(), default_observations_[i].http_rtt()); |
| - DCHECK_EQ(nqe::internal::InvalidRTT(), |
| - default_observations_[i].transport_rtt()); |
| - DCHECK_EQ(nqe::internal::kInvalidThroughput, |
| - default_observations_[i].downstream_throughput_kbps()); |
| - int32_t variations_value = kMinimumRTTVariationParameterMsec - 1; |
| - // Name of the parameter that holds the RTT value for this connection type. |
| - std::string rtt_parameter_name = |
| - std::string(GetNameForConnectionType(type)) |
| - .append(kDefaultRTTMsecObservationSuffix); |
| - auto it = variation_params.find(rtt_parameter_name); |
| - if (it != variation_params.end() && |
| - base::StringToInt(it->second, &variations_value) && |
| - variations_value >= kMinimumRTTVariationParameterMsec) { |
| - default_observations_[i] = nqe::internal::NetworkQuality( |
| - base::TimeDelta::FromMilliseconds(variations_value), |
| - default_observations_[i].transport_rtt(), |
| - default_observations_[i].downstream_throughput_kbps()); |
| - } |
| - |
| - variations_value = kMinimumThroughputVariationParameterKbps - 1; |
| - // Name of the parameter that holds the Kbps value for this connection |
| - // type. |
| - std::string kbps_parameter_name = |
| - std::string(GetNameForConnectionType(type)) |
| - .append(kDefaultKbpsObservationSuffix); |
| - it = variation_params.find(kbps_parameter_name); |
| - if (it != variation_params.end() && |
| - base::StringToInt(it->second, &variations_value) && |
| - variations_value >= kMinimumThroughputVariationParameterKbps) { |
| - default_observations_[i] = nqe::internal::NetworkQuality( |
| - default_observations_[i].http_rtt(), |
| - default_observations_[i].transport_rtt(), variations_value); |
| - } |
| - } |
| -} |
| - |
| -void NetworkQualityEstimator::ObtainEffectiveConnectionTypeModelParams( |
| - const std::map<std::string, std::string>& variation_params) { |
| - DCHECK(thread_checker_.CalledOnValidThread()); |
| - |
| - default_effective_connection_type_thresholds_ |
| - [EFFECTIVE_CONNECTION_TYPE_SLOW_2G] = nqe::internal::NetworkQuality( |
| - // Set to 2010 milliseconds, which corresponds to the 33rd percentile |
| - // of 2G HTTP RTT observations on Android. |
| - base::TimeDelta::FromMilliseconds(2010), |
| - // Set to 1870 milliseconds, which corresponds to the 33rd percentile |
| - // of 2G transport RTT observations on Android. |
| - base::TimeDelta::FromMilliseconds(1870), |
| - nqe::internal::kInvalidThroughput); |
| - |
| - default_effective_connection_type_thresholds_[EFFECTIVE_CONNECTION_TYPE_2G] = |
| - nqe::internal::NetworkQuality( |
| - // Set to 1420 milliseconds, which corresponds to 50th percentile of |
| - // 2G |
| - // HTTP RTT observations on Android. |
| - base::TimeDelta::FromMilliseconds(1420), |
| - // Set to 1280 milliseconds, which corresponds to 50th percentile of |
| - // 2G |
| - // transport RTT observations on Android. |
| - base::TimeDelta::FromMilliseconds(1280), |
| - nqe::internal::kInvalidThroughput); |
| - |
| - default_effective_connection_type_thresholds_[EFFECTIVE_CONNECTION_TYPE_3G] = |
| - nqe::internal::NetworkQuality( |
| - // Set to 273 milliseconds, which corresponds to 50th percentile of |
| - // 3G HTTP RTT observations on Android. |
| - base::TimeDelta::FromMilliseconds(273), |
| - // Set to 204 milliseconds, which corresponds to 50th percentile of |
| - // 3G transport RTT observations on Android. |
| - base::TimeDelta::FromMilliseconds(204), |
| - nqe::internal::kInvalidThroughput); |
| - |
| - for (size_t i = 0; i < EFFECTIVE_CONNECTION_TYPE_LAST; ++i) { |
| - EffectiveConnectionType effective_connection_type = |
| - static_cast<EffectiveConnectionType>(i); |
| - DCHECK_EQ(nqe::internal::InvalidRTT(), |
| - connection_thresholds_[i].http_rtt()); |
| - DCHECK_EQ(nqe::internal::InvalidRTT(), |
| - connection_thresholds_[i].transport_rtt()); |
| - DCHECK_EQ(nqe::internal::kInvalidThroughput, |
| - connection_thresholds_[i].downstream_throughput_kbps()); |
| - if (effective_connection_type == EFFECTIVE_CONNECTION_TYPE_UNKNOWN) |
| - continue; |
| - |
| - std::string connection_type_name = std::string( |
| - GetNameForEffectiveConnectionType(effective_connection_type)); |
| - |
| - int64_t variations_value; |
| - GetValueForVariationParam(variation_params, |
| - connection_type_name + kThresholdURLRTTMsecSuffix, |
| - default_effective_connection_type_thresholds_[i] |
| - .http_rtt() |
| - .InMilliseconds(), |
| - &variations_value); |
| - connection_thresholds_[i].set_http_rtt( |
| - base::TimeDelta::FromMilliseconds(variations_value)); |
| - |
| - GetValueForVariationParam( |
| - variation_params, |
| - connection_type_name + kThresholdTransportRTTMsecSuffix, |
| - default_effective_connection_type_thresholds_[i] |
| - .transport_rtt() |
| - .InMilliseconds(), |
| - &variations_value); |
| - connection_thresholds_[i].set_transport_rtt( |
| - base::TimeDelta::FromMilliseconds(variations_value)); |
| - |
| - GetValueForVariationParam(variation_params, |
| - connection_type_name + kThresholdKbpsSuffix, |
| - default_effective_connection_type_thresholds_[i] |
| - .downstream_throughput_kbps(), |
| - &variations_value); |
| - connection_thresholds_[i].set_downstream_throughput_kbps(variations_value); |
| - DCHECK(i == 0 || |
| - connection_thresholds_[i].IsFaster(connection_thresholds_[i - 1])); |
| - } |
| + nqe::internal::ObtainDefaultObservations(variation_params, |
| + default_observations_); |
| + nqe::internal::ObtainEffectiveConnectionTypeModelParams( |
| + variation_params, connection_thresholds_); |
| } |
| void NetworkQualityEstimator::AddDefaultEstimates() { |
| @@ -1200,7 +925,7 @@ void NetworkQualityEstimator::RecordMetricsOnMainFrameRequest() const { |
| base::HistogramBase* effective_connection_type_histogram = |
| base::Histogram::FactoryGet( |
| std::string("NQE.MainFrame.EffectiveConnectionType.") + |
| - GetNameForConnectionType(current_network_id_.type), |
| + nqe::internal::GetNameForConnectionType(current_network_id_.type), |
| 0, EFFECTIVE_CONNECTION_TYPE_LAST, |
| EFFECTIVE_CONNECTION_TYPE_LAST /* Number of buckets */, |
| base::HistogramBase::kUmaTargetedHistogramFlag); |