metrics_state_manager.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/metrics/metrics_state_manager.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/command_line.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/guid.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/metrics/histogram.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/metrics/sparse_histogram.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/prefs/pref_service.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/rand_util.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/time/time.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/metrics/cloned_install_detector.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/metrics/machine_id_provider.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/metrics/metrics_pref_names.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/metrics/metrics_switches.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/variations/caching_permuted_entropy_provider.h" 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace metrics { 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// The argument used to generate a non-identifying entropy source. We want no 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// more than 13 bits of entropy, so use this max to return a number in the range 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// [0, 7999] as the entropy source (12.97 bits of entropy). 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kMaxLowEntropySize = 8000; 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Default prefs value for prefs::kMetricsLowEntropySource to indicate that 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// the value has not yet been set. 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kLowEntropySourceNotSet = -1; 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Generates a new non-identifying entropy source used to seed persistent 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// activities. 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int GenerateLowEntropySource() { 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return base::RandInt(0, kMaxLowEntropySize - 1); 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool MetricsStateManager::instance_exists_ = false; 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MetricsStateManager::MetricsStateManager( 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefService* local_state, 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Callback<bool(void)>& is_reporting_enabled_callback) 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : local_state_(local_state), 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_reporting_enabled_callback_(is_reporting_enabled_callback), 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) low_entropy_source_(kLowEntropySourceNotSet), 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) entropy_source_returned_(ENTROPY_SOURCE_NONE) { 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResetMetricsIDsIfNecessary(); 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (IsMetricsReportingEnabled()) 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ForceClientIdCreation(); 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(!instance_exists_); 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) instance_exists_ = true; 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MetricsStateManager::~MetricsStateManager() { 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(instance_exists_); 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) instance_exists_ = false; 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool MetricsStateManager::IsMetricsReportingEnabled() { 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return is_reporting_enabled_callback_.Run(); 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void MetricsStateManager::ForceClientIdCreation() { 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!client_id_.empty()) 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) client_id_ = local_state_->GetString(prefs::kMetricsClientID); 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!client_id_.empty()) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client_id_ = base::GenerateGUID(); 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) local_state_->SetString(prefs::kMetricsClientID, client_id_); 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (local_state_->GetString(prefs::kMetricsOldClientID).empty()) { 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Record the timestamp of when the user opted in to UMA. 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) local_state_->SetInt64(prefs::kMetricsReportingEnabledTimestamp, 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Time::Now().ToTimeT()); 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("UMA.ClientIdMigrated", true); 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) local_state_->ClearPref(prefs::kMetricsOldClientID); 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void MetricsStateManager::CheckForClonedInstall( 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner) { 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(!cloned_install_detector_); 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MachineIdProvider* provider = MachineIdProvider::CreateInstance(); 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!provider) 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cloned_install_detector_.reset(new ClonedInstallDetector(provider)); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cloned_install_detector_->CheckForClonedInstall(local_state_, task_runner); 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_ptr<const base::FieldTrial::EntropyProvider> 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MetricsStateManager::CreateEntropyProvider() { 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // For metrics reporting-enabled users, we combine the client ID and low 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // entropy source to get the final entropy source. Otherwise, only use the low 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // entropy source. 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This has two useful properties: 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // 1) It makes the entropy source less identifiable for parties that do not 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // know the low entropy source. 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // 2) It makes the final entropy source resettable. 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int low_entropy_source_value = GetLowEntropySource(); 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UMA_HISTOGRAM_SPARSE_SLOWLY("UMA.LowEntropySourceValue", 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) low_entropy_source_value); 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (IsMetricsReportingEnabled()) { 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (entropy_source_returned_ == ENTROPY_SOURCE_NONE) 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) entropy_source_returned_ = ENTROPY_SOURCE_HIGH; 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(ENTROPY_SOURCE_HIGH, entropy_source_returned_); 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string high_entropy_source = 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client_id_ + base::IntToString(low_entropy_source_value); 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return scoped_ptr<const base::FieldTrial::EntropyProvider>( 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new SHA1EntropyProvider(high_entropy_source)); 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (entropy_source_returned_ == ENTROPY_SOURCE_NONE) 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) entropy_source_returned_ = ENTROPY_SOURCE_LOW; 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(ENTROPY_SOURCE_LOW, entropy_source_returned_); 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS) 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return scoped_ptr<const base::FieldTrial::EntropyProvider>( 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new CachingPermutedEntropyProvider(local_state_, 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) low_entropy_source_value, 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kMaxLowEntropySize)); 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return scoped_ptr<const base::FieldTrial::EntropyProvider>( 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PermutedEntropyProvider(low_entropy_source_value, 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kMaxLowEntropySize)); 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_ptr<MetricsStateManager> MetricsStateManager::Create( 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefService* local_state, 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Callback<bool(void)>& is_reporting_enabled_callback) { 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<MetricsStateManager> result; 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Note: |instance_exists_| is updated in the constructor and destructor. 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!instance_exists_) { 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.reset( 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MetricsStateManager(local_state, is_reporting_enabled_callback)); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return result.Pass(); 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void MetricsStateManager::RegisterPrefs(PrefRegistrySimple* registry) { 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kMetricsResetIds, false); 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) registry->RegisterStringPref(prefs::kMetricsClientID, std::string()); 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) registry->RegisterInt64Pref(prefs::kMetricsReportingEnabledTimestamp, 0); 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) registry->RegisterIntegerPref(prefs::kMetricsLowEntropySource, 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kLowEntropySourceNotSet); 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClonedInstallDetector::RegisterPrefs(registry); 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CachingPermutedEntropyProvider::RegisterPrefs(registry); 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(asvitkine): Remove these once a couple of releases have passed. 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // http://crbug.com/357704 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) registry->RegisterStringPref(prefs::kMetricsOldClientID, std::string()); 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) registry->RegisterIntegerPref(prefs::kMetricsOldLowEntropySource, 0); 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int MetricsStateManager::GetLowEntropySource() { 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Note that the default value for the low entropy source and the default pref 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // value are both kLowEntropySourceNotSet, which is used to identify if the 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // value has been set or not. 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (low_entropy_source_ != kLowEntropySourceNotSet) 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return low_entropy_source_; 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const CommandLine* command_line(CommandLine::ForCurrentProcess()); 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Only try to load the value from prefs if the user did not request a 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // reset. 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Otherwise, skip to generating a new value. 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!command_line->HasSwitch(switches::kResetVariationState)) { 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int value = local_state_->GetInteger(prefs::kMetricsLowEntropySource); 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If the value is outside the [0, kMaxLowEntropySize) range, re-generate 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // it below. 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (value >= 0 && value < kMaxLowEntropySize) { 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) low_entropy_source_ = value; 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("UMA.GeneratedLowEntropySource", false); 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return low_entropy_source_; 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("UMA.GeneratedLowEntropySource", true); 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) low_entropy_source_ = GenerateLowEntropySource(); 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) local_state_->SetInteger(prefs::kMetricsLowEntropySource, 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) low_entropy_source_); 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) local_state_->ClearPref(prefs::kMetricsOldLowEntropySource); 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CachingPermutedEntropyProvider::ClearCache(local_state_); 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return low_entropy_source_; 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void MetricsStateManager::ResetMetricsIDsIfNecessary() { 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!local_state_->GetBoolean(prefs::kMetricsResetIds)) 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("UMA.MetricsIDsReset", true); 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(client_id_.empty()); 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(kLowEntropySourceNotSet, low_entropy_source_); 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) local_state_->ClearPref(prefs::kMetricsClientID); 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) local_state_->ClearPref(prefs::kMetricsLowEntropySource); 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) local_state_->ClearPref(prefs::kMetricsResetIds); 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace metrics 218