Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Side by Side Diff: chrome/browser/metrics/metrics_service.cc

Issue 293393010: Move initial metrics gathering tasks out of MetricsService. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 #include "chrome/browser/browser_process.h" 184 #include "chrome/browser/browser_process.h"
185 #include "chrome/browser/chrome_notification_types.h" 185 #include "chrome/browser/chrome_notification_types.h"
186 #include "chrome/browser/io_thread.h" 186 #include "chrome/browser/io_thread.h"
187 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" 187 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h"
188 #include "chrome/browser/metrics/compression_utils.h" 188 #include "chrome/browser/metrics/compression_utils.h"
189 #include "chrome/browser/metrics/gpu_metrics_provider.h" 189 #include "chrome/browser/metrics/gpu_metrics_provider.h"
190 #include "chrome/browser/metrics/metrics_log.h" 190 #include "chrome/browser/metrics/metrics_log.h"
191 #include "chrome/browser/metrics/metrics_state_manager.h" 191 #include "chrome/browser/metrics/metrics_state_manager.h"
192 #include "chrome/browser/metrics/network_metrics_provider.h" 192 #include "chrome/browser/metrics/network_metrics_provider.h"
193 #include "chrome/browser/metrics/omnibox_metrics_provider.h" 193 #include "chrome/browser/metrics/omnibox_metrics_provider.h"
194 #include "chrome/browser/metrics/tracking_synchronizer.h"
195 #include "chrome/common/pref_names.h" 194 #include "chrome/common/pref_names.h"
196 #include "chrome/common/variations/variations_util.h" 195 #include "chrome/common/variations/variations_util.h"
197 #include "components/metrics/metrics_log_base.h" 196 #include "components/metrics/metrics_log_base.h"
198 #include "components/metrics/metrics_log_manager.h" 197 #include "components/metrics/metrics_log_manager.h"
199 #include "components/metrics/metrics_pref_names.h" 198 #include "components/metrics/metrics_pref_names.h"
200 #include "components/metrics/metrics_reporting_scheduler.h" 199 #include "components/metrics/metrics_reporting_scheduler.h"
201 #include "components/metrics/metrics_service_client.h" 200 #include "components/metrics/metrics_service_client.h"
202 #include "components/variations/entropy_provider.h" 201 #include "components/variations/entropy_provider.h"
203 #include "net/base/load_flags.h" 202 #include "net/base/load_flags.h"
204 #include "net/url_request/url_fetcher.h" 203 #include "net/url_request/url_fetcher.h"
205 204
206 #if defined(ENABLE_PLUGINS)
207 // TODO(asvitkine): Move this out of MetricsService.
208 #include "chrome/browser/metrics/plugin_metrics_provider.h"
209 #endif
210
211 #if defined(OS_WIN)
212 #include "chrome/browser/metrics/google_update_metrics_provider_win.h"
213 #endif
214
215 #if defined(OS_ANDROID)
216 // TODO(asvitkine): Move this out of MetricsService.
217 #include "chrome/browser/metrics/android_metrics_provider.h"
218 #endif
219
220 using base::Time; 205 using base::Time;
221 using metrics::MetricsLogManager; 206 using metrics::MetricsLogManager;
222 207
223 namespace { 208 namespace {
224 209
225 // Check to see that we're being called on only one thread. 210 // Check to see that we're being called on only one thread.
226 bool IsSingleThreaded() { 211 bool IsSingleThreaded() {
227 static base::PlatformThreadId thread_id = 0; 212 static base::PlatformThreadId thread_id = 0;
228 if (!thread_id) 213 if (!thread_id)
229 thread_id = base::PlatformThread::CurrentId(); 214 thread_id = base::PlatformThread::CurrentId();
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 std::string()); 309 std::string());
325 310
326 registry->RegisterListPref(metrics::prefs::kMetricsInitialLogs); 311 registry->RegisterListPref(metrics::prefs::kMetricsInitialLogs);
327 registry->RegisterListPref(metrics::prefs::kMetricsOngoingLogs); 312 registry->RegisterListPref(metrics::prefs::kMetricsOngoingLogs);
328 313
329 registry->RegisterInt64Pref(prefs::kInstallDate, 0); 314 registry->RegisterInt64Pref(prefs::kInstallDate, 0);
330 registry->RegisterInt64Pref(prefs::kUninstallLaunchCount, 0); 315 registry->RegisterInt64Pref(prefs::kUninstallLaunchCount, 0);
331 registry->RegisterInt64Pref(prefs::kUninstallMetricsUptimeSec, 0); 316 registry->RegisterInt64Pref(prefs::kUninstallMetricsUptimeSec, 0);
332 registry->RegisterInt64Pref(prefs::kUninstallLastLaunchTimeSec, 0); 317 registry->RegisterInt64Pref(prefs::kUninstallLastLaunchTimeSec, 0);
333 registry->RegisterInt64Pref(prefs::kUninstallLastObservedRunTimeSec, 0); 318 registry->RegisterInt64Pref(prefs::kUninstallLastObservedRunTimeSec, 0);
334
335 // TODO(asvitkine): Move this out of here.
336 ChromeStabilityMetricsProvider::RegisterPrefs(registry);
337
338 #if defined(OS_ANDROID)
339 // TODO(asvitkine): Move this out of here.
340 AndroidMetricsProvider::RegisterPrefs(registry);
341 #endif // defined(OS_ANDROID)
342
343 #if defined(ENABLE_PLUGINS)
344 // TODO(asvitkine): Move this out of here.
345 PluginMetricsProvider::RegisterPrefs(registry);
346 #endif
347 } 319 }
348 320
349 MetricsService::MetricsService(metrics::MetricsStateManager* state_manager, 321 MetricsService::MetricsService(metrics::MetricsStateManager* state_manager,
350 metrics::MetricsServiceClient* client, 322 metrics::MetricsServiceClient* client,
351 PrefService* local_state) 323 PrefService* local_state)
352 : log_manager_(local_state, kUploadLogAvoidRetransmitSize), 324 : log_manager_(local_state, kUploadLogAvoidRetransmitSize),
353 histogram_snapshot_manager_(this), 325 histogram_snapshot_manager_(this),
354 state_manager_(state_manager), 326 state_manager_(state_manager),
355 client_(client), 327 client_(client),
356 local_state_(local_state), 328 local_state_(local_state),
357 recording_active_(false), 329 recording_active_(false),
358 reporting_active_(false), 330 reporting_active_(false),
359 test_mode_active_(false), 331 test_mode_active_(false),
360 state_(INITIALIZED), 332 state_(INITIALIZED),
361 has_initial_stability_log_(false), 333 has_initial_stability_log_(false),
362 idle_since_last_transmission_(false), 334 idle_since_last_transmission_(false),
363 session_id_(-1), 335 session_id_(-1),
364 next_window_id_(0), 336 next_window_id_(0),
365 self_ptr_factory_(this), 337 self_ptr_factory_(this),
366 state_saver_factory_(this), 338 state_saver_factory_(this),
367 waiting_for_asynchronous_reporting_step_(false) { 339 waiting_for_asynchronous_reporting_step_(false) {
368 DCHECK(IsSingleThreaded()); 340 DCHECK(IsSingleThreaded());
369 DCHECK(state_manager_); 341 DCHECK(state_manager_);
370 DCHECK(client_); 342 DCHECK(client_);
371 DCHECK(local_state_); 343 DCHECK(local_state_);
372
373 #if defined(OS_ANDROID)
374 // TODO(asvitkine): Move this out of MetricsService.
375 RegisterMetricsProvider(
376 scoped_ptr<metrics::MetricsProvider>(new AndroidMetricsProvider(
377 local_state_)));
378 #endif // defined(OS_ANDROID)
379
380 // TODO(asvitkine): Move these out of MetricsService.
381 RegisterMetricsProvider(
382 scoped_ptr<metrics::MetricsProvider>(new NetworkMetricsProvider));
383 RegisterMetricsProvider(
384 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider));
385 RegisterMetricsProvider(
386 scoped_ptr<metrics::MetricsProvider>(new ChromeStabilityMetricsProvider));
387 RegisterMetricsProvider(
388 scoped_ptr<metrics::MetricsProvider>(new GPUMetricsProvider()));
389
390 #if defined(OS_WIN)
391 google_update_metrics_provider_ = new GoogleUpdateMetricsProviderWin;
392 RegisterMetricsProvider(scoped_ptr<metrics::MetricsProvider>(
393 google_update_metrics_provider_));
394 #endif
395
396 #if defined(ENABLE_PLUGINS)
397 plugin_metrics_provider_ = new PluginMetricsProvider(local_state_);
398 RegisterMetricsProvider(scoped_ptr<metrics::MetricsProvider>(
399 plugin_metrics_provider_));
400 #endif
401
402 } 344 }
403 345
404 MetricsService::~MetricsService() { 346 MetricsService::~MetricsService() {
405 DisableRecording(); 347 DisableRecording();
406 } 348 }
407 349
408 void MetricsService::InitializeMetricsRecordingState() { 350 void MetricsService::InitializeMetricsRecordingState() {
409 InitializeMetricsState(); 351 InitializeMetricsState();
410 352
411 base::Closure callback = base::Bind(&MetricsService::StartScheduledUpload, 353 base::Closure callback = base::Bind(&MetricsService::StartScheduledUpload,
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 local_state_->SetInt64(prefs::kStabilityLaunchTimeSec, Time::Now().ToTimeT()); 611 local_state_->SetInt64(prefs::kStabilityLaunchTimeSec, Time::Now().ToTimeT());
670 612
671 // Bookkeeping for the uninstall metrics. 613 // Bookkeeping for the uninstall metrics.
672 IncrementLongPrefsValue(prefs::kUninstallLaunchCount); 614 IncrementLongPrefsValue(prefs::kUninstallLaunchCount);
673 615
674 // Kick off the process of saving the state (so the uptime numbers keep 616 // Kick off the process of saving the state (so the uptime numbers keep
675 // getting updated) every n minutes. 617 // getting updated) every n minutes.
676 ScheduleNextStateSave(); 618 ScheduleNextStateSave();
677 } 619 }
678 620
679 void MetricsService::OnInitTaskGotHardwareClass() {
680 DCHECK_EQ(INIT_TASK_SCHEDULED, state_);
681
682 const base::Closure got_plugin_info_callback =
683 base::Bind(&MetricsService::OnInitTaskGotPluginInfo,
684 self_ptr_factory_.GetWeakPtr());
685
686 #if defined(ENABLE_PLUGINS)
687 plugin_metrics_provider_->GetPluginInformation(got_plugin_info_callback);
688 #else
689 got_plugin_info_callback.Run();
690 #endif
691 }
692
693 void MetricsService::OnInitTaskGotPluginInfo() {
694 DCHECK_EQ(INIT_TASK_SCHEDULED, state_);
695
696 const base::Closure got_metrics_callback =
697 base::Bind(&MetricsService::OnInitTaskGotGoogleUpdateData,
698 self_ptr_factory_.GetWeakPtr());
699
700 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
701 google_update_metrics_provider_->GetGoogleUpdateData(got_metrics_callback);
702 #else
703 got_metrics_callback.Run();
704 #endif
705 }
706
707 void MetricsService::OnInitTaskGotGoogleUpdateData() {
708 DCHECK_EQ(INIT_TASK_SCHEDULED, state_);
709
710 // Start the next part of the init task: fetching performance data. This will
711 // call into |FinishedReceivingProfilerData()| when the task completes.
712 chrome_browser_metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously(
713 self_ptr_factory_.GetWeakPtr());
714 }
715
716 void MetricsService::OnUserAction(const std::string& action) { 621 void MetricsService::OnUserAction(const std::string& action) {
717 if (!ShouldLogEvents()) 622 if (!ShouldLogEvents())
718 return; 623 return;
719 624
720 log_manager_.current_log()->RecordUserAction(action); 625 log_manager_.current_log()->RecordUserAction(action);
721 HandleIdleSinceLastTransmission(false); 626 HandleIdleSinceLastTransmission(false);
722 } 627 }
723 628
724 void MetricsService::ReceivedProfilerData( 629 void MetricsService::ReceivedProfilerData(
725 const tracked_objects::ProcessDataSnapshot& process_data, 630 const tracked_objects::ProcessDataSnapshot& process_data,
726 int process_type) { 631 int process_type) {
727 DCHECK_EQ(INIT_TASK_SCHEDULED, state_); 632 DCHECK_EQ(INIT_TASK_SCHEDULED, state_);
728 633
729 // Upon the first callback, create the initial log so that we can immediately 634 // Upon the first callback, create the initial log so that we can immediately
730 // save the profiler data. 635 // save the profiler data.
731 if (!initial_metrics_log_.get()) { 636 if (!initial_metrics_log_.get()) {
732 initial_metrics_log_ = CreateLog(MetricsLog::ONGOING_LOG); 637 initial_metrics_log_ = CreateLog(MetricsLog::ONGOING_LOG);
733 NotifyOnDidCreateMetricsLog(); 638 NotifyOnDidCreateMetricsLog();
734 } 639 }
735 640
736 initial_metrics_log_->RecordProfilerData(process_data, process_type); 641 initial_metrics_log_->RecordProfilerData(process_data, process_type);
737 } 642 }
738 643
739 void MetricsService::FinishedReceivingProfilerData() { 644 void MetricsService::FinishedGatheringInitialMetrics() {
740 DCHECK_EQ(INIT_TASK_SCHEDULED, state_); 645 DCHECK_EQ(INIT_TASK_SCHEDULED, state_);
741 state_ = INIT_TASK_DONE; 646 state_ = INIT_TASK_DONE;
742 scheduler_->InitTaskComplete(); 647 scheduler_->InitTaskComplete();
743 } 648 }
744 649
745 void MetricsService::GetUptimes(PrefService* pref, 650 void MetricsService::GetUptimes(PrefService* pref,
746 base::TimeDelta* incremental_uptime, 651 base::TimeDelta* incremental_uptime,
747 base::TimeDelta* uptime) { 652 base::TimeDelta* uptime) {
748 base::TimeTicks now = base::TimeTicks::Now(); 653 base::TimeTicks now = base::TimeTicks::Now();
749 // If this is the first call, init |first_updated_time_| and 654 // If this is the first call, init |first_updated_time_| and
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 void MetricsService::OpenNewLog() { 713 void MetricsService::OpenNewLog() {
809 DCHECK(!log_manager_.current_log()); 714 DCHECK(!log_manager_.current_log());
810 715
811 log_manager_.BeginLoggingWithLog( 716 log_manager_.BeginLoggingWithLog(
812 CreateLog(MetricsLog::ONGOING_LOG).PassAs<metrics::MetricsLogBase>()); 717 CreateLog(MetricsLog::ONGOING_LOG).PassAs<metrics::MetricsLogBase>());
813 NotifyOnDidCreateMetricsLog(); 718 NotifyOnDidCreateMetricsLog();
814 if (state_ == INITIALIZED) { 719 if (state_ == INITIALIZED) {
815 // We only need to schedule that run once. 720 // We only need to schedule that run once.
816 state_ = INIT_TASK_SCHEDULED; 721 state_ = INIT_TASK_SCHEDULED;
817 722
818 // TODO(blundell): Move all initial metrics gathering to
819 // ChromeMetricsServiceClient.
820 client_->StartGatheringMetrics( 723 client_->StartGatheringMetrics(
821 base::Bind(&MetricsService::OnInitTaskGotHardwareClass, 724 base::Bind(&MetricsService::FinishedGatheringInitialMetrics,
822 self_ptr_factory_.GetWeakPtr())); 725 self_ptr_factory_.GetWeakPtr()));
823 } 726 }
824 } 727 }
825 728
826 void MetricsService::CloseCurrentLog() { 729 void MetricsService::CloseCurrentLog() {
827 if (!log_manager_.current_log()) 730 if (!log_manager_.current_log())
828 return; 731 return;
829 732
830 // TODO(jar): Integrate bounds on log recording more consistently, so that we 733 // TODO(jar): Integrate bounds on log recording more consistently, so that we
831 // can stop recording logs that are too big much sooner. 734 // can stop recording logs that are too big much sooner.
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 1230
1328 // Redundant setting to assure that we always reset this value at shutdown 1231 // Redundant setting to assure that we always reset this value at shutdown
1329 // (and that we don't use some alternate path, and not call LogCleanShutdown). 1232 // (and that we don't use some alternate path, and not call LogCleanShutdown).
1330 clean_shutdown_status_ = CLEANLY_SHUTDOWN; 1233 clean_shutdown_status_ = CLEANLY_SHUTDOWN;
1331 1234
1332 RecordBooleanPrefValue(prefs::kStabilityExitedCleanly, true); 1235 RecordBooleanPrefValue(prefs::kStabilityExitedCleanly, true);
1333 local_state_->SetInteger(prefs::kStabilityExecutionPhase, 1236 local_state_->SetInteger(prefs::kStabilityExecutionPhase,
1334 MetricsService::SHUTDOWN_COMPLETE); 1237 MetricsService::SHUTDOWN_COMPLETE);
1335 } 1238 }
1336 1239
1337 void MetricsService::LogPluginLoadingError(const base::FilePath& plugin_path) {
1338 #if defined(ENABLE_PLUGINS)
1339 // TODO(asvitkine): Move this out of here.
1340 plugin_metrics_provider_->LogPluginLoadingError(plugin_path);
1341 #endif
1342 }
1343
1344 bool MetricsService::ShouldLogEvents() { 1240 bool MetricsService::ShouldLogEvents() {
1345 // We simply don't log events to UMA if there is a single incognito 1241 // We simply don't log events to UMA if there is a single incognito
1346 // session visible. The problem is that we always notify using the orginal 1242 // session visible. The problem is that we always notify using the orginal
1347 // profile in order to simplify notification processing. 1243 // profile in order to simplify notification processing.
1348 return !client_->IsOffTheRecordSessionActive(); 1244 return !client_->IsOffTheRecordSessionActive();
1349 } 1245 }
1350 1246
1351 void MetricsService::RecordBooleanPrefValue(const char* path, bool value) { 1247 void MetricsService::RecordBooleanPrefValue(const char* path, bool value) {
1352 DCHECK(IsSingleThreaded()); 1248 DCHECK(IsSingleThreaded());
1353 local_state_->SetBoolean(path, value); 1249 local_state_->SetBoolean(path, value);
1354 RecordCurrentState(local_state_); 1250 RecordCurrentState(local_state_);
1355 } 1251 }
1356 1252
1357 void MetricsService::RecordCurrentState(PrefService* pref) { 1253 void MetricsService::RecordCurrentState(PrefService* pref) {
1358 pref->SetInt64(prefs::kStabilityLastTimestampSec, Time::Now().ToTimeT()); 1254 pref->SetInt64(prefs::kStabilityLastTimestampSec, Time::Now().ToTimeT());
1359 1255
1360 #if defined(ENABLE_PLUGINS) 1256 for (size_t i = 0; i < metrics_providers_.size(); ++i)
1361 plugin_metrics_provider_->RecordPluginChanges(); 1257 metrics_providers_[i]->RecordCurrentState();
1362 #endif
1363 } 1258 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698