| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h" | 5 #include "ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/callback.h" | 13 #include "base/callback.h" |
| 14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 15 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
| 16 #include "base/logging.h" | 16 #include "base/logging.h" |
| 17 #include "base/memory/ptr_util.h" |
| 17 #include "base/metrics/histogram.h" | 18 #include "base/metrics/histogram.h" |
| 18 #include "base/process/process_metrics.h" | 19 #include "base/process/process_metrics.h" |
| 19 #include "base/rand_util.h" | 20 #include "base/rand_util.h" |
| 20 #include "base/strings/string16.h" | 21 #include "base/strings/string16.h" |
| 21 #include "base/threading/platform_thread.h" | 22 #include "base/threading/platform_thread.h" |
| 22 #include "components/crash/core/common/crash_keys.h" | 23 #include "components/crash/core/common/crash_keys.h" |
| 23 #include "components/metrics/call_stack_profile_metrics_provider.h" | 24 #include "components/metrics/call_stack_profile_metrics_provider.h" |
| 24 #include "components/metrics/drive_metrics_provider.h" | 25 #include "components/metrics/drive_metrics_provider.h" |
| 25 #include "components/metrics/metrics_pref_names.h" | 26 #include "components/metrics/metrics_pref_names.h" |
| 26 #include "components/metrics/metrics_service.h" | 27 #include "components/metrics/metrics_service.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 weak_ptr_factory_(this) { | 85 weak_ptr_factory_(this) { |
| 85 DCHECK(thread_checker_.CalledOnValidThread()); | 86 DCHECK(thread_checker_.CalledOnValidThread()); |
| 86 RegisterForNotifications(); | 87 RegisterForNotifications(); |
| 87 } | 88 } |
| 88 | 89 |
| 89 IOSChromeMetricsServiceClient::~IOSChromeMetricsServiceClient() { | 90 IOSChromeMetricsServiceClient::~IOSChromeMetricsServiceClient() { |
| 90 DCHECK(thread_checker_.CalledOnValidThread()); | 91 DCHECK(thread_checker_.CalledOnValidThread()); |
| 91 } | 92 } |
| 92 | 93 |
| 93 // static | 94 // static |
| 94 scoped_ptr<IOSChromeMetricsServiceClient> IOSChromeMetricsServiceClient::Create( | 95 std::unique_ptr<IOSChromeMetricsServiceClient> |
| 96 IOSChromeMetricsServiceClient::Create( |
| 95 metrics::MetricsStateManager* state_manager, | 97 metrics::MetricsStateManager* state_manager, |
| 96 PrefService* local_state) { | 98 PrefService* local_state) { |
| 97 // Perform two-phase initialization so that |client->metrics_service_| only | 99 // Perform two-phase initialization so that |client->metrics_service_| only |
| 98 // receives pointers to fully constructed objects. | 100 // receives pointers to fully constructed objects. |
| 99 scoped_ptr<IOSChromeMetricsServiceClient> client( | 101 std::unique_ptr<IOSChromeMetricsServiceClient> client( |
| 100 new IOSChromeMetricsServiceClient(state_manager)); | 102 new IOSChromeMetricsServiceClient(state_manager)); |
| 101 client->Initialize(); | 103 client->Initialize(); |
| 102 | 104 |
| 103 return client; | 105 return client; |
| 104 } | 106 } |
| 105 | 107 |
| 106 // static | 108 // static |
| 107 void IOSChromeMetricsServiceClient::RegisterPrefs( | 109 void IOSChromeMetricsServiceClient::RegisterPrefs( |
| 108 PrefRegistrySimple* registry) { | 110 PrefRegistrySimple* registry) { |
| 109 metrics::MetricsService::RegisterPrefs(registry); | 111 metrics::MetricsService::RegisterPrefs(registry); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 if (ShouldIncludeProfilerDataInLog()) { | 169 if (ShouldIncludeProfilerDataInLog()) { |
| 168 // Fetch profiler data. This will call into | 170 // Fetch profiler data. This will call into |
| 169 // |FinishedReceivingProfilerData()| when the task completes. | 171 // |FinishedReceivingProfilerData()| when the task completes. |
| 170 metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( | 172 metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( |
| 171 weak_ptr_factory_.GetWeakPtr()); | 173 weak_ptr_factory_.GetWeakPtr()); |
| 172 } else { | 174 } else { |
| 173 CollectFinalHistograms(); | 175 CollectFinalHistograms(); |
| 174 } | 176 } |
| 175 } | 177 } |
| 176 | 178 |
| 177 scoped_ptr<metrics::MetricsLogUploader> | 179 std::unique_ptr<metrics::MetricsLogUploader> |
| 178 IOSChromeMetricsServiceClient::CreateUploader( | 180 IOSChromeMetricsServiceClient::CreateUploader( |
| 179 const base::Callback<void(int)>& on_upload_complete) { | 181 const base::Callback<void(int)>& on_upload_complete) { |
| 180 return scoped_ptr<metrics::MetricsLogUploader>( | 182 return std::unique_ptr<metrics::MetricsLogUploader>( |
| 181 new metrics::NetMetricsLogUploader( | 183 new metrics::NetMetricsLogUploader( |
| 182 GetApplicationContext()->GetSystemURLRequestContext(), | 184 GetApplicationContext()->GetSystemURLRequestContext(), |
| 183 metrics::kDefaultMetricsServerUrl, metrics::kDefaultMetricsMimeType, | 185 metrics::kDefaultMetricsServerUrl, metrics::kDefaultMetricsMimeType, |
| 184 on_upload_complete)); | 186 on_upload_complete)); |
| 185 } | 187 } |
| 186 | 188 |
| 187 base::TimeDelta IOSChromeMetricsServiceClient::GetStandardUploadInterval() { | 189 base::TimeDelta IOSChromeMetricsServiceClient::GetStandardUploadInterval() { |
| 188 if (IsCellularLogicEnabled()) | 190 if (IsCellularLogicEnabled()) |
| 189 return base::TimeDelta::FromSeconds(kStandardUploadIntervalCellularSeconds); | 191 return base::TimeDelta::FromSeconds(kStandardUploadIntervalCellularSeconds); |
| 190 return base::TimeDelta::FromSeconds(kStandardUploadIntervalSeconds); | 192 return base::TimeDelta::FromSeconds(kStandardUploadIntervalSeconds); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 207 web::WebState* web_state) { | 209 web::WebState* web_state) { |
| 208 metrics_service_->OnApplicationNotIdle(); | 210 metrics_service_->OnApplicationNotIdle(); |
| 209 } | 211 } |
| 210 | 212 |
| 211 void IOSChromeMetricsServiceClient::Initialize() { | 213 void IOSChromeMetricsServiceClient::Initialize() { |
| 212 metrics_service_.reset(new metrics::MetricsService( | 214 metrics_service_.reset(new metrics::MetricsService( |
| 213 metrics_state_manager_, this, GetApplicationContext()->GetLocalState())); | 215 metrics_state_manager_, this, GetApplicationContext()->GetLocalState())); |
| 214 | 216 |
| 215 // Register metrics providers. | 217 // Register metrics providers. |
| 216 metrics_service_->RegisterMetricsProvider( | 218 metrics_service_->RegisterMetricsProvider( |
| 217 scoped_ptr<metrics::MetricsProvider>(new metrics::NetworkMetricsProvider( | 219 std::unique_ptr<metrics::MetricsProvider>( |
| 218 web::WebThread::GetBlockingPool()))); | 220 new metrics::NetworkMetricsProvider( |
| 221 web::WebThread::GetBlockingPool()))); |
| 219 | 222 |
| 220 // Currently, we configure OmniboxMetricsProvider to not log events to UMA | 223 // Currently, we configure OmniboxMetricsProvider to not log events to UMA |
| 221 // if there is a single incognito session visible. In the future, it may | 224 // if there is a single incognito session visible. In the future, it may |
| 222 // be worth revisiting this to still log events from non-incognito sessions. | 225 // be worth revisiting this to still log events from non-incognito sessions. |
| 223 metrics_service_->RegisterMetricsProvider( | 226 metrics_service_->RegisterMetricsProvider( |
| 224 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider( | 227 std::unique_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider( |
| 225 base::Bind(&::IsOffTheRecordSessionActive)))); | 228 base::Bind(&::IsOffTheRecordSessionActive)))); |
| 226 | 229 |
| 227 stability_metrics_provider_ = new IOSChromeStabilityMetricsProvider( | 230 stability_metrics_provider_ = new IOSChromeStabilityMetricsProvider( |
| 228 GetApplicationContext()->GetLocalState()); | 231 GetApplicationContext()->GetLocalState()); |
| 229 metrics_service_->RegisterMetricsProvider( | 232 metrics_service_->RegisterMetricsProvider( |
| 230 scoped_ptr<metrics::MetricsProvider>(stability_metrics_provider_)); | 233 std::unique_ptr<metrics::MetricsProvider>(stability_metrics_provider_)); |
| 231 | 234 |
| 232 metrics_service_->RegisterMetricsProvider( | 235 metrics_service_->RegisterMetricsProvider( |
| 233 scoped_ptr<metrics::MetricsProvider>( | 236 std::unique_ptr<metrics::MetricsProvider>( |
| 234 new metrics::ScreenInfoMetricsProvider)); | 237 new metrics::ScreenInfoMetricsProvider)); |
| 235 | 238 |
| 236 drive_metrics_provider_ = new metrics::DriveMetricsProvider( | 239 drive_metrics_provider_ = new metrics::DriveMetricsProvider( |
| 237 web::WebThread::GetTaskRunnerForThread(web::WebThread::FILE), | 240 web::WebThread::GetTaskRunnerForThread(web::WebThread::FILE), |
| 238 ios::FILE_LOCAL_STATE); | 241 ios::FILE_LOCAL_STATE); |
| 239 metrics_service_->RegisterMetricsProvider( | 242 metrics_service_->RegisterMetricsProvider( |
| 240 scoped_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); | 243 std::unique_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); |
| 241 | 244 |
| 242 profiler_metrics_provider_ = | 245 profiler_metrics_provider_ = |
| 243 new metrics::ProfilerMetricsProvider(base::Bind(&IsCellularLogicEnabled)); | 246 new metrics::ProfilerMetricsProvider(base::Bind(&IsCellularLogicEnabled)); |
| 244 metrics_service_->RegisterMetricsProvider( | 247 metrics_service_->RegisterMetricsProvider( |
| 245 scoped_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); | 248 std::unique_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); |
| 246 | 249 |
| 247 metrics_service_->RegisterMetricsProvider( | 250 metrics_service_->RegisterMetricsProvider( |
| 248 scoped_ptr<metrics::MetricsProvider>( | 251 std::unique_ptr<metrics::MetricsProvider>( |
| 249 new metrics::CallStackProfileMetricsProvider)); | 252 new metrics::CallStackProfileMetricsProvider)); |
| 250 | 253 |
| 251 metrics_service_->RegisterMetricsProvider( | 254 metrics_service_->RegisterMetricsProvider( |
| 252 scoped_ptr<metrics::MetricsProvider>( | 255 std::unique_ptr<metrics::MetricsProvider>( |
| 253 SigninStatusMetricsProvider::CreateInstance(make_scoped_ptr( | 256 SigninStatusMetricsProvider::CreateInstance(base::WrapUnique( |
| 254 new IOSChromeSigninStatusMetricsProviderDelegate)))); | 257 new IOSChromeSigninStatusMetricsProviderDelegate)))); |
| 255 | 258 |
| 256 metrics_service_->RegisterMetricsProvider( | 259 metrics_service_->RegisterMetricsProvider( |
| 257 scoped_ptr<metrics::MetricsProvider>( | 260 std::unique_ptr<metrics::MetricsProvider>( |
| 258 new MobileSessionShutdownMetricsProvider(metrics_service_.get()))); | 261 new MobileSessionShutdownMetricsProvider(metrics_service_.get()))); |
| 259 | 262 |
| 260 metrics_service_->RegisterMetricsProvider( | 263 metrics_service_->RegisterMetricsProvider( |
| 261 scoped_ptr<metrics::MetricsProvider>( | 264 std::unique_ptr<metrics::MetricsProvider>( |
| 262 new sync_driver::DeviceCountMetricsProvider( | 265 new sync_driver::DeviceCountMetricsProvider( |
| 263 base::Bind(&IOSChromeSyncClient::GetDeviceInfoTrackers)))); | 266 base::Bind(&IOSChromeSyncClient::GetDeviceInfoTrackers)))); |
| 264 } | 267 } |
| 265 | 268 |
| 266 void IOSChromeMetricsServiceClient::OnInitTaskGotDriveMetrics() { | 269 void IOSChromeMetricsServiceClient::OnInitTaskGotDriveMetrics() { |
| 267 finished_init_task_callback_.Run(); | 270 finished_init_task_callback_.Run(); |
| 268 } | 271 } |
| 269 | 272 |
| 270 bool IOSChromeMetricsServiceClient::ShouldIncludeProfilerDataInLog() { | 273 bool IOSChromeMetricsServiceClient::ShouldIncludeProfilerDataInLog() { |
| 271 // Upload profiler data at most once per session. | 274 // Upload profiler data at most once per session. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 301 CollectFinalHistograms(); | 304 CollectFinalHistograms(); |
| 302 } | 305 } |
| 303 | 306 |
| 304 void IOSChromeMetricsServiceClient::CollectFinalHistograms() { | 307 void IOSChromeMetricsServiceClient::CollectFinalHistograms() { |
| 305 DCHECK(thread_checker_.CalledOnValidThread()); | 308 DCHECK(thread_checker_.CalledOnValidThread()); |
| 306 | 309 |
| 307 // TODO(ios): Try to extract the flow below into a utility function that is | 310 // TODO(ios): Try to extract the flow below into a utility function that is |
| 308 // shared between the iOS port's usage and | 311 // shared between the iOS port's usage and |
| 309 // ChromeMetricsServiceClient::CollectFinalHistograms()'s usage of | 312 // ChromeMetricsServiceClient::CollectFinalHistograms()'s usage of |
| 310 // MetricsMemoryDetails. | 313 // MetricsMemoryDetails. |
| 311 scoped_ptr<base::ProcessMetrics> process_metrics( | 314 std::unique_ptr<base::ProcessMetrics> process_metrics( |
| 312 base::ProcessMetrics::CreateProcessMetrics( | 315 base::ProcessMetrics::CreateProcessMetrics( |
| 313 base::GetCurrentProcessHandle())); | 316 base::GetCurrentProcessHandle())); |
| 314 UMA_HISTOGRAM_MEMORY_KB("Memory.Browser", | 317 UMA_HISTOGRAM_MEMORY_KB("Memory.Browser", |
| 315 process_metrics->GetWorkingSetSize() / 1024); | 318 process_metrics->GetWorkingSetSize() / 1024); |
| 316 collect_final_metrics_done_callback_.Run(); | 319 collect_final_metrics_done_callback_.Run(); |
| 317 } | 320 } |
| 318 | 321 |
| 319 void IOSChromeMetricsServiceClient::RegisterForNotifications() { | 322 void IOSChromeMetricsServiceClient::RegisterForNotifications() { |
| 320 tab_parented_subscription_ = | 323 tab_parented_subscription_ = |
| 321 TabParentingGlobalObserver::GetInstance()->RegisterCallback( | 324 TabParentingGlobalObserver::GetInstance()->RegisterCallback( |
| 322 base::Bind(&IOSChromeMetricsServiceClient::OnTabParented, | 325 base::Bind(&IOSChromeMetricsServiceClient::OnTabParented, |
| 323 base::Unretained(this))); | 326 base::Unretained(this))); |
| 324 omnibox_url_opened_subscription_ = | 327 omnibox_url_opened_subscription_ = |
| 325 OmniboxEventGlobalTracker::GetInstance()->RegisterCallback( | 328 OmniboxEventGlobalTracker::GetInstance()->RegisterCallback( |
| 326 base::Bind(&IOSChromeMetricsServiceClient::OnURLOpenedFromOmnibox, | 329 base::Bind(&IOSChromeMetricsServiceClient::OnURLOpenedFromOmnibox, |
| 327 base::Unretained(this))); | 330 base::Unretained(this))); |
| 328 } | 331 } |
| 329 | 332 |
| 330 void IOSChromeMetricsServiceClient::OnTabParented(web::WebState* web_state) { | 333 void IOSChromeMetricsServiceClient::OnTabParented(web::WebState* web_state) { |
| 331 metrics_service_->OnApplicationNotIdle(); | 334 metrics_service_->OnApplicationNotIdle(); |
| 332 } | 335 } |
| 333 | 336 |
| 334 void IOSChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { | 337 void IOSChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { |
| 335 metrics_service_->OnApplicationNotIdle(); | 338 metrics_service_->OnApplicationNotIdle(); |
| 336 } | 339 } |
| OLD | NEW |