| 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 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 LogLoadStarted(); | 532 LogLoadStarted(); |
| 533 break; | 533 break; |
| 534 | 534 |
| 535 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { | 535 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
| 536 content::RenderProcessHost::RendererClosedDetails* process_details = | 536 content::RenderProcessHost::RendererClosedDetails* process_details = |
| 537 content::Details< | 537 content::Details< |
| 538 content::RenderProcessHost::RendererClosedDetails>( | 538 content::RenderProcessHost::RendererClosedDetails>( |
| 539 details).ptr(); | 539 details).ptr(); |
| 540 content::RenderProcessHost* host = | 540 content::RenderProcessHost* host = |
| 541 content::Source<content::RenderProcessHost>(source).ptr(); | 541 content::Source<content::RenderProcessHost>(source).ptr(); |
| 542 LogRendererCrash( | 542 LogRendererCrash(host, *process_details); |
| 543 host, process_details->status, process_details->was_alive); | |
| 544 } | 543 } |
| 545 break; | 544 break; |
| 546 | 545 |
| 547 case content::NOTIFICATION_RENDERER_PROCESS_HANG: | 546 case content::NOTIFICATION_RENDERER_PROCESS_HANG: |
| 548 LogRendererHang(); | 547 LogRendererHang(); |
| 549 break; | 548 break; |
| 550 | 549 |
| 551 case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED: | 550 case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED: |
| 552 case content::NOTIFICATION_CHILD_PROCESS_CRASHED: | 551 case content::NOTIFICATION_CHILD_PROCESS_CRASHED: |
| 553 case content::NOTIFICATION_CHILD_INSTANCE_CREATED: | 552 case content::NOTIFICATION_CHILD_INSTANCE_CREATED: |
| (...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1243 } | 1242 } |
| 1244 | 1243 |
| 1245 void MetricsService::LogLoadStarted() { | 1244 void MetricsService::LogLoadStarted() { |
| 1246 HISTOGRAM_ENUMERATION("Chrome.UmaPageloadCounter", 1, 2); | 1245 HISTOGRAM_ENUMERATION("Chrome.UmaPageloadCounter", 1, 2); |
| 1247 IncrementPrefValue(prefs::kStabilityPageLoadCount); | 1246 IncrementPrefValue(prefs::kStabilityPageLoadCount); |
| 1248 IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount); | 1247 IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount); |
| 1249 // We need to save the prefs, as page load count is a critical stat, and it | 1248 // We need to save the prefs, as page load count is a critical stat, and it |
| 1250 // might be lost due to a crash :-(. | 1249 // might be lost due to a crash :-(. |
| 1251 } | 1250 } |
| 1252 | 1251 |
| 1253 void MetricsService::LogRendererCrash(content::RenderProcessHost* host, | 1252 void MetricsService::LogRendererCrash( |
| 1254 base::TerminationStatus status, | 1253 content::RenderProcessHost* host, |
| 1255 bool was_alive) { | 1254 const content::RenderProcessHost::RendererClosedDetails& details) { |
| 1256 Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); | 1255 Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); |
| 1257 ExtensionService* service = profile->GetExtensionService(); | 1256 ExtensionService* service = profile->GetExtensionService(); |
| 1258 bool was_extension_process = | 1257 bool was_extension_process = |
| 1259 service && service->process_map()->Contains(host->GetID()); | 1258 service && service->process_map()->Contains(host->GetID()); |
| 1260 if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || | 1259 if (details.status == base::TERMINATION_STATUS_PROCESS_CRASHED || |
| 1261 status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { | 1260 details.status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
| 1262 if (was_extension_process) | 1261 if (was_extension_process) { |
| 1263 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); | 1262 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); |
| 1264 else | 1263 } else { |
| 1265 IncrementPrefValue(prefs::kStabilityRendererCrashCount); | 1264 IncrementPrefValue(prefs::kStabilityRendererCrashCount); |
| 1266 | 1265 |
| 1266 #if defined(OS_WIN) |
| 1267 if (details.have_process_times) { |
| 1268 if (details.status == base::TERMINATION_STATUS_PROCESS_CRASHED) { |
| 1269 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.CrashedDuration", |
| 1270 details.run_duration); |
| 1271 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.CrashedKernelTime", |
| 1272 details.kernel_duration); |
| 1273 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.CrashedUserTime", |
| 1274 details.user_duration); |
| 1275 } else { |
| 1276 DCHECK(details.status == |
| 1277 base::TERMINATION_STATUS_ABNORMAL_TERMINATION); |
| 1278 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.AbnormalTermDuration", |
| 1279 details.run_duration); |
| 1280 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.AbnormalTermKernelTime", |
| 1281 details.kernel_duration); |
| 1282 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.AbnormalTermUserTime", |
| 1283 details.user_duration); |
| 1284 } |
| 1285 } |
| 1286 #endif // OS_WIN |
| 1287 } |
| 1288 |
| 1289 // TODO(jar): These histograms should be small enumerated histograms. |
| 1267 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", | 1290 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", |
| 1268 was_extension_process ? 2 : 1); | 1291 was_extension_process ? 2 : 1); |
| 1269 if (was_alive) { | 1292 if (details.was_alive) { |
| 1270 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashesWasAlive", | 1293 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashesWasAlive", |
| 1271 was_extension_process ? 2 : 1); | 1294 was_extension_process ? 2 : 1); |
| 1272 } | 1295 } |
| 1273 } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { | 1296 } else if (details.status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { |
| 1274 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", | 1297 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", |
| 1275 was_extension_process ? 2 : 1); | 1298 was_extension_process ? 2 : 1); |
| 1276 if (was_alive) { | 1299 if (details.was_alive) { |
| 1277 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKillsWasAlive", | 1300 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKillsWasAlive", |
| 1278 was_extension_process ? 2 : 1); | 1301 was_extension_process ? 2 : 1); |
| 1279 } | 1302 } |
| 1280 } | 1303 } |
| 1304 |
| 1305 #if defined(OS_WIN) |
| 1306 if (details.have_process_times && !was_extension_process && |
| 1307 details.status != base::TERMINATION_STATUS_PROCESS_CRASHED && |
| 1308 details.status != base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
| 1309 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.NormalTermDuration", |
| 1310 details.run_duration); |
| 1311 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.NormalTermKernelTime", |
| 1312 details.kernel_duration); |
| 1313 UMA_HISTOGRAM_TIMES("BrowserRenderProcessHost.NormalTermUserTime", |
| 1314 details.user_duration); |
| 1315 } |
| 1316 #endif // OS_WIN |
| 1281 } | 1317 } |
| 1282 | 1318 |
| 1283 void MetricsService::LogRendererHang() { | 1319 void MetricsService::LogRendererHang() { |
| 1284 IncrementPrefValue(prefs::kStabilityRendererHangCount); | 1320 IncrementPrefValue(prefs::kStabilityRendererHangCount); |
| 1285 } | 1321 } |
| 1286 | 1322 |
| 1287 void MetricsService::LogNeedForCleanShutdown() { | 1323 void MetricsService::LogNeedForCleanShutdown() { |
| 1288 PrefService* pref = g_browser_process->local_state(); | 1324 PrefService* pref = g_browser_process->local_state(); |
| 1289 pref->SetBoolean(prefs::kStabilityExitedCleanly, false); | 1325 pref->SetBoolean(prefs::kStabilityExitedCleanly, false); |
| 1290 // Redundant setting to be sure we call for a clean shutdown. | 1326 // Redundant setting to be sure we call for a clean shutdown. |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1556 if (local_state) { | 1592 if (local_state) { |
| 1557 const PrefService::Preference* uma_pref = | 1593 const PrefService::Preference* uma_pref = |
| 1558 local_state->FindPreference(prefs::kMetricsReportingEnabled); | 1594 local_state->FindPreference(prefs::kMetricsReportingEnabled); |
| 1559 if (uma_pref) { | 1595 if (uma_pref) { |
| 1560 bool success = uma_pref->GetValue()->GetAsBoolean(&result); | 1596 bool success = uma_pref->GetValue()->GetAsBoolean(&result); |
| 1561 DCHECK(success); | 1597 DCHECK(success); |
| 1562 } | 1598 } |
| 1563 } | 1599 } |
| 1564 return result; | 1600 return result; |
| 1565 } | 1601 } |
| OLD | NEW |