Index: chrome/browser/metrics/chrome_metrics_services_manager_client.cc |
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc |
index a31d9af6a10d4291b9d515ff2d0631a7f3f1fe11..61dc5dc149381f24714d61314b99f68d7c228a3d 100644 |
--- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc |
+++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc |
@@ -8,6 +8,7 @@ |
#include "base/feature_list.h" |
#include "base/logging.h" |
#include "base/memory/ptr_util.h" |
+#include "base/strings/string_number_conversions.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" |
#include "chrome/browser/metrics/chrome_metrics_service_client.h" |
@@ -21,10 +22,20 @@ |
#include "components/prefs/pref_service.h" |
#include "components/rappor/rappor_service.h" |
#include "components/variations/service/variations_service.h" |
+#include "components/variations/variations_associated_data.h" |
#include "content/public/browser/browser_thread.h" |
namespace { |
+// Name of the variations param that defines the sampling rate. |
+const char kRateParamName[] = "sampling_rate_per_mille"; |
+ |
+// Metrics reporting feature. This feature, along with user consent, controls if |
+// recording and reporting are enabled. If the feature is enabled, but no |
+// consent is given, then there will be no recording or reporting. |
+const base::Feature kMetricsReportingFeature{"MetricsReporting", |
+ base::FEATURE_ENABLED_BY_DEFAULT}; |
+ |
// Posts |GoogleUpdateSettings::StoreMetricsClientInfo| on blocking pool thread |
// because it needs access to IO and cannot work from UI thread. |
void PostStoreMetricsClientInfo(const metrics::ClientInfo& client_info) { |
@@ -33,10 +44,16 @@ void PostStoreMetricsClientInfo(const metrics::ClientInfo& client_info) { |
base::Bind(&GoogleUpdateSettings::StoreMetricsClientInfo, client_info)); |
} |
+// Only clients that were given an opt-out metrics-reporting consent flow are |
+// eligible for sampling. |
+bool IsClientEligibleForSampling() { |
+ return metrics::GetMetricsReportingDefaultState( |
+ g_browser_process->local_state()) == |
+ metrics::EnableMetricsDefault::OPT_OUT; |
+} |
+ |
} // namespace |
-const base::Feature kMetricsReportingFeature{"MetricsReporting", |
- base::FEATURE_ENABLED_BY_DEFAULT}; |
class ChromeMetricsServicesManagerClient::ChromeEnabledStateProvider |
: public metrics::EnabledStateProvider { |
@@ -50,7 +67,7 @@ class ChromeMetricsServicesManagerClient::ChromeEnabledStateProvider |
bool IsReportingEnabled() override { |
return IsConsentGiven() && |
- base::FeatureList::IsEnabled(kMetricsReportingFeature); |
+ ChromeMetricsServicesManagerClient::IsClientInSample(); |
} |
DISALLOW_COPY_AND_ASSIGN(ChromeEnabledStateProvider); |
@@ -67,6 +84,45 @@ ChromeMetricsServicesManagerClient::ChromeMetricsServicesManagerClient( |
ChromeMetricsServicesManagerClient::~ChromeMetricsServicesManagerClient() {} |
+// static |
+bool ChromeMetricsServicesManagerClient::IsClientInSample() { |
+ // Only some clients are eligible for sampling. Clients that aren't eligible |
+ // will always be considered "in sample". In this case, we don't want the |
+ // feature state queried, because we don't want the field trial that controls |
+ // sampling to be reported as active. |
+ if (!IsClientEligibleForSampling()) { |
Alexei Svitkine (slow)
2016/08/01 15:49:56
Nit: No {}'s
Same below for 1-liners.
jwd
2016/08/01 16:45:29
Done.
|
+ return true; |
+ } |
+ |
+ return base::FeatureList::IsEnabled(kMetricsReportingFeature); |
+} |
+ |
+// static |
+int ChromeMetricsServicesManagerClient::GetSamplingRatePerMille() { |
+ // The population that is NOT eligible for sampling in considered "in sample", |
+ // so that population's sampling rate is 1000/1000. |
+ if (!IsClientEligibleForSampling()) { |
+ return 1000; |
+ } |
+ |
+ std::string rate_str = variations::GetVariationParamValueByFeature( |
+ kMetricsReportingFeature, kRateParamName); |
+ if (rate_str.empty()) { |
+ // The parameter can be empty either if the feature is dissabled, or the |
Alexei Svitkine (slow)
2016/08/01 15:49:56
disabled - also mispeled below
jwd
2016/08/01 16:45:29
Done.
|
+ // parameter isn't defined in an associated variation. The dissabled case is |
+ // unimportant, since no metrics are reported. If the parameter is |
+ // undefined, assume sampling is not being done, i.e. the sample rate is |
+ // 1000/1000. |
+ return 1000; |
+ } |
+ |
+ int rate; |
+ if (!base::StringToInt(rate_str, &rate) || rate > 1000) { |
+ return 1000; |
+ } |
+ return rate; |
+} |
+ |
std::unique_ptr<rappor::RapporService> |
ChromeMetricsServicesManagerClient::CreateRapporService() { |
DCHECK(thread_checker_.CalledOnValidThread()); |