| 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 <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 #endif | 309 #endif |
| 310 #if defined(OS_WIN) | 310 #if defined(OS_WIN) |
| 311 google_update_metrics_provider_(nullptr), | 311 google_update_metrics_provider_(nullptr), |
| 312 watcher_metrics_provider_(nullptr), | 312 watcher_metrics_provider_(nullptr), |
| 313 antivirus_metrics_provider_(nullptr), | 313 antivirus_metrics_provider_(nullptr), |
| 314 #endif | 314 #endif |
| 315 drive_metrics_provider_(nullptr), | 315 drive_metrics_provider_(nullptr), |
| 316 start_time_(base::TimeTicks::Now()), | 316 start_time_(base::TimeTicks::Now()), |
| 317 has_uploaded_profiler_data_(false), | 317 has_uploaded_profiler_data_(false), |
| 318 weak_ptr_factory_(this) { | 318 weak_ptr_factory_(this) { |
| 319 DCHECK(thread_checker_.CalledOnValidThread()); | 319 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 320 RecordCommandLineMetrics(); | 320 RecordCommandLineMetrics(); |
| 321 RegisterForNotifications(); | 321 RegisterForNotifications(); |
| 322 } | 322 } |
| 323 | 323 |
| 324 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { | 324 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { |
| 325 DCHECK(thread_checker_.CalledOnValidThread()); | 325 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 326 base::GlobalHistogramAllocator* allocator = | 326 base::GlobalHistogramAllocator* allocator = |
| 327 base::GlobalHistogramAllocator::Get(); | 327 base::GlobalHistogramAllocator::Get(); |
| 328 if (allocator) { | 328 if (allocator) { |
| 329 // A normal shutdown is almost complete so there is no benefit in keeping a | 329 // A normal shutdown is almost complete so there is no benefit in keeping a |
| 330 // file with no new data to be processed during the next startup sequence. | 330 // file with no new data to be processed during the next startup sequence. |
| 331 // Deleting the file during shutdown adds an extra disk-access or two to | 331 // Deleting the file during shutdown adds an extra disk-access or two to |
| 332 // shutdown but eliminates the unnecessary processing of the contents during | 332 // shutdown but eliminates the unnecessary processing of the contents during |
| 333 // startup only to find nothing. | 333 // startup only to find nothing. |
| 334 allocator->DeletePersistentLocation(); | 334 allocator->DeletePersistentLocation(); |
| 335 } | 335 } |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 // |task.Run()| can be asynchronous or synchronous. For the latter case, we | 510 // |task.Run()| can be asynchronous or synchronous. For the latter case, we |
| 511 // may recurse back to this function. Therefore we must pop_front() first. | 511 // may recurse back to this function. Therefore we must pop_front() first. |
| 512 initialize_task_queue_.pop_front(); | 512 initialize_task_queue_.pop_front(); |
| 513 // Assumes this causes |OnInitNextTask()| to be called again for all but the | 513 // Assumes this causes |OnInitNextTask()| to be called again for all but the |
| 514 // last task in |initialize_task_queue_|. | 514 // last task in |initialize_task_queue_|. |
| 515 task.Run(); | 515 task.Run(); |
| 516 } | 516 } |
| 517 | 517 |
| 518 void ChromeMetricsServiceClient::CollectFinalMetricsForLog( | 518 void ChromeMetricsServiceClient::CollectFinalMetricsForLog( |
| 519 const base::Closure& done_callback) { | 519 const base::Closure& done_callback) { |
| 520 DCHECK(thread_checker_.CalledOnValidThread()); | 520 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 521 | 521 |
| 522 collect_final_metrics_done_callback_ = done_callback; | 522 collect_final_metrics_done_callback_ = done_callback; |
| 523 | 523 |
| 524 if (ShouldIncludeProfilerDataInLog()) { | 524 if (ShouldIncludeProfilerDataInLog()) { |
| 525 // Fetch profiler data. This will call into | 525 // Fetch profiler data. This will call into |
| 526 // |FinishedReceivingProfilerData()| when the task completes. | 526 // |FinishedReceivingProfilerData()| when the task completes. |
| 527 metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( | 527 metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( |
| 528 weak_ptr_factory_.GetWeakPtr()); | 528 weak_ptr_factory_.GetWeakPtr()); |
| 529 } else { | 529 } else { |
| 530 CollectFinalHistograms(); | 530 CollectFinalHistograms(); |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 process_data_phase, attributes.process_id, attributes.process_type, | 783 process_data_phase, attributes.process_id, attributes.process_type, |
| 784 attributes.profiling_phase, attributes.phase_start - start_time_, | 784 attributes.profiling_phase, attributes.phase_start - start_time_, |
| 785 attributes.phase_finish - start_time_, past_events); | 785 attributes.phase_finish - start_time_, past_events); |
| 786 } | 786 } |
| 787 | 787 |
| 788 void ChromeMetricsServiceClient::FinishedReceivingProfilerData() { | 788 void ChromeMetricsServiceClient::FinishedReceivingProfilerData() { |
| 789 CollectFinalHistograms(); | 789 CollectFinalHistograms(); |
| 790 } | 790 } |
| 791 | 791 |
| 792 void ChromeMetricsServiceClient::CollectFinalHistograms() { | 792 void ChromeMetricsServiceClient::CollectFinalHistograms() { |
| 793 DCHECK(thread_checker_.CalledOnValidThread()); | 793 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 794 | 794 |
| 795 // Begin the multi-step process of collecting memory usage histograms: | 795 // Begin the multi-step process of collecting memory usage histograms: |
| 796 // First spawn a task to collect the memory details; when that task is | 796 // First spawn a task to collect the memory details; when that task is |
| 797 // finished, it will call OnMemoryDetailCollectionDone. That will in turn | 797 // finished, it will call OnMemoryDetailCollectionDone. That will in turn |
| 798 // call HistogramSynchronization to collect histograms from all renderers and | 798 // call HistogramSynchronization to collect histograms from all renderers and |
| 799 // then call OnHistogramSynchronizationDone to continue processing. | 799 // then call OnHistogramSynchronizationDone to continue processing. |
| 800 DCHECK(!waiting_for_collect_final_metrics_step_); | 800 DCHECK(!waiting_for_collect_final_metrics_step_); |
| 801 waiting_for_collect_final_metrics_step_ = true; | 801 waiting_for_collect_final_metrics_step_ = true; |
| 802 | 802 |
| 803 base::Closure callback = | 803 base::Closure callback = |
| 804 base::Bind(&ChromeMetricsServiceClient::OnMemoryDetailCollectionDone, | 804 base::Bind(&ChromeMetricsServiceClient::OnMemoryDetailCollectionDone, |
| 805 weak_ptr_factory_.GetWeakPtr()); | 805 weak_ptr_factory_.GetWeakPtr()); |
| 806 | 806 |
| 807 scoped_refptr<MetricsMemoryDetails> details( | 807 scoped_refptr<MetricsMemoryDetails> details( |
| 808 new MetricsMemoryDetails(callback, &memory_growth_tracker_)); | 808 new MetricsMemoryDetails(callback, &memory_growth_tracker_)); |
| 809 details->StartFetch(); | 809 details->StartFetch(); |
| 810 | 810 |
| 811 scoped_refptr<ProcessMemoryMetricsEmitter> emitter( | 811 scoped_refptr<ProcessMemoryMetricsEmitter> emitter( |
| 812 new ProcessMemoryMetricsEmitter); | 812 new ProcessMemoryMetricsEmitter); |
| 813 emitter->FetchAndEmitProcessMemoryMetrics(); | 813 emitter->FetchAndEmitProcessMemoryMetrics(); |
| 814 } | 814 } |
| 815 | 815 |
| 816 void ChromeMetricsServiceClient::OnMemoryDetailCollectionDone() { | 816 void ChromeMetricsServiceClient::OnMemoryDetailCollectionDone() { |
| 817 DCHECK(thread_checker_.CalledOnValidThread()); | 817 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 818 | 818 |
| 819 // This function should only be called as the callback from an ansynchronous | 819 // This function should only be called as the callback from an ansynchronous |
| 820 // step. | 820 // step. |
| 821 DCHECK(waiting_for_collect_final_metrics_step_); | 821 DCHECK(waiting_for_collect_final_metrics_step_); |
| 822 | 822 |
| 823 // Create a callback_task for OnHistogramSynchronizationDone. | 823 // Create a callback_task for OnHistogramSynchronizationDone. |
| 824 base::Closure callback = base::Bind( | 824 base::Closure callback = base::Bind( |
| 825 &ChromeMetricsServiceClient::OnHistogramSynchronizationDone, | 825 &ChromeMetricsServiceClient::OnHistogramSynchronizationDone, |
| 826 weak_ptr_factory_.GetWeakPtr()); | 826 weak_ptr_factory_.GetWeakPtr()); |
| 827 | 827 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 852 callback); | 852 callback); |
| 853 | 853 |
| 854 // Set up the callback task to call after we receive histograms from all | 854 // Set up the callback task to call after we receive histograms from all |
| 855 // child processes. |timeout| specifies how long to wait before absolutely | 855 // child processes. |timeout| specifies how long to wait before absolutely |
| 856 // calling us back on the task. | 856 // calling us back on the task. |
| 857 content::FetchHistogramsAsynchronously(base::ThreadTaskRunnerHandle::Get(), | 857 content::FetchHistogramsAsynchronously(base::ThreadTaskRunnerHandle::Get(), |
| 858 callback, timeout); | 858 callback, timeout); |
| 859 } | 859 } |
| 860 | 860 |
| 861 void ChromeMetricsServiceClient::OnHistogramSynchronizationDone() { | 861 void ChromeMetricsServiceClient::OnHistogramSynchronizationDone() { |
| 862 DCHECK(thread_checker_.CalledOnValidThread()); | 862 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 863 | 863 |
| 864 // This function should only be called as the callback from an ansynchronous | 864 // This function should only be called as the callback from an ansynchronous |
| 865 // step. | 865 // step. |
| 866 DCHECK(waiting_for_collect_final_metrics_step_); | 866 DCHECK(waiting_for_collect_final_metrics_step_); |
| 867 DCHECK_GT(num_async_histogram_fetches_in_progress_, 0); | 867 DCHECK_GT(num_async_histogram_fetches_in_progress_, 0); |
| 868 | 868 |
| 869 // Check if all expected requests finished. | 869 // Check if all expected requests finished. |
| 870 if (--num_async_histogram_fetches_in_progress_ > 0) | 870 if (--num_async_histogram_fetches_in_progress_ > 0) |
| 871 return; | 871 return; |
| 872 | 872 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 browser_sync::ProfileSyncService* sync = | 950 browser_sync::ProfileSyncService* sync = |
| 951 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile); | 951 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile); |
| 952 if (sync) | 952 if (sync) |
| 953 ObserveServiceForSyncDisables(static_cast<syncer::SyncService*>(sync)); | 953 ObserveServiceForSyncDisables(static_cast<syncer::SyncService*>(sync)); |
| 954 } | 954 } |
| 955 | 955 |
| 956 void ChromeMetricsServiceClient::Observe( | 956 void ChromeMetricsServiceClient::Observe( |
| 957 int type, | 957 int type, |
| 958 const content::NotificationSource& source, | 958 const content::NotificationSource& source, |
| 959 const content::NotificationDetails& details) { | 959 const content::NotificationDetails& details) { |
| 960 DCHECK(thread_checker_.CalledOnValidThread()); | 960 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 961 | 961 |
| 962 switch (type) { | 962 switch (type) { |
| 963 case chrome::NOTIFICATION_BROWSER_OPENED: | 963 case chrome::NOTIFICATION_BROWSER_OPENED: |
| 964 // May have opened an incognito window. | 964 // May have opened an incognito window. |
| 965 UpdateRunningServices(); | 965 UpdateRunningServices(); |
| 966 metrics_service_->OnApplicationNotIdle(); | 966 metrics_service_->OnApplicationNotIdle(); |
| 967 break; | 967 break; |
| 968 case chrome::NOTIFICATION_BROWSER_CLOSED: | 968 case chrome::NOTIFICATION_BROWSER_CLOSED: |
| 969 case chrome::NOTIFICATION_TAB_PARENTED: | 969 case chrome::NOTIFICATION_TAB_PARENTED: |
| 970 case chrome::NOTIFICATION_TAB_CLOSING: | 970 case chrome::NOTIFICATION_TAB_CLOSING: |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1008 ukm_service_->Purge(); | 1008 ukm_service_->Purge(); |
| 1009 ukm_service_->ResetClientId(); | 1009 ukm_service_->ResetClientId(); |
| 1010 } | 1010 } |
| 1011 // Signal service manager to enable/disable UKM based on new state. | 1011 // Signal service manager to enable/disable UKM based on new state. |
| 1012 UpdateRunningServices(); | 1012 UpdateRunningServices(); |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 bool ChromeMetricsServiceClient::IsHistorySyncEnabledOnAllProfiles() { | 1015 bool ChromeMetricsServiceClient::IsHistorySyncEnabledOnAllProfiles() { |
| 1016 return SyncDisableObserver::IsHistorySyncEnabledOnAllProfiles(); | 1016 return SyncDisableObserver::IsHistorySyncEnabledOnAllProfiles(); |
| 1017 } | 1017 } |
| OLD | NEW |