Commit 4bee5d90 authored by robliao's avatar robliao Committed by Commit bot

Move EntropyProvider Source From MetricsService to MetricsServicesManager

This paves the way to allow Variations initialization to occur without
MetricsService initialization. Deferring MetricsService inititalization
is needed for the Browser Task Scheduler work as the underlying
metrics providers will post asynchronous tasks.

BUG=636518

Review-Url: https://codereview.chromium.org/2333283005
Cr-Commit-Position: refs/heads/master@{#418866}
parent 1fd6bb06
...@@ -794,17 +794,14 @@ ChromeBrowserMainParts::~ChromeBrowserMainParts() { ...@@ -794,17 +794,14 @@ ChromeBrowserMainParts::~ChromeBrowserMainParts() {
// This will be called after the command-line has been mutated by about:flags // This will be called after the command-line has been mutated by about:flags
void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() { void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() {
TRACE_EVENT0("startup", "ChromeBrowserMainParts::SetupMetricsAndFieldTrials"); TRACE_EVENT0("startup", "ChromeBrowserMainParts::SetupMetricsAndFieldTrials");
// Must initialize metrics after labs have been converted into switches,
// but before field trials are set up (so that client ID is available for
// one-time randomized field trials).
// Initialize FieldTrialList to support FieldTrials that use one-time // Initialize FieldTrialList to support FieldTrials that use one-time
// randomization. // randomization.
metrics::MetricsService* metrics = browser_process_->metrics_service();
DCHECK(!field_trial_list_); DCHECK(!field_trial_list_);
field_trial_list_.reset( field_trial_list_.reset(
new base::FieldTrialList(metrics->CreateEntropyProvider().release())); new base::FieldTrialList(browser_process_->GetMetricsServicesManager()
->CreateEntropyProvider()
.release()));
const base::CommandLine* command_line = const base::CommandLine* command_line =
base::CommandLine::ForCurrentProcess(); base::CommandLine::ForCurrentProcess();
...@@ -845,6 +842,11 @@ void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() { ...@@ -845,6 +842,11 @@ void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() {
about_flags::RegisterAllFeatureVariationParameters( about_flags::RegisterAllFeatureVariationParameters(
&flags_storage, feature_list.get()); &flags_storage, feature_list.get());
// Must initialize metrics after about:flags have been converted into
// switches, but before field trials are set up (so that client ID is
// available for one-time randomized field trials).
metrics::MetricsService* metrics = browser_process_->metrics_service();
variations::VariationsHttpHeaderProvider* http_header_provider = variations::VariationsHttpHeaderProvider* http_header_provider =
variations::VariationsHttpHeaderProvider::GetInstance(); variations::VariationsHttpHeaderProvider::GetInstance();
// Force the variation ids selected in chrome://flags and/or specified using // Force the variation ids selected in chrome://flags and/or specified using
......
...@@ -210,6 +210,11 @@ ChromeMetricsServicesManagerClient::CreateMetricsServiceClient() { ...@@ -210,6 +210,11 @@ ChromeMetricsServicesManagerClient::CreateMetricsServiceClient() {
return ChromeMetricsServiceClient::Create(GetMetricsStateManager()); return ChromeMetricsServiceClient::Create(GetMetricsStateManager());
} }
std::unique_ptr<const base::FieldTrial::EntropyProvider>
ChromeMetricsServicesManagerClient::CreateEntropyProvider() {
return GetMetricsStateManager()->CreateDefaultEntropyProvider();
}
net::URLRequestContextGetter* net::URLRequestContextGetter*
ChromeMetricsServicesManagerClient::GetURLRequestContext() { ChromeMetricsServicesManagerClient::GetURLRequestContext() {
return g_browser_process->system_request_context(); return g_browser_process->system_request_context();
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/feature_list.h" #include "base/feature_list.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/metrics/field_trial.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "components/metrics_services_manager/metrics_services_manager_client.h" #include "components/metrics_services_manager/metrics_services_manager_client.h"
...@@ -64,6 +65,8 @@ class ChromeMetricsServicesManagerClient ...@@ -64,6 +65,8 @@ class ChromeMetricsServicesManagerClient
override; override;
std::unique_ptr<metrics::MetricsServiceClient> CreateMetricsServiceClient() std::unique_ptr<metrics::MetricsServiceClient> CreateMetricsServiceClient()
override; override;
std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider() override;
net::URLRequestContextGetter* GetURLRequestContext() override; net::URLRequestContextGetter* GetURLRequestContext() override;
bool IsSafeBrowsingEnabled(const base::Closure& on_update_callback) override; bool IsSafeBrowsingEnabled(const base::Closure& on_update_callback) override;
bool IsMetricsReportingEnabled() override; bool IsMetricsReportingEnabled() override;
......
...@@ -361,13 +361,6 @@ bool MetricsService::WasLastShutdownClean() const { ...@@ -361,13 +361,6 @@ bool MetricsService::WasLastShutdownClean() const {
return clean_exit_beacon_.exited_cleanly(); return clean_exit_beacon_.exited_cleanly();
} }
std::unique_ptr<const base::FieldTrial::EntropyProvider>
MetricsService::CreateEntropyProvider() {
// TODO(asvitkine): Refactor the code so that MetricsService does not expose
// this method.
return state_manager_->CreateDefaultEntropyProvider();
}
void MetricsService::EnableRecording() { void MetricsService::EnableRecording() {
DCHECK(IsSingleThreaded()); DCHECK(IsSingleThreaded());
......
...@@ -124,16 +124,6 @@ class MetricsService : public base::HistogramFlattener { ...@@ -124,16 +124,6 @@ class MetricsService : public base::HistogramFlattener {
// Returns true if the last session exited cleanly. // Returns true if the last session exited cleanly.
bool WasLastShutdownClean() const; bool WasLastShutdownClean() const;
// Returns the preferred entropy provider used to seed persistent activities
// based on whether or not metrics reporting will be permitted on this client.
//
// If metrics reporting is enabled, this method returns an entropy provider
// that has a high source of entropy, partially based on the client ID.
// Otherwise, it returns an entropy provider that is based on a low entropy
// source.
std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider();
// At startup, prefs needs to be called with a list of all the pref names and // At startup, prefs needs to be called with a list of all the pref names and
// types we'll be using. // types we'll be using.
static void RegisterPrefs(PrefRegistrySimple* registry); static void RegisterPrefs(PrefRegistrySimple* registry);
......
...@@ -24,6 +24,11 @@ MetricsServicesManager::MetricsServicesManager( ...@@ -24,6 +24,11 @@ MetricsServicesManager::MetricsServicesManager(
MetricsServicesManager::~MetricsServicesManager() {} MetricsServicesManager::~MetricsServicesManager() {}
std::unique_ptr<const base::FieldTrial::EntropyProvider>
MetricsServicesManager::CreateEntropyProvider() {
return client_->CreateEntropyProvider();
}
metrics::MetricsService* MetricsServicesManager::GetMetricsService() { metrics::MetricsService* MetricsServicesManager::GetMetricsService() {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
return GetMetricsServiceClient()->GetMetricsService(); return GetMetricsServiceClient()->GetMetricsService();
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "base/metrics/field_trial.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
namespace base { namespace base {
...@@ -42,6 +43,16 @@ class MetricsServicesManager { ...@@ -42,6 +43,16 @@ class MetricsServicesManager {
std::unique_ptr<MetricsServicesManagerClient> client); std::unique_ptr<MetricsServicesManagerClient> client);
virtual ~MetricsServicesManager(); virtual ~MetricsServicesManager();
// Returns the preferred entropy provider used to seed persistent activities
// based on whether or not metrics reporting is permitted on this client.
//
// If there's consent to report metrics, this method returns an entropy
// provider that has a high source of entropy, partially based on the client
// ID. Otherwise, it returns an entropy provider that is based on a low
// entropy source.
std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider();
// Returns the MetricsService, creating it if it hasn't been created yet (and // Returns the MetricsService, creating it if it hasn't been created yet (and
// additionally creating the MetricsServiceClient in that case). // additionally creating the MetricsServiceClient in that case).
metrics::MetricsService* GetMetricsService(); metrics::MetricsService* GetMetricsService();
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/metrics/field_trial.h"
namespace metrics { namespace metrics {
class MetricsServiceClient; class MetricsServiceClient;
...@@ -39,6 +40,8 @@ class MetricsServicesManagerClient { ...@@ -39,6 +40,8 @@ class MetricsServicesManagerClient {
CreateVariationsService() = 0; CreateVariationsService() = 0;
virtual std::unique_ptr<metrics::MetricsServiceClient> virtual std::unique_ptr<metrics::MetricsServiceClient>
CreateMetricsServiceClient() = 0; CreateMetricsServiceClient() = 0;
virtual std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider() = 0;
// Returns the URL request context in which the metrics services should // Returns the URL request context in which the metrics services should
// operate. // operate.
......
...@@ -196,15 +196,13 @@ void IOSChromeMainParts::SetUpMetricsAndFieldTrials() { ...@@ -196,15 +196,13 @@ void IOSChromeMainParts::SetUpMetricsAndFieldTrials() {
base::SetRecordActionTaskRunner( base::SetRecordActionTaskRunner(
web::WebThread::GetTaskRunnerForThread(web::WebThread::UI)); web::WebThread::GetTaskRunnerForThread(web::WebThread::UI));
// Must initialize metrics after labs have been converted into switches,
// but before field trials are set up (so that client ID is available for
// one-time randomized field trials).
metrics::MetricsService* metrics = application_context_->GetMetricsService();
// Initialize FieldTrialList to support FieldTrials that use one-time // Initialize FieldTrialList to support FieldTrials that use one-time
// randomization. // randomization.
DCHECK(!field_trial_list_);
field_trial_list_.reset( field_trial_list_.reset(
new base::FieldTrialList(metrics->CreateEntropyProvider().release())); new base::FieldTrialList(application_context_->GetMetricsServicesManager()
->CreateEntropyProvider()
.release()));
const base::CommandLine* command_line = const base::CommandLine* command_line =
base::CommandLine::ForCurrentProcess(); base::CommandLine::ForCurrentProcess();
...@@ -228,6 +226,11 @@ void IOSChromeMainParts::SetUpMetricsAndFieldTrials() { ...@@ -228,6 +226,11 @@ void IOSChromeMainParts::SetUpMetricsAndFieldTrials() {
std::vector<std::string> variation_ids = std::vector<std::string> variation_ids =
RegisterAllFeatureVariationParameters(&flags_storage, feature_list.get()); RegisterAllFeatureVariationParameters(&flags_storage, feature_list.get());
// Must initialize metrics after about:flags have been converted into
// switches, but before field trials are set up (so that client ID is
// available for one-time randomized field trials).
metrics::MetricsService* metrics = application_context_->GetMetricsService();
variations::VariationsHttpHeaderProvider* http_header_provider = variations::VariationsHttpHeaderProvider* http_header_provider =
variations::VariationsHttpHeaderProvider::GetInstance(); variations::VariationsHttpHeaderProvider::GetInstance();
// Force the variation ids selected in chrome://flags and/or specified using // Force the variation ids selected in chrome://flags and/or specified using
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "base/metrics/field_trial.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "components/metrics_services_manager/metrics_services_manager_client.h" #include "components/metrics_services_manager/metrics_services_manager_client.h"
...@@ -38,6 +39,9 @@ class IOSChromeMetricsServicesManagerClient ...@@ -38,6 +39,9 @@ class IOSChromeMetricsServicesManagerClient
override; override;
std::unique_ptr<metrics::MetricsServiceClient> CreateMetricsServiceClient() std::unique_ptr<metrics::MetricsServiceClient> CreateMetricsServiceClient()
override; override;
std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider() override;
net::URLRequestContextGetter* GetURLRequestContext() override; net::URLRequestContextGetter* GetURLRequestContext() override;
bool IsSafeBrowsingEnabled(const base::Closure& on_update_callback) override; bool IsSafeBrowsingEnabled(const base::Closure& on_update_callback) override;
bool IsMetricsReportingEnabled() override; bool IsMetricsReportingEnabled() override;
......
...@@ -80,6 +80,11 @@ IOSChromeMetricsServicesManagerClient::CreateMetricsServiceClient() { ...@@ -80,6 +80,11 @@ IOSChromeMetricsServicesManagerClient::CreateMetricsServiceClient() {
return IOSChromeMetricsServiceClient::Create(GetMetricsStateManager()); return IOSChromeMetricsServiceClient::Create(GetMetricsStateManager());
} }
std::unique_ptr<const base::FieldTrial::EntropyProvider>
IOSChromeMetricsServicesManagerClient::CreateEntropyProvider() {
return GetMetricsStateManager()->CreateDefaultEntropyProvider();
}
net::URLRequestContextGetter* net::URLRequestContextGetter*
IOSChromeMetricsServicesManagerClient::GetURLRequestContext() { IOSChromeMetricsServicesManagerClient::GetURLRequestContext() {
return GetApplicationContext()->GetSystemURLRequestContext(); return GetApplicationContext()->GetSystemURLRequestContext();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment