OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 #include "chrome/browser/metrics/chrome_metrics_service_client.h" | 5 #include "chrome/browser/metrics/chrome_metrics_service_client.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 18 matching lines...) Expand all Loading... | |
29 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" | 29 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" |
30 #include "chrome/browser/metrics/https_engagement_metrics_provider.h" | 30 #include "chrome/browser/metrics/https_engagement_metrics_provider.h" |
31 #include "chrome/browser/metrics/metrics_reporting_state.h" | 31 #include "chrome/browser/metrics/metrics_reporting_state.h" |
32 #include "chrome/browser/metrics/sampling_metrics_provider.h" | 32 #include "chrome/browser/metrics/sampling_metrics_provider.h" |
33 #include "chrome/browser/metrics/subprocess_metrics_provider.h" | 33 #include "chrome/browser/metrics/subprocess_metrics_provider.h" |
34 #include "chrome/browser/metrics/time_ticks_experiment_win.h" | 34 #include "chrome/browser/metrics/time_ticks_experiment_win.h" |
35 #include "chrome/browser/sync/chrome_sync_client.h" | 35 #include "chrome/browser/sync/chrome_sync_client.h" |
36 #include "chrome/browser/ui/browser_otr_state.h" | 36 #include "chrome/browser/ui/browser_otr_state.h" |
37 #include "chrome/common/channel_info.h" | 37 #include "chrome/common/channel_info.h" |
38 #include "chrome/common/chrome_paths.h" | 38 #include "chrome/common/chrome_paths.h" |
39 #include "chrome/common/chrome_paths_internal.h" | |
39 #include "chrome/common/chrome_switches.h" | 40 #include "chrome/common/chrome_switches.h" |
40 #include "chrome/common/crash_keys.h" | 41 #include "chrome/common/crash_keys.h" |
41 #include "chrome/common/features.h" | 42 #include "chrome/common/features.h" |
42 #include "chrome/installer/util/util_constants.h" | 43 #include "chrome/installer/util/util_constants.h" |
43 #include "components/metrics/call_stack_profile_metrics_provider.h" | 44 #include "components/metrics/call_stack_profile_metrics_provider.h" |
44 #include "components/metrics/drive_metrics_provider.h" | 45 #include "components/metrics/drive_metrics_provider.h" |
45 #include "components/metrics/file_metrics_provider.h" | 46 #include "components/metrics/file_metrics_provider.h" |
46 #include "components/metrics/gpu/gpu_metrics_provider.h" | 47 #include "components/metrics/gpu/gpu_metrics_provider.h" |
47 #include "components/metrics/metrics_pref_names.h" | 48 #include "components/metrics/metrics_pref_names.h" |
48 #include "components/metrics/metrics_reporting_default_state.h" | 49 #include "components/metrics/metrics_reporting_default_state.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
103 #include "chrome/browser/signin/chrome_signin_status_metrics_provider_delegate.h " | 104 #include "chrome/browser/signin/chrome_signin_status_metrics_provider_delegate.h " |
104 #include "components/signin/core/browser/signin_status_metrics_provider.h" | 105 #include "components/signin/core/browser/signin_status_metrics_provider.h" |
105 #endif // !defined(OS_CHROMEOS) | 106 #endif // !defined(OS_CHROMEOS) |
106 | 107 |
107 namespace { | 108 namespace { |
108 | 109 |
109 // This specifies the amount of time to wait for all renderers to send their | 110 // This specifies the amount of time to wait for all renderers to send their |
110 // data. | 111 // data. |
111 const int kMaxHistogramGatheringWaitDuration = 60000; // 60 seconds. | 112 const int kMaxHistogramGatheringWaitDuration = 60000; // 60 seconds. |
112 | 113 |
114 // Needs to be kept in sync with the writer in | |
115 // third_party/crashpad/crashpad/handler/handler_main.cc. | |
116 const char kCrashpadHistogramAllocatorName[] = "CrashpadMetrics"; | |
117 | |
113 // Checks whether it is the first time that cellular uploads logic should be | 118 // Checks whether it is the first time that cellular uploads logic should be |
114 // enabled based on whether the the preference for that logic is initialized. | 119 // enabled based on whether the the preference for that logic is initialized. |
115 // This should happen only once as the used preference will be initialized | 120 // This should happen only once as the used preference will be initialized |
116 // afterwards in |UmaSessionStats.java|. | 121 // afterwards in |UmaSessionStats.java|. |
117 bool ShouldClearSavedMetrics() { | 122 bool ShouldClearSavedMetrics() { |
118 #if BUILDFLAG(ANDROID_JAVA_UI) | 123 #if BUILDFLAG(ANDROID_JAVA_UI) |
119 PrefService* local_state = g_browser_process->local_state(); | 124 PrefService* local_state = g_browser_process->local_state(); |
120 return !local_state->HasPrefPath(metrics::prefs::kMetricsReportingEnabled) && | 125 return !local_state->HasPrefPath(metrics::prefs::kMetricsReportingEnabled) && |
121 metrics::IsCellularLogicEnabled(); | 126 metrics::IsCellularLogicEnabled(); |
122 #else | 127 #else |
123 return false; | 128 return false; |
124 #endif | 129 #endif |
125 } | 130 } |
126 | 131 |
127 void RegisterInstallerFileMetricsPreferences(PrefRegistrySimple* registry) { | 132 void RegisterFileMetricsPreferences(PrefRegistrySimple* registry) { |
128 metrics::FileMetricsProvider::RegisterPrefs( | 133 metrics::FileMetricsProvider::RegisterPrefs( |
129 registry, ChromeMetricsServiceClient::kBrowserMetricsName); | 134 registry, ChromeMetricsServiceClient::kBrowserMetricsName); |
130 | 135 |
136 metrics::FileMetricsProvider::RegisterPrefs(registry, | |
137 kCrashpadHistogramAllocatorName); | |
138 | |
131 #if defined(OS_WIN) | 139 #if defined(OS_WIN) |
132 metrics::FileMetricsProvider::RegisterPrefs( | 140 metrics::FileMetricsProvider::RegisterPrefs( |
133 registry, installer::kSetupHistogramAllocatorName); | 141 registry, installer::kSetupHistogramAllocatorName); |
134 #endif | 142 #endif |
135 } | 143 } |
136 | 144 |
137 std::unique_ptr<metrics::FileMetricsProvider> | 145 void RegisterOrRemovePreviousRunMetricsFile( |
Alexei Svitkine (slow)
2016/09/15 17:49:16
Nit: Add a comment introducing this.
scottmg
2016/09/15 18:31:24
Done.
| |
138 CreateInstallerFileMetricsProvider(bool metrics_reporting_enabled) { | 146 bool metrics_reporting_enabled, |
147 const base::FilePath& dir, | |
148 base::StringPiece metrics_name, | |
149 scoped_refptr<base::TaskRunner> task_runner, | |
150 metrics::FileMetricsProvider* file_metrics_provider) { | |
151 base::FilePath metrics_file; | |
152 base::GlobalHistogramAllocator::ConstructFilePaths(dir, metrics_name, | |
153 &metrics_file, nullptr); | |
154 | |
155 if (metrics_reporting_enabled) { | |
156 // Enable reading any existing saved metrics. | |
157 file_metrics_provider->RegisterSource( | |
158 metrics_file, | |
159 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, | |
160 metrics::FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN, metrics_name); | |
161 } else { | |
162 // When metrics reporting is not enabled, any existing file should be | |
163 // deleted in order to preserve user privacy. | |
164 task_runner->PostTask(FROM_HERE, | |
165 base::Bind(base::IgnoreResult(&base::DeleteFile), | |
166 metrics_file, /*recursive=*/false)); | |
167 } | |
168 } | |
169 | |
170 std::unique_ptr<metrics::FileMetricsProvider> CreateFileMetricsProvider( | |
171 bool metrics_reporting_enabled) { | |
139 // Fetch a worker-pool for performing I/O tasks that are not allowed on | 172 // Fetch a worker-pool for performing I/O tasks that are not allowed on |
140 // the main UI thread. | 173 // the main UI thread. |
141 scoped_refptr<base::TaskRunner> task_runner = | 174 scoped_refptr<base::TaskRunner> task_runner = |
142 content::BrowserThread::GetBlockingPool() | 175 content::BrowserThread::GetBlockingPool() |
143 ->GetTaskRunnerWithShutdownBehavior( | 176 ->GetTaskRunnerWithShutdownBehavior( |
144 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); | 177 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
145 | 178 |
146 // Create an object to monitor files of metrics and include them in reports. | 179 // Create an object to monitor files of metrics and include them in reports. |
147 std::unique_ptr<metrics::FileMetricsProvider> file_metrics_provider( | 180 std::unique_ptr<metrics::FileMetricsProvider> file_metrics_provider( |
148 new metrics::FileMetricsProvider(task_runner, | 181 new metrics::FileMetricsProvider(task_runner, |
149 g_browser_process->local_state())); | 182 g_browser_process->local_state())); |
150 | 183 |
151 // Create the full pathname of the file holding browser metrics. | 184 // Register the file holding browser metrics. |
152 base::FilePath metrics_file; | 185 base::FilePath user_data_dir; |
153 if (base::PathService::Get(chrome::DIR_USER_DATA, &metrics_file)) { | 186 if (base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) { |
154 metrics_file = | 187 RegisterOrRemovePreviousRunMetricsFile( |
155 metrics_file | 188 metrics_reporting_enabled, user_data_dir, |
156 .AppendASCII(ChromeMetricsServiceClient::kBrowserMetricsName) | 189 ChromeMetricsServiceClient::kBrowserMetricsName, task_runner, |
157 .AddExtension(base::PersistentMemoryAllocator::kFileExtension); | 190 file_metrics_provider.get()); |
191 } | |
158 | 192 |
193 // Read the Crashpad metrics files. | |
194 base::FilePath default_user_data_dir; | |
195 if (chrome::GetDefaultUserDataDirectory(&default_user_data_dir)) { | |
196 // Register the data from the previous run if crashpad_handler didn't exit | |
197 // cleanly. | |
198 RegisterOrRemovePreviousRunMetricsFile( | |
199 metrics_reporting_enabled, default_user_data_dir, | |
200 kCrashpadHistogramAllocatorName, task_runner, | |
201 file_metrics_provider.get()); | |
159 if (metrics_reporting_enabled) { | 202 if (metrics_reporting_enabled) { |
160 // Enable reading any existing saved metrics. | 203 base::FilePath active_path; |
204 base::GlobalHistogramAllocator::ConstructFilePaths( | |
205 default_user_data_dir, kCrashpadHistogramAllocatorName, nullptr, | |
206 &active_path); | |
207 // Register data that will be populated for the current run. | |
161 file_metrics_provider->RegisterSource( | 208 file_metrics_provider->RegisterSource( |
162 metrics_file, | 209 active_path, |
163 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, | 210 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, |
164 metrics::FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN, | 211 metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, |
165 ChromeMetricsServiceClient::kBrowserMetricsName); | 212 kCrashpadHistogramAllocatorName); |
166 } else { | |
167 // When metrics reporting is not enabled, any existing file should be | |
168 // deleted in order to preserve user privacy. | |
169 task_runner->PostTask(FROM_HERE, | |
170 base::Bind(base::IgnoreResult(&base::DeleteFile), | |
171 metrics_file, /*recursive=*/false)); | |
172 } | 213 } |
173 } | 214 } |
174 | 215 |
175 #if defined(OS_WIN) | 216 #if defined(OS_WIN) |
176 // Read metrics file from setup.exe. | 217 // Read metrics file from setup.exe. |
177 base::FilePath program_dir; | 218 base::FilePath program_dir; |
178 base::PathService::Get(base::DIR_EXE, &program_dir); | 219 base::PathService::Get(base::DIR_EXE, &program_dir); |
179 file_metrics_provider->RegisterSource( | 220 file_metrics_provider->RegisterSource( |
180 program_dir.AppendASCII(installer::kSetupHistogramAllocatorName), | 221 program_dir.AppendASCII(installer::kSetupHistogramAllocatorName), |
181 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR, | 222 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR, |
182 metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, | 223 metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, |
183 installer::kSetupHistogramAllocatorName); | 224 installer::kSetupHistogramAllocatorName); |
184 #endif | 225 #endif |
185 | 226 |
186 return file_metrics_provider; | 227 return file_metrics_provider; |
187 } | 228 } |
188 | 229 |
189 // If there is a global metrics file being updated on disk, mark it to be | |
190 // deleted when the process exits. A normal shutdown is almost complete | |
191 // so there is no benefit in keeping a file with no new data to be processed | |
192 // during the next startup sequence. Deleting the file during shutdown adds | |
193 // an extra disk-access or two to shutdown but eliminates the unnecessary | |
194 // processing of the contents during startup only to find nothing. | |
195 void CleanUpGlobalPersistentHistogramStorage() { | |
196 base::GlobalHistogramAllocator* allocator = | |
197 base::GlobalHistogramAllocator::Get(); | |
198 if (!allocator) | |
199 return; | |
200 | |
201 const base::FilePath& path = allocator->GetPersistentLocation(); | |
202 if (path.empty()) | |
203 return; | |
204 | |
205 // Open (with delete) and then immediately close the file by going out of | |
206 // scope. This is the only cross-platform safe way to delete a file that may | |
207 // be open elsewhere. Open handles will continue to operate normally but | |
208 // new opens will not be possible. | |
209 base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ | | |
210 base::File::FLAG_DELETE_ON_CLOSE); | |
211 } | |
212 | |
213 } // namespace | 230 } // namespace |
214 | 231 |
215 | 232 |
216 const char ChromeMetricsServiceClient::kBrowserMetricsName[] = "BrowserMetrics"; | 233 const char ChromeMetricsServiceClient::kBrowserMetricsName[] = "BrowserMetrics"; |
217 | 234 |
218 ChromeMetricsServiceClient::ChromeMetricsServiceClient( | 235 ChromeMetricsServiceClient::ChromeMetricsServiceClient( |
219 metrics::MetricsStateManager* state_manager) | 236 metrics::MetricsStateManager* state_manager) |
220 : metrics_state_manager_(state_manager), | 237 : metrics_state_manager_(state_manager), |
221 #if defined(OS_CHROMEOS) | 238 #if defined(OS_CHROMEOS) |
222 chromeos_metrics_provider_(nullptr), | 239 chromeos_metrics_provider_(nullptr), |
(...skipping 11 matching lines...) Expand all Loading... | |
234 start_time_(base::TimeTicks::Now()), | 251 start_time_(base::TimeTicks::Now()), |
235 has_uploaded_profiler_data_(false), | 252 has_uploaded_profiler_data_(false), |
236 weak_ptr_factory_(this) { | 253 weak_ptr_factory_(this) { |
237 DCHECK(thread_checker_.CalledOnValidThread()); | 254 DCHECK(thread_checker_.CalledOnValidThread()); |
238 RecordCommandLineMetrics(); | 255 RecordCommandLineMetrics(); |
239 RegisterForNotifications(); | 256 RegisterForNotifications(); |
240 } | 257 } |
241 | 258 |
242 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { | 259 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { |
243 DCHECK(thread_checker_.CalledOnValidThread()); | 260 DCHECK(thread_checker_.CalledOnValidThread()); |
244 CleanUpGlobalPersistentHistogramStorage(); | 261 base::GlobalHistogramAllocator* allocator = |
262 base::GlobalHistogramAllocator::Get(); | |
263 if (allocator) { | |
264 // A normal shutdown is almost complete so there is no benefit in keeping a | |
265 // file with no new data to be processed during the next startup sequence. | |
266 // Deleting the file during shutdown adds an extra disk-access or two to | |
267 // shutdown but eliminates the unnecessary processing of the contents during | |
268 // startup only to find nothing. | |
269 allocator->DeletePersistentLocation(); | |
270 } | |
245 } | 271 } |
246 | 272 |
247 // static | 273 // static |
248 std::unique_ptr<ChromeMetricsServiceClient> ChromeMetricsServiceClient::Create( | 274 std::unique_ptr<ChromeMetricsServiceClient> ChromeMetricsServiceClient::Create( |
249 metrics::MetricsStateManager* state_manager) { | 275 metrics::MetricsStateManager* state_manager) { |
250 // Perform two-phase initialization so that |client->metrics_service_| only | 276 // Perform two-phase initialization so that |client->metrics_service_| only |
251 // receives pointers to fully constructed objects. | 277 // receives pointers to fully constructed objects. |
252 std::unique_ptr<ChromeMetricsServiceClient> client( | 278 std::unique_ptr<ChromeMetricsServiceClient> client( |
253 new ChromeMetricsServiceClient(state_manager)); | 279 new ChromeMetricsServiceClient(state_manager)); |
254 client->Initialize(); | 280 client->Initialize(); |
255 | 281 |
256 return client; | 282 return client; |
257 } | 283 } |
258 | 284 |
259 // static | 285 // static |
260 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { | 286 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { |
261 metrics::MetricsService::RegisterPrefs(registry); | 287 metrics::MetricsService::RegisterPrefs(registry); |
262 metrics::StabilityMetricsHelper::RegisterPrefs(registry); | 288 metrics::StabilityMetricsHelper::RegisterPrefs(registry); |
263 | 289 |
264 RegisterInstallerFileMetricsPreferences(registry); | 290 RegisterFileMetricsPreferences(registry); |
265 | 291 |
266 metrics::RegisterMetricsReportingStatePrefs(registry); | 292 metrics::RegisterMetricsReportingStatePrefs(registry); |
267 | 293 |
268 #if BUILDFLAG(ANDROID_JAVA_UI) | 294 #if BUILDFLAG(ANDROID_JAVA_UI) |
269 AndroidMetricsProvider::RegisterPrefs(registry); | 295 AndroidMetricsProvider::RegisterPrefs(registry); |
270 #endif // BUILDFLAG(ANDROID_JAVA_UI) | 296 #endif // BUILDFLAG(ANDROID_JAVA_UI) |
271 | 297 |
272 #if defined(ENABLE_PLUGINS) | 298 #if defined(ENABLE_PLUGINS) |
273 PluginMetricsProvider::RegisterPrefs(registry); | 299 PluginMetricsProvider::RegisterPrefs(registry); |
274 #endif // defined(ENABLE_PLUGINS) | 300 #endif // defined(ENABLE_PLUGINS) |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
425 std::unique_ptr<metrics::MetricsProvider>( | 451 std::unique_ptr<metrics::MetricsProvider>( |
426 new ChromeStabilityMetricsProvider( | 452 new ChromeStabilityMetricsProvider( |
427 g_browser_process->local_state()))); | 453 g_browser_process->local_state()))); |
428 metrics_service_->RegisterMetricsProvider( | 454 metrics_service_->RegisterMetricsProvider( |
429 std::unique_ptr<metrics::MetricsProvider>( | 455 std::unique_ptr<metrics::MetricsProvider>( |
430 new metrics::GPUMetricsProvider)); | 456 new metrics::GPUMetricsProvider)); |
431 metrics_service_->RegisterMetricsProvider( | 457 metrics_service_->RegisterMetricsProvider( |
432 std::unique_ptr<metrics::MetricsProvider>( | 458 std::unique_ptr<metrics::MetricsProvider>( |
433 new metrics::ScreenInfoMetricsProvider)); | 459 new metrics::ScreenInfoMetricsProvider)); |
434 | 460 |
435 metrics_service_->RegisterMetricsProvider(CreateInstallerFileMetricsProvider( | 461 metrics_service_->RegisterMetricsProvider(CreateFileMetricsProvider( |
436 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled())); | 462 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled())); |
437 | 463 |
438 drive_metrics_provider_ = new metrics::DriveMetricsProvider( | 464 drive_metrics_provider_ = new metrics::DriveMetricsProvider( |
439 content::BrowserThread::GetTaskRunnerForThread( | 465 content::BrowserThread::GetTaskRunnerForThread( |
440 content::BrowserThread::FILE), | 466 content::BrowserThread::FILE), |
441 chrome::FILE_LOCAL_STATE); | 467 chrome::FILE_LOCAL_STATE); |
442 metrics_service_->RegisterMetricsProvider( | 468 metrics_service_->RegisterMetricsProvider( |
443 std::unique_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); | 469 std::unique_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); |
444 | 470 |
445 profiler_metrics_provider_ = new metrics::ProfilerMetricsProvider( | 471 profiler_metrics_provider_ = new metrics::ProfilerMetricsProvider( |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
785 } | 811 } |
786 } | 812 } |
787 | 813 |
788 void ChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { | 814 void ChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { |
789 metrics_service_->OnApplicationNotIdle(); | 815 metrics_service_->OnApplicationNotIdle(); |
790 } | 816 } |
791 | 817 |
792 bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { | 818 bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { |
793 return metrics::IsCellularLogicEnabled(); | 819 return metrics::IsCellularLogicEnabled(); |
794 } | 820 } |
OLD | NEW |