metrics_services_manager.cc 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. #include "components/metrics_services_manager/metrics_services_manager.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/check.h"
  8. #include "base/metrics/histogram_macros.h"
  9. #include "build/chromeos_buildflags.h"
  10. #include "components/metrics/metrics_service.h"
  11. #include "components/metrics/metrics_service_client.h"
  12. #include "components/metrics/metrics_state_manager.h"
  13. #include "components/metrics/metrics_switches.h"
  14. #include "components/metrics_services_manager/metrics_services_manager_client.h"
  15. #include "components/ukm/ukm_service.h"
  16. #include "components/variations/service/variations_service.h"
  17. #include "services/network/public/cpp/shared_url_loader_factory.h"
  18. #if BUILDFLAG(IS_CHROMEOS_ASH)
  19. #include "components/metrics/structured/neutrino_logging.h" // nogncheck
  20. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  21. namespace metrics_services_manager {
  22. MetricsServicesManager::MetricsServicesManager(
  23. std::unique_ptr<MetricsServicesManagerClient> client)
  24. : client_(std::move(client)),
  25. may_upload_(false),
  26. may_record_(false),
  27. consent_given_(false) {
  28. DCHECK(client_);
  29. }
  30. MetricsServicesManager::~MetricsServicesManager() {}
  31. void MetricsServicesManager::InstantiateFieldTrialList(
  32. const char* enable_gpu_benchmarking_switch) const {
  33. #if BUILDFLAG(IS_CHROMEOS_ASH)
  34. metrics::structured::NeutrinoDevicesLog(
  35. metrics::structured::NeutrinoDevicesLocation::kCreateEntropyProvider);
  36. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  37. client_->GetMetricsStateManager()->InstantiateFieldTrialList(
  38. enable_gpu_benchmarking_switch, metrics::EntropyProviderType::kDefault);
  39. }
  40. metrics::MetricsService* MetricsServicesManager::GetMetricsService() {
  41. DCHECK(thread_checker_.CalledOnValidThread());
  42. return GetMetricsServiceClient()->GetMetricsService();
  43. }
  44. ukm::UkmService* MetricsServicesManager::GetUkmService() {
  45. DCHECK(thread_checker_.CalledOnValidThread());
  46. return GetMetricsServiceClient()->GetUkmService();
  47. }
  48. variations::VariationsService* MetricsServicesManager::GetVariationsService() {
  49. DCHECK(thread_checker_.CalledOnValidThread());
  50. if (!variations_service_)
  51. variations_service_ = client_->CreateVariationsService();
  52. return variations_service_.get();
  53. }
  54. void MetricsServicesManager::LoadingStateChanged(bool is_loading) {
  55. DCHECK(thread_checker_.CalledOnValidThread());
  56. GetMetricsServiceClient()->LoadingStateChanged(is_loading);
  57. }
  58. std::unique_ptr<const base::FieldTrial::EntropyProvider>
  59. MetricsServicesManager::CreateLowEntropyProviderForTesting() {
  60. return client_->GetMetricsStateManager()->CreateLowEntropyProvider();
  61. }
  62. metrics::MetricsServiceClient*
  63. MetricsServicesManager::GetMetricsServiceClient() {
  64. DCHECK(thread_checker_.CalledOnValidThread());
  65. if (!metrics_service_client_) {
  66. metrics_service_client_ = client_->CreateMetricsServiceClient();
  67. // base::Unretained is safe since |this| owns the metrics_service_client_.
  68. metrics_service_client_->SetUpdateRunningServicesCallback(
  69. base::BindRepeating(&MetricsServicesManager::UpdateRunningServices,
  70. base::Unretained(this)));
  71. }
  72. return metrics_service_client_.get();
  73. }
  74. void MetricsServicesManager::UpdatePermissions(bool current_may_record,
  75. bool current_consent_given,
  76. bool current_may_upload) {
  77. DCHECK(thread_checker_.CalledOnValidThread());
  78. // If the user has opted out of metrics, delete local UKM state. We only check
  79. // consent for UKM.
  80. if (consent_given_ && !current_consent_given) {
  81. ukm::UkmService* ukm = GetUkmService();
  82. if (ukm) {
  83. ukm->Purge();
  84. ukm->ResetClientState(ukm::ResetReason::kUpdatePermissions);
  85. }
  86. }
  87. // If metrics reporting goes from not consented to consented, create and
  88. // persist a client ID (either generate a new one or promote the provisional
  89. // client ID if this is the first run). This can occur in the following
  90. // situations:
  91. // 1. The user enables metrics reporting in the FRE
  92. // 2. The user enables metrics reporting in settings, crash bubble, etc.
  93. // 3. On startup, after fetching the enable status from the previous session
  94. // (if enabled)
  95. //
  96. // ForceClientIdCreation() may be called again later on via
  97. // MetricsService::EnableRecording(), but in that case,
  98. // ForceClientIdCreation() will be a no-op (will return early since a client
  99. // ID will already exist).
  100. //
  101. // ForceClientIdCreation() must be called here, otherwise, in cases where the
  102. // user is sampled out, the passed |current_may_record| will be false, which
  103. // will result in not calling ForceClientIdCreation() in
  104. // MetricsService::EnableRecording() later on. This is problematic because
  105. // in the FRE, if the user consents to metrics reporting, this will cause the
  106. // provisional client ID to not be promoted/stored as the client ID. In the
  107. // next run, a different client ID will be generated and stored, which will
  108. // result in different trial assignments—and the client may even be sampled
  109. // in at that time.
  110. if (!consent_given_ && current_consent_given) {
  111. client_->GetMetricsStateManager()->ForceClientIdCreation();
  112. }
  113. // Stash the current permissions so that we can update the services correctly
  114. // when preferences change.
  115. may_record_ = current_may_record;
  116. consent_given_ = current_consent_given;
  117. may_upload_ = current_may_upload;
  118. UpdateRunningServices();
  119. }
  120. void MetricsServicesManager::UpdateRunningServices() {
  121. DCHECK(thread_checker_.CalledOnValidThread());
  122. metrics::MetricsService* metrics = GetMetricsService();
  123. if (metrics::IsMetricsRecordingOnlyEnabled()) {
  124. metrics->StartRecordingForTests();
  125. return;
  126. }
  127. client_->UpdateRunningServices(may_record_, may_upload_);
  128. if (may_record_) {
  129. if (!metrics->recording_active())
  130. metrics->Start();
  131. if (may_upload_)
  132. metrics->EnableReporting();
  133. else
  134. metrics->DisableReporting();
  135. } else {
  136. metrics->Stop();
  137. }
  138. UpdateUkmService();
  139. }
  140. void MetricsServicesManager::UpdateUkmService() {
  141. ukm::UkmService* ukm = GetUkmService();
  142. if (!ukm)
  143. return;
  144. bool listeners_active =
  145. metrics_service_client_->AreNotificationListenersEnabledOnAllProfiles();
  146. bool sync_enabled =
  147. metrics_service_client_->IsMetricsReportingForceEnabled() ||
  148. metrics_service_client_->IsUkmAllowedForAllProfiles();
  149. bool is_incognito = client_->IsOffTheRecordSessionActive();
  150. if (consent_given_ && listeners_active && sync_enabled && !is_incognito) {
  151. // TODO(skare): revise this - merged in a big change
  152. ukm->EnableRecording(
  153. metrics_service_client_->IsUkmAllowedWithExtensionsForAllProfiles());
  154. if (may_upload_)
  155. ukm->EnableReporting();
  156. else
  157. ukm->DisableReporting();
  158. } else {
  159. ukm->DisableRecording();
  160. ukm->DisableReporting();
  161. }
  162. }
  163. void MetricsServicesManager::UpdateUploadPermissions(bool may_upload) {
  164. if (metrics_service_client_->IsMetricsReportingForceEnabled()) {
  165. UpdatePermissions(true, true, true);
  166. return;
  167. }
  168. UpdatePermissions(client_->IsMetricsReportingEnabled(),
  169. client_->IsMetricsConsentGiven(), may_upload);
  170. }
  171. bool MetricsServicesManager::IsMetricsReportingEnabled() const {
  172. return client_->IsMetricsReportingEnabled();
  173. }
  174. bool MetricsServicesManager::IsMetricsConsentGiven() const {
  175. return client_->IsMetricsConsentGiven();
  176. }
  177. bool MetricsServicesManager::IsUkmAllowedForAllProfiles() {
  178. return metrics_service_client_->IsUkmAllowedForAllProfiles();
  179. }
  180. } // namespace metrics_services_manager