Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 //------------------------------------------------------------------------------ | 5 //------------------------------------------------------------------------------ |
| 6 // Description of the life cycle of a instance of MetricsService. | 6 // Description of the life cycle of a instance of MetricsService. |
| 7 // | 7 // |
| 8 // OVERVIEW | 8 // OVERVIEW |
| 9 // | 9 // |
| 10 // A MetricsService instance is typically created at application startup. It is | 10 // A MetricsService instance is typically created at application startup. It is |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 // twice. For example, if a log file is sent, but not yet acknowledged by | 156 // twice. For example, if a log file is sent, but not yet acknowledged by |
| 157 // the external server, and the user shuts down, then a copy of the log may be | 157 // the external server, and the user shuts down, then a copy of the log may be |
| 158 // saved for re-transmission. These duplicates could be filtered out server | 158 // saved for re-transmission. These duplicates could be filtered out server |
| 159 // side, but are not expected to be a significant problem. | 159 // side, but are not expected to be a significant problem. |
| 160 // | 160 // |
| 161 // | 161 // |
| 162 //------------------------------------------------------------------------------ | 162 //------------------------------------------------------------------------------ |
| 163 | 163 |
| 164 #include "chrome/browser/metrics/metrics_service.h" | 164 #include "chrome/browser/metrics/metrics_service.h" |
| 165 | 165 |
| 166 #include "base/debug/stack_trace.h" | |
| 167 | |
| 166 #include <algorithm> | 168 #include <algorithm> |
| 167 | 169 |
| 168 #include "base/bind.h" | 170 #include "base/bind.h" |
| 169 #include "base/callback.h" | 171 #include "base/callback.h" |
| 170 #include "base/command_line.h" | 172 #include "base/command_line.h" |
| 171 #include "base/guid.h" | 173 #include "base/guid.h" |
| 172 #include "base/md5.h" | 174 #include "base/md5.h" |
| 173 #include "base/metrics/histogram.h" | 175 #include "base/metrics/histogram.h" |
| 174 #include "base/metrics/sparse_histogram.h" | 176 #include "base/metrics/sparse_histogram.h" |
| 175 #include "base/metrics/statistics_recorder.h" | 177 #include "base/metrics/statistics_recorder.h" |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 624 low_entropy_source_value, | 626 low_entropy_source_value, |
| 625 kMaxLowEntropySize)); | 627 kMaxLowEntropySize)); |
| 626 #else | 628 #else |
| 627 return scoped_ptr<const base::FieldTrial::EntropyProvider>( | 629 return scoped_ptr<const base::FieldTrial::EntropyProvider>( |
| 628 new metrics::PermutedEntropyProvider(low_entropy_source_value, | 630 new metrics::PermutedEntropyProvider(low_entropy_source_value, |
| 629 kMaxLowEntropySize)); | 631 kMaxLowEntropySize)); |
| 630 #endif | 632 #endif |
| 631 } | 633 } |
| 632 | 634 |
| 633 void MetricsService::ForceClientIdCreation() { | 635 void MetricsService::ForceClientIdCreation() { |
| 636 DVLOG(2) << "\n\nCreating client id\n\n"; | |
| 637 base::debug::StackTrace st; | |
| 638 // DVLOG(2) << st.ToString(); | |
| 634 if (!client_id_.empty()) | 639 if (!client_id_.empty()) |
| 635 return; | 640 return; |
| 641 DVLOG(2) << "\n\nActually creating id\n\n"; | |
| 636 PrefService* pref = g_browser_process->local_state(); | 642 PrefService* pref = g_browser_process->local_state(); |
| 637 client_id_ = pref->GetString(prefs::kMetricsClientID); | 643 client_id_ = pref->GetString(prefs::kMetricsClientID); |
| 638 if (!client_id_.empty()) | 644 if (!client_id_.empty()) |
| 639 return; | 645 return; |
| 640 | 646 |
| 641 client_id_ = GenerateClientID(); | 647 client_id_ = GenerateClientID(); |
| 642 pref->SetString(prefs::kMetricsClientID, client_id_); | 648 pref->SetString(prefs::kMetricsClientID, client_id_); |
| 643 | 649 |
| 644 // Might as well make a note of how long this ID has existed | 650 // Might as well make a note of how long this ID has existed |
| 645 pref->SetString(prefs::kMetricsClientIDTimestamp, | 651 pref->SetString(prefs::kMetricsClientIDTimestamp, |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1179 | 1185 |
| 1180 const int64 incremental_time_secs = incremental_uptime->InSeconds(); | 1186 const int64 incremental_time_secs = incremental_uptime->InSeconds(); |
| 1181 if (incremental_time_secs > 0) { | 1187 if (incremental_time_secs > 0) { |
| 1182 int64 metrics_uptime = pref->GetInt64(prefs::kUninstallMetricsUptimeSec); | 1188 int64 metrics_uptime = pref->GetInt64(prefs::kUninstallMetricsUptimeSec); |
| 1183 metrics_uptime += incremental_time_secs; | 1189 metrics_uptime += incremental_time_secs; |
| 1184 pref->SetInt64(prefs::kUninstallMetricsUptimeSec, metrics_uptime); | 1190 pref->SetInt64(prefs::kUninstallMetricsUptimeSec, metrics_uptime); |
| 1185 } | 1191 } |
| 1186 } | 1192 } |
| 1187 | 1193 |
| 1188 int MetricsService::GetLowEntropySource() { | 1194 int MetricsService::GetLowEntropySource() { |
| 1195 DVLOG(2) << "\n\nGetting LES\n\n"; | |
| 1196 base::debug::StackTrace st; | |
| 1197 // DVLOG(2) << st.ToString(); | |
| 1189 // Note that the default value for the low entropy source and the default pref | 1198 // Note that the default value for the low entropy source and the default pref |
| 1190 // value are both kLowEntropySourceNotSet, which is used to identify if the | 1199 // value are both kLowEntropySourceNotSet, which is used to identify if the |
| 1191 // value has been set or not. | 1200 // value has been set or not. |
| 1192 if (low_entropy_source_ != kLowEntropySourceNotSet) | 1201 if (low_entropy_source_ != kLowEntropySourceNotSet) |
| 1193 return low_entropy_source_; | 1202 return low_entropy_source_; |
| 1194 | 1203 |
| 1195 PrefService* local_state = g_browser_process->local_state(); | 1204 PrefService* local_state = g_browser_process->local_state(); |
| 1196 const CommandLine* command_line(CommandLine::ForCurrentProcess()); | 1205 const CommandLine* command_line(CommandLine::ForCurrentProcess()); |
| 1197 // Only try to load the value from prefs if the user did not request a reset. | 1206 // Only try to load the value from prefs if the user did not request a reset. |
| 1198 // Otherwise, skip to generating a new value. | 1207 // Otherwise, skip to generating a new value. |
| (...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1855 return; | 1864 return; |
| 1856 } | 1865 } |
| 1857 } | 1866 } |
| 1858 | 1867 |
| 1859 SyntheticTrialGroup trial_group = trial; | 1868 SyntheticTrialGroup trial_group = trial; |
| 1860 trial_group.start_time = base::TimeTicks::Now(); | 1869 trial_group.start_time = base::TimeTicks::Now(); |
| 1861 synthetic_trial_groups_.push_back(trial_group); | 1870 synthetic_trial_groups_.push_back(trial_group); |
| 1862 } | 1871 } |
| 1863 | 1872 |
| 1864 void MetricsService::CheckForClonedInstall() { | 1873 void MetricsService::CheckForClonedInstall() { |
| 1874 DVLOG(2) << "\n\nChecking for cloned installs\n\n"; | |
| 1865 DCHECK(!cloned_install_detector_); | 1875 DCHECK(!cloned_install_detector_); |
| 1866 | 1876 |
| 1867 metrics::MachineIdProvider* provider = | 1877 metrics::MachineIdProvider* provider = |
| 1868 metrics::MachineIdProvider::CreateInstance(); | 1878 metrics::MachineIdProvider::CreateInstance(); |
| 1869 if (!provider) | 1879 if (!provider) |
| 1870 return; | 1880 return; |
| 1871 | 1881 |
| 1872 cloned_install_detector_.reset( | 1882 cloned_install_detector_.reset( |
| 1873 new metrics::ClonedInstallDetector(provider)); | 1883 new metrics::ClonedInstallDetector(provider)); |
| 1874 | 1884 |
| 1875 PrefService* local_state = g_browser_process->local_state(); | 1885 PrefService* local_state = g_browser_process->local_state(); |
| 1876 cloned_install_detector_->CheckForClonedInstall(local_state); | 1886 cloned_install_detector_->CheckForClonedInstall(local_state); |
| 1877 } | 1887 } |
| 1878 | 1888 |
| 1889 void MetricsService::ResetVariationsState() { | |
| 1890 PrefService* local_state = g_browser_process->local_state(); | |
| 1891 DCHECK(local_state->GetBoolean(prefs::kMetricsCloneDetected)); | |
| 1892 DCHECK(client_id_.empty()); | |
| 1893 DCHECK(low_entropy_source_ == kLowEntropySourceNotSet); | |
| 1894 | |
| 1895 DVLOG(2) << "\n\nresetting variatinos state\n\n"; | |
| 1896 | |
| 1897 local_state->ClearPref(prefs::kMetricsClientID); | |
| 1898 local_state->ClearPref(prefs::kMetricsLowEntropySource); | |
| 1899 local_state->SetBoolean(prefs::kMetricsCloneDetected, false); | |
|
Alexei Svitkine (slow)
2014/03/26 21:34:50
Why not ClearPref()?
jwd
2014/03/28 16:23:49
Done.
| |
| 1900 } | |
| 1901 | |
| 1879 void MetricsService::GetCurrentSyntheticFieldTrials( | 1902 void MetricsService::GetCurrentSyntheticFieldTrials( |
| 1880 std::vector<chrome_variations::ActiveGroupId>* synthetic_trials) { | 1903 std::vector<chrome_variations::ActiveGroupId>* synthetic_trials) { |
| 1881 DCHECK(synthetic_trials); | 1904 DCHECK(synthetic_trials); |
| 1882 synthetic_trials->clear(); | 1905 synthetic_trials->clear(); |
| 1883 const MetricsLog* current_log = | 1906 const MetricsLog* current_log = |
| 1884 static_cast<const MetricsLog*>(log_manager_.current_log()); | 1907 static_cast<const MetricsLog*>(log_manager_.current_log()); |
| 1885 for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) { | 1908 for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) { |
| 1886 if (synthetic_trial_groups_[i].start_time <= current_log->creation_time()) | 1909 if (synthetic_trial_groups_[i].start_time <= current_log->creation_time()) |
| 1887 synthetic_trials->push_back(synthetic_trial_groups_[i].id); | 1910 synthetic_trials->push_back(synthetic_trial_groups_[i].id); |
| 1888 } | 1911 } |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2098 // Android has its own settings for metrics / crash uploading. | 2121 // Android has its own settings for metrics / crash uploading. |
| 2099 const PrefService* prefs = g_browser_process->local_state(); | 2122 const PrefService* prefs = g_browser_process->local_state(); |
| 2100 return prefs->GetBoolean(prefs::kCrashReportingEnabled); | 2123 return prefs->GetBoolean(prefs::kCrashReportingEnabled); |
| 2101 #else | 2124 #else |
| 2102 return MetricsServiceHelper::IsMetricsReportingEnabled(); | 2125 return MetricsServiceHelper::IsMetricsReportingEnabled(); |
| 2103 #endif | 2126 #endif |
| 2104 #else | 2127 #else |
| 2105 return false; | 2128 return false; |
| 2106 #endif | 2129 #endif |
| 2107 } | 2130 } |
| OLD | NEW |