[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
blundell | 695d61f | 2015-10-21 11:25:53 | [diff] [blame] | 5 | #include "components/metrics_services_manager/metrics_services_manager.h" |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 6 | |
dcheng | 5160635 | 2015-12-26 21:16:23 | [diff] [blame] | 7 | #include <utility> |
| 8 | |
asvitkine | de445d9 | 2017-06-14 21:37:58 | [diff] [blame] | 9 | #include "base/command_line.h" |
[email protected] | 8e885de | 2014-07-22 23:36:53 | [diff] [blame] | 10 | #include "base/logging.h" |
[email protected] | d6147bd | 2014-06-11 01:58:19 | [diff] [blame] | 11 | #include "components/metrics/metrics_service.h" |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 12 | #include "components/metrics/metrics_service_client.h" |
[email protected] | 16a3091 | 2014-06-04 00:20:04 | [diff] [blame] | 13 | #include "components/metrics/metrics_state_manager.h" |
asvitkine | de445d9 | 2017-06-14 21:37:58 | [diff] [blame] | 14 | #include "components/metrics/metrics_switches.h" |
blundell | 695d61f | 2015-10-21 11:25:53 | [diff] [blame] | 15 | #include "components/metrics_services_manager/metrics_services_manager_client.h" |
nzolghadr | d87a308d | 2016-12-07 15:45:56 | [diff] [blame] | 16 | #include "components/rappor/rappor_service_impl.h" |
holte | 7b74c62 | 2017-01-23 23:13:07 | [diff] [blame] | 17 | #include "components/ukm/ukm_service.h" |
blundell | 0300cdea | 2015-09-03 12:47:44 | [diff] [blame] | 18 | #include "components/variations/service/variations_service.h" |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 19 | |
blundell | 695d61f | 2015-10-21 11:25:53 | [diff] [blame] | 20 | namespace metrics_services_manager { |
| 21 | |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 22 | MetricsServicesManager::MetricsServicesManager( |
dcheng | 84c358e | 2016-04-26 07:05:53 | [diff] [blame] | 23 | std::unique_ptr<MetricsServicesManagerClient> client) |
dcheng | 5160635 | 2015-12-26 21:16:23 | [diff] [blame] | 24 | : client_(std::move(client)), may_upload_(false), may_record_(false) { |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 25 | DCHECK(client_); |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 26 | } |
| 27 | |
blundell | 695d61f | 2015-10-21 11:25:53 | [diff] [blame] | 28 | MetricsServicesManager::~MetricsServicesManager() {} |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 29 | |
robliao | 4bee5d9 | 2016-09-15 14:37:37 | [diff] [blame] | 30 | std::unique_ptr<const base::FieldTrial::EntropyProvider> |
| 31 | MetricsServicesManager::CreateEntropyProvider() { |
| 32 | return client_->CreateEntropyProvider(); |
| 33 | } |
| 34 | |
asvitkine | cbd42073 | 2014-08-26 22:15:40 | [diff] [blame] | 35 | metrics::MetricsService* MetricsServicesManager::GetMetricsService() { |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 36 | DCHECK(thread_checker_.CalledOnValidThread()); |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 37 | return GetMetricsServiceClient()->GetMetricsService(); |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 38 | } |
| 39 | |
nzolghadr | d87a308d | 2016-12-07 15:45:56 | [diff] [blame] | 40 | rappor::RapporServiceImpl* MetricsServicesManager::GetRapporServiceImpl() { |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 41 | DCHECK(thread_checker_.CalledOnValidThread()); |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 42 | if (!rappor_service_) { |
nzolghadr | d87a308d | 2016-12-07 15:45:56 | [diff] [blame] | 43 | rappor_service_ = client_->CreateRapporServiceImpl(); |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 44 | rappor_service_->Initialize(client_->GetURLRequestContext()); |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 45 | } |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 46 | return rappor_service_.get(); |
| 47 | } |
| 48 | |
holte | 7b74c62 | 2017-01-23 23:13:07 | [diff] [blame] | 49 | ukm::UkmService* MetricsServicesManager::GetUkmService() { |
| 50 | DCHECK(thread_checker_.CalledOnValidThread()); |
| 51 | return GetMetricsServiceClient()->GetUkmService(); |
| 52 | } |
| 53 | |
blundell | 57bcfed | 2015-09-04 08:44:45 | [diff] [blame] | 54 | variations::VariationsService* MetricsServicesManager::GetVariationsService() { |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 55 | DCHECK(thread_checker_.CalledOnValidThread()); |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 56 | if (!variations_service_) |
| 57 | variations_service_ = client_->CreateVariationsService(); |
[email protected] | c3cac95 | 2014-05-09 01:51:18 | [diff] [blame] | 58 | return variations_service_.get(); |
| 59 | } |
| 60 | |
[email protected] | 544246e | 2014-06-06 11:22:28 | [diff] [blame] | 61 | void MetricsServicesManager::OnPluginLoadingError( |
| 62 | const base::FilePath& plugin_path) { |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 63 | GetMetricsServiceClient()->OnPluginLoadingError(plugin_path); |
[email protected] | 4a55a71 | 2014-06-08 16:50:34 | [diff] [blame] | 64 | } |
| 65 | |
blundell | 6eb91b7b | 2015-10-23 07:04:43 | [diff] [blame] | 66 | void MetricsServicesManager::OnRendererProcessCrash() { |
| 67 | GetMetricsServiceClient()->OnRendererProcessCrash(); |
| 68 | } |
| 69 | |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 70 | metrics::MetricsServiceClient* |
| 71 | MetricsServicesManager::GetMetricsServiceClient() { |
[email protected] | 4a55a71 | 2014-06-08 16:50:34 | [diff] [blame] | 72 | DCHECK(thread_checker_.CalledOnValidThread()); |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 73 | if (!metrics_service_client_) { |
blundell | fecea528d | 2015-10-21 10:10:22 | [diff] [blame] | 74 | metrics_service_client_ = client_->CreateMetricsServiceClient(); |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 75 | // base::Unretained is safe since |this| owns the metrics_service_client_. |
| 76 | metrics_service_client_->SetUpdateRunningServicesCallback( |
| 77 | base::Bind(&MetricsServicesManager::UpdateRunningServices, |
| 78 | base::Unretained(this))); |
| 79 | } |
[email protected] | 4a55a71 | 2014-06-08 16:50:34 | [diff] [blame] | 80 | return metrics_service_client_.get(); |
[email protected] | 544246e | 2014-06-06 11:22:28 | [diff] [blame] | 81 | } |
| 82 | |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 83 | void MetricsServicesManager::UpdatePermissions(bool current_may_record, |
| 84 | bool current_may_upload) { |
holte | 585f466 | 2015-06-18 19:13:52 | [diff] [blame] | 85 | DCHECK(thread_checker_.CalledOnValidThread()); |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 86 | // If the user has opted out of metrics, delete local UKM state. |
| 87 | if (may_record_ && !current_may_record) { |
| 88 | ukm::UkmService* ukm = GetUkmService(); |
| 89 | if (ukm) { |
| 90 | ukm->Purge(); |
| 91 | ukm->ResetClientId(); |
| 92 | } |
| 93 | } |
| 94 | |
nzolghadr | d87a308d | 2016-12-07 15:45:56 | [diff] [blame] | 95 | // Stash the current permissions so that we can update the RapporServiceImpl |
holte | 873fb7c9 | 2015-02-19 23:41:26 | [diff] [blame] | 96 | // correctly when the Rappor preference changes. The metrics recording |
| 97 | // preference partially determines the initial rappor setting, and also |
| 98 | // controls whether FINE metrics are sent. |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 99 | may_record_ = current_may_record; |
| 100 | may_upload_ = current_may_upload; |
holte | 585f466 | 2015-06-18 19:13:52 | [diff] [blame] | 101 | UpdateRunningServices(); |
| 102 | } |
holte | 873fb7c9 | 2015-02-19 23:41:26 | [diff] [blame] | 103 | |
holte | 585f466 | 2015-06-18 19:13:52 | [diff] [blame] | 104 | void MetricsServicesManager::UpdateRunningServices() { |
| 105 | DCHECK(thread_checker_.CalledOnValidThread()); |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 106 | metrics::MetricsService* metrics = GetMetricsService(); |
| 107 | |
asvitkine | de445d9 | 2017-06-14 21:37:58 | [diff] [blame] | 108 | const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); |
| 109 | if (cmdline->HasSwitch(metrics::switches::kMetricsRecordingOnly)) { |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 110 | metrics->StartRecordingForTests(); |
holte | 0036d9b | 2017-03-15 21:49:16 | [diff] [blame] | 111 | GetRapporServiceImpl()->Update(true, false); |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 112 | return; |
| 113 | } |
| 114 | |
jwd | c882e48d | 2016-08-19 00:14:42 | [diff] [blame] | 115 | client_->UpdateRunningServices(may_record_, may_upload_); |
| 116 | |
holte | 585f466 | 2015-06-18 19:13:52 | [diff] [blame] | 117 | if (may_record_) { |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 118 | if (!metrics->recording_active()) |
| 119 | metrics->Start(); |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 120 | if (may_upload_) |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 121 | metrics->EnableReporting(); |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 122 | else |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 123 | metrics->DisableReporting(); |
wittman | 622851e | 2015-07-31 18:13:40 | [diff] [blame] | 124 | } else { |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 125 | metrics->Stop(); |
| 126 | } |
| 127 | |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 128 | UpdateUkmService(); |
| 129 | |
holte | 0036d9b | 2017-03-15 21:49:16 | [diff] [blame] | 130 | GetRapporServiceImpl()->Update(may_record_, may_upload_); |
holte | 5a7ed7c | 2015-01-09 23:52:46 | [diff] [blame] | 131 | } |
| 132 | |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 133 | void MetricsServicesManager::UpdateUkmService() { |
| 134 | ukm::UkmService* ukm = GetUkmService(); |
| 135 | if (!ukm) |
| 136 | return; |
| 137 | bool sync_enabled = |
holte | 8d28e669 | 2017-05-04 23:50:43 | [diff] [blame] | 138 | client_->IsMetricsReportingForceEnabled() || |
holte | 1334c0aa | 2017-02-09 22:52:41 | [diff] [blame] | 139 | metrics_service_client_->IsHistorySyncEnabledOnAllProfiles(); |
| 140 | if (may_record_ && sync_enabled) { |
| 141 | ukm->EnableRecording(); |
| 142 | if (may_upload_) |
| 143 | ukm->EnableReporting(); |
| 144 | else |
| 145 | ukm->DisableReporting(); |
| 146 | } else { |
| 147 | ukm->DisableRecording(); |
| 148 | ukm->DisableReporting(); |
| 149 | } |
| 150 | } |
| 151 | |
anthonyvd | 40dd030 | 2015-02-19 16:11:34 | [diff] [blame] | 152 | void MetricsServicesManager::UpdateUploadPermissions(bool may_upload) { |
holte | 8d28e669 | 2017-05-04 23:50:43 | [diff] [blame] | 153 | UpdatePermissions((client_->IsMetricsReportingForceEnabled() || |
| 154 | client_->IsMetricsReportingEnabled()), |
| 155 | client_->IsMetricsReportingForceEnabled() || may_upload); |
[email protected] | 3c70256f | 2014-05-22 03:02:12 | [diff] [blame] | 156 | } |
blundell | 695d61f | 2015-10-21 11:25:53 | [diff] [blame] | 157 | |
| 158 | } // namespace metrics_services_manager |