| 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 | 10 // A MetricsService instance is typically created at application startup. It |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 LogLoadStarted(); | 553 LogLoadStarted(); |
| 554 break; | 554 break; |
| 555 | 555 |
| 556 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { | 556 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
| 557 content::RenderProcessHost::RendererClosedDetails* process_details = | 557 content::RenderProcessHost::RendererClosedDetails* process_details = |
| 558 content::Details< | 558 content::Details< |
| 559 content::RenderProcessHost::RendererClosedDetails>( | 559 content::RenderProcessHost::RendererClosedDetails>( |
| 560 details).ptr(); | 560 details).ptr(); |
| 561 content::RenderProcessHost* host = | 561 content::RenderProcessHost* host = |
| 562 content::Source<content::RenderProcessHost>(source).ptr(); | 562 content::Source<content::RenderProcessHost>(source).ptr(); |
| 563 LogRendererCrash( | 563 LogRendererCrash(host, *process_details); |
| 564 host, process_details->status, process_details->was_alive); | |
| 565 } | 564 } |
| 566 break; | 565 break; |
| 567 | 566 |
| 568 case content::NOTIFICATION_RENDERER_PROCESS_HANG: | 567 case content::NOTIFICATION_RENDERER_PROCESS_HANG: |
| 569 LogRendererHang(); | 568 LogRendererHang(); |
| 570 break; | 569 break; |
| 571 | 570 |
| 572 case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED: | 571 case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED: |
| 573 case content::NOTIFICATION_CHILD_PROCESS_CRASHED: | 572 case content::NOTIFICATION_CHILD_PROCESS_CRASHED: |
| 574 case content::NOTIFICATION_CHILD_INSTANCE_CREATED: | 573 case content::NOTIFICATION_CHILD_INSTANCE_CREATED: |
| (...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 } | 1360 } |
| 1362 | 1361 |
| 1363 void MetricsService::LogLoadStarted() { | 1362 void MetricsService::LogLoadStarted() { |
| 1364 HISTOGRAM_ENUMERATION("Chrome.UmaPageloadCounter", 1, 2); | 1363 HISTOGRAM_ENUMERATION("Chrome.UmaPageloadCounter", 1, 2); |
| 1365 IncrementPrefValue(prefs::kStabilityPageLoadCount); | 1364 IncrementPrefValue(prefs::kStabilityPageLoadCount); |
| 1366 IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount); | 1365 IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount); |
| 1367 // We need to save the prefs, as page load count is a critical stat, and it | 1366 // We need to save the prefs, as page load count is a critical stat, and it |
| 1368 // might be lost due to a crash :-(. | 1367 // might be lost due to a crash :-(. |
| 1369 } | 1368 } |
| 1370 | 1369 |
| 1371 void MetricsService::LogRendererCrash(content::RenderProcessHost* host, | 1370 void MetricsService::LogRendererCrash( |
| 1372 base::TerminationStatus status, | 1371 content::RenderProcessHost* host, |
| 1373 bool was_alive) { | 1372 const content::RenderProcessHost::RendererClosedDetails& details) { |
| 1374 Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); | 1373 Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); |
| 1375 ExtensionService* service = profile->GetExtensionService(); | 1374 ExtensionService* service = profile->GetExtensionService(); |
| 1376 bool was_extension_process = | 1375 bool was_extension_process = |
| 1377 service && service->process_map()->Contains(host->GetID()); | 1376 service && service->process_map()->Contains(host->GetID()); |
| 1378 if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || | 1377 if (details.status == base::TERMINATION_STATUS_PROCESS_CRASHED || |
| 1379 status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { | 1378 details.status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
| 1380 if (was_extension_process) | 1379 if (was_extension_process) { |
| 1381 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); | 1380 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); |
| 1382 else | 1381 } else { |
| 1383 IncrementPrefValue(prefs::kStabilityRendererCrashCount); | 1382 IncrementPrefValue(prefs::kStabilityRendererCrashCount); |
| 1384 | 1383 |
| 1384 #if defined(OS_WIN) |
| 1385 if (details.have_process_times) { |
| 1386 if (details.status == base::TERMINATION_STATUS_PROCESS_CRASHED) { |
| 1387 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.CrashedDuration", |
| 1388 details.run_duration); |
| 1389 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.CrashedKernelTime", |
| 1390 details.kernel_duration); |
| 1391 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.CrashedUserTime", |
| 1392 details.user_duration); |
| 1393 } else { |
| 1394 DCHECK(details.status == |
| 1395 base::TERMINATION_STATUS_ABNORMAL_TERMINATION); |
| 1396 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.AbnormalTermDuration", |
| 1397 details.run_duration); |
| 1398 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.AbnormalTermKernelTime", |
| 1399 details.kernel_duration); |
| 1400 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.AbnormalTermUserTime", |
| 1401 details.user_duration); |
| 1402 } |
| 1403 } |
| 1404 #endif // OS_WIN |
| 1405 } |
| 1406 |
| 1407 // TODO(jar): These histograms should be small enumerated histograms. |
| 1385 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", | 1408 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", |
| 1386 was_extension_process ? 2 : 1); | 1409 was_extension_process ? 2 : 1); |
| 1387 if (was_alive) { | 1410 if (details.was_alive) { |
| 1388 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashesWasAlive", | 1411 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashesWasAlive", |
| 1389 was_extension_process ? 2 : 1); | 1412 was_extension_process ? 2 : 1); |
| 1390 } | 1413 } |
| 1391 } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { | 1414 } else if (details.status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { |
| 1392 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", | 1415 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", |
| 1393 was_extension_process ? 2 : 1); | 1416 was_extension_process ? 2 : 1); |
| 1394 if (was_alive) { | 1417 if (details.was_alive) { |
| 1395 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKillsWasAlive", | 1418 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKillsWasAlive", |
| 1396 was_extension_process ? 2 : 1); | 1419 was_extension_process ? 2 : 1); |
| 1397 } | 1420 } |
| 1398 } | 1421 } |
| 1422 |
| 1423 #if defined(OS_WIN) |
| 1424 if (details.have_process_times && !was_extension_process && |
| 1425 details.status != base::TERMINATION_STATUS_PROCESS_CRASHED && |
| 1426 details.status != base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
| 1427 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.NormalTermDuration", |
| 1428 details.run_duration); |
| 1429 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.NormalTermKernelTime", |
| 1430 details.kernel_duration); |
| 1431 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.NormalTermUserTime", |
| 1432 details.user_duration); |
| 1433 } |
| 1434 #endif // OS_WIN |
| 1399 } | 1435 } |
| 1400 | 1436 |
| 1401 void MetricsService::LogRendererHang() { | 1437 void MetricsService::LogRendererHang() { |
| 1402 IncrementPrefValue(prefs::kStabilityRendererHangCount); | 1438 IncrementPrefValue(prefs::kStabilityRendererHangCount); |
| 1403 } | 1439 } |
| 1404 | 1440 |
| 1405 void MetricsService::LogNeedForCleanShutdown() { | 1441 void MetricsService::LogNeedForCleanShutdown() { |
| 1406 PrefService* pref = g_browser_process->local_state(); | 1442 PrefService* pref = g_browser_process->local_state(); |
| 1407 pref->SetBoolean(prefs::kStabilityExitedCleanly, false); | 1443 pref->SetBoolean(prefs::kStabilityExitedCleanly, false); |
| 1408 // Redundant setting to be sure we call for a clean shutdown. | 1444 // Redundant setting to be sure we call for a clean shutdown. |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1664 if (local_state) { | 1700 if (local_state) { |
| 1665 const PrefService::Preference* uma_pref = | 1701 const PrefService::Preference* uma_pref = |
| 1666 local_state->FindPreference(prefs::kMetricsReportingEnabled); | 1702 local_state->FindPreference(prefs::kMetricsReportingEnabled); |
| 1667 if (uma_pref) { | 1703 if (uma_pref) { |
| 1668 bool success = uma_pref->GetValue()->GetAsBoolean(&result); | 1704 bool success = uma_pref->GetValue()->GetAsBoolean(&result); |
| 1669 DCHECK(success); | 1705 DCHECK(success); |
| 1670 } | 1706 } |
| 1671 } | 1707 } |
| 1672 return result; | 1708 return result; |
| 1673 } | 1709 } |
| OLD | NEW |