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

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

Issue 289283011: Introduce ChromeStabilityMetricsProvider (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Response to review 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 | Annotate | Revision Log
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 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 #include "base/strings/utf_string_conversions.h" 178 #include "base/strings/utf_string_conversions.h"
179 #include "base/threading/platform_thread.h" 179 #include "base/threading/platform_thread.h"
180 #include "base/threading/thread.h" 180 #include "base/threading/thread.h"
181 #include "base/threading/thread_restrictions.h" 181 #include "base/threading/thread_restrictions.h"
182 #include "base/tracked_objects.h" 182 #include "base/tracked_objects.h"
183 #include "base/values.h" 183 #include "base/values.h"
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/memory_details.h" 187 #include "chrome/browser/memory_details.h"
188 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h"
188 #include "chrome/browser/metrics/compression_utils.h" 189 #include "chrome/browser/metrics/compression_utils.h"
189 #include "chrome/browser/metrics/metrics_log.h" 190 #include "chrome/browser/metrics/metrics_log.h"
190 #include "chrome/browser/metrics/metrics_state_manager.h" 191 #include "chrome/browser/metrics/metrics_state_manager.h"
191 #include "chrome/browser/metrics/omnibox_metrics_provider.h" 192 #include "chrome/browser/metrics/omnibox_metrics_provider.h"
192 #include "chrome/browser/metrics/time_ticks_experiment_win.h" 193 #include "chrome/browser/metrics/time_ticks_experiment_win.h"
193 #include "chrome/browser/metrics/tracking_synchronizer.h" 194 #include "chrome/browser/metrics/tracking_synchronizer.h"
194 #include "chrome/browser/net/http_pipelining_compatibility_client.h" 195 #include "chrome/browser/net/http_pipelining_compatibility_client.h"
195 #include "chrome/browser/net/network_stats.h" 196 #include "chrome/browser/net/network_stats.h"
196 #include "chrome/browser/ui/browser_otr_state.h" 197 #include "chrome/browser/ui/browser_otr_state.h"
197 #include "chrome/common/chrome_constants.h" 198 #include "chrome/common/chrome_constants.h"
(...skipping 11 matching lines...) Expand all
209 #include "content/public/browser/child_process_data.h" 210 #include "content/public/browser/child_process_data.h"
210 #include "content/public/browser/histogram_fetcher.h" 211 #include "content/public/browser/histogram_fetcher.h"
211 #include "content/public/browser/load_notification_details.h" 212 #include "content/public/browser/load_notification_details.h"
212 #include "content/public/browser/notification_service.h" 213 #include "content/public/browser/notification_service.h"
213 #include "content/public/browser/plugin_service.h" 214 #include "content/public/browser/plugin_service.h"
214 #include "content/public/browser/render_process_host.h" 215 #include "content/public/browser/render_process_host.h"
215 #include "content/public/browser/user_metrics.h" 216 #include "content/public/browser/user_metrics.h"
216 #include "content/public/browser/web_contents.h" 217 #include "content/public/browser/web_contents.h"
217 #include "content/public/common/process_type.h" 218 #include "content/public/common/process_type.h"
218 #include "content/public/common/webplugininfo.h" 219 #include "content/public/common/webplugininfo.h"
219 #include "extensions/browser/process_map.h"
220 #include "net/base/load_flags.h" 220 #include "net/base/load_flags.h"
221 #include "net/url_request/url_fetcher.h" 221 #include "net/url_request/url_fetcher.h"
222 222
223 // TODO(port): port browser_distribution.h. 223 // TODO(port): port browser_distribution.h.
224 #if !defined(OS_POSIX) 224 #if !defined(OS_POSIX)
225 #include "chrome/installer/util/browser_distribution.h" 225 #include "chrome/installer/util/browser_distribution.h"
226 #endif 226 #endif
227 227
228 #if defined(OS_CHROMEOS) 228 #if defined(OS_CHROMEOS)
229 #include "chrome/browser/chromeos/settings/cros_settings.h" 229 #include "chrome/browser/chromeos/settings/cros_settings.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 return SUCCESS; 298 return SUCCESS;
299 case 400: 299 case 400:
300 return BAD_REQUEST; 300 return BAD_REQUEST;
301 case net::URLFetcher::RESPONSE_CODE_INVALID: 301 case net::URLFetcher::RESPONSE_CODE_INVALID:
302 return NO_RESPONSE; 302 return NO_RESPONSE;
303 default: 303 default:
304 return UNKNOWN_FAILURE; 304 return UNKNOWN_FAILURE;
305 } 305 }
306 } 306 }
307 307
308 // Converts an exit code into something that can be inserted into our
309 // histograms (which expect non-negative numbers less than MAX_INT).
310 int MapCrashExitCodeForHistogram(int exit_code) {
311 #if defined(OS_WIN)
312 // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in
313 // histograms.cc. Solve this by remapping it to a smaller value, which
314 // hopefully doesn't conflict with other codes.
315 if (exit_code == STATUS_GUARD_PAGE_VIOLATION)
316 return 0x1FCF7EC3; // Randomly picked number.
317 #endif
318
319 return std::abs(exit_code);
320 }
321
322 void MarkAppCleanShutdownAndCommit() { 308 void MarkAppCleanShutdownAndCommit() {
323 PrefService* pref = g_browser_process->local_state(); 309 PrefService* pref = g_browser_process->local_state();
324 pref->SetBoolean(prefs::kStabilityExitedCleanly, true); 310 pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
325 pref->SetInteger(prefs::kStabilityExecutionPhase, 311 pref->SetInteger(prefs::kStabilityExecutionPhase,
326 MetricsService::SHUTDOWN_COMPLETE); 312 MetricsService::SHUTDOWN_COMPLETE);
327 // Start writing right away (write happens on a different thread). 313 // Start writing right away (write happens on a different thread).
328 pref->CommitPendingWrite(); 314 pref->CommitPendingWrite();
329 } 315 }
330 316
331 } // namespace 317 } // namespace
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 session_id_(-1), 459 session_id_(-1),
474 next_window_id_(0), 460 next_window_id_(0),
475 self_ptr_factory_(this), 461 self_ptr_factory_(this),
476 state_saver_factory_(this), 462 state_saver_factory_(this),
477 waiting_for_asynchronous_reporting_step_(false), 463 waiting_for_asynchronous_reporting_step_(false),
478 num_async_histogram_fetches_in_progress_(0) { 464 num_async_histogram_fetches_in_progress_(0) {
479 DCHECK(IsSingleThreaded()); 465 DCHECK(IsSingleThreaded());
480 DCHECK(state_manager_); 466 DCHECK(state_manager_);
481 DCHECK(client_); 467 DCHECK(client_);
482 468
483 // TODO(asvitkine): Move this out of MetricsService. 469 // TODO(asvitkine): Move these out of MetricsService.
484 RegisterMetricsProvider( 470 RegisterMetricsProvider(
485 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider)); 471 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider));
472 RegisterMetricsProvider(
473 scoped_ptr<metrics::MetricsProvider>(new ChromeStabilityMetricsProvider));
486 474
487 BrowserChildProcessObserver::Add(this); 475 BrowserChildProcessObserver::Add(this);
488 } 476 }
489 477
490 MetricsService::~MetricsService() { 478 MetricsService::~MetricsService() {
491 DisableRecording(); 479 DisableRecording();
492 480
493 BrowserChildProcessObserver::Remove(this); 481 BrowserChildProcessObserver::Remove(this);
494 } 482 }
495 483
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 const content::NotificationDetails& details) { 633 const content::NotificationDetails& details) {
646 DCHECK(log_manager_.current_log()); 634 DCHECK(log_manager_.current_log());
647 DCHECK(IsSingleThreaded()); 635 DCHECK(IsSingleThreaded());
648 636
649 switch (type) { 637 switch (type) {
650 case chrome::NOTIFICATION_BROWSER_OPENED: 638 case chrome::NOTIFICATION_BROWSER_OPENED:
651 case chrome::NOTIFICATION_BROWSER_CLOSED: 639 case chrome::NOTIFICATION_BROWSER_CLOSED:
652 case chrome::NOTIFICATION_OMNIBOX_OPENED_URL: 640 case chrome::NOTIFICATION_OMNIBOX_OPENED_URL:
653 case chrome::NOTIFICATION_TAB_PARENTED: 641 case chrome::NOTIFICATION_TAB_PARENTED:
654 case chrome::NOTIFICATION_TAB_CLOSING: 642 case chrome::NOTIFICATION_TAB_CLOSING:
643 case content::NOTIFICATION_LOAD_START:
655 case content::NOTIFICATION_LOAD_STOP: 644 case content::NOTIFICATION_LOAD_STOP:
645 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED:
646 case content::NOTIFICATION_RENDER_WIDGET_HOST_HANG:
656 // These notifications are used only to break out of idle mode. 647 // These notifications are used only to break out of idle mode.
657 break; 648 break;
658
659 case content::NOTIFICATION_LOAD_START: {
660 content::NavigationController* controller =
661 content::Source<content::NavigationController>(source).ptr();
662 content::WebContents* web_contents = controller->GetWebContents();
663 LogLoadStarted(web_contents);
664 break;
665 }
666
667 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
668 content::RenderProcessHost::RendererClosedDetails* process_details =
669 content::Details<
670 content::RenderProcessHost::RendererClosedDetails>(
671 details).ptr();
672 content::RenderProcessHost* host =
673 content::Source<content::RenderProcessHost>(source).ptr();
674 LogRendererCrash(
675 host, process_details->status, process_details->exit_code);
676 break;
677 }
678
679 case content::NOTIFICATION_RENDER_WIDGET_HOST_HANG:
680 LogRendererHang();
681 break;
682
683 default: 649 default:
684 NOTREACHED(); 650 NOTREACHED();
685 break; 651 break;
686 } 652 }
687 653
688 HandleIdleSinceLastTransmission(false); 654 HandleIdleSinceLastTransmission(false);
689 } 655 }
690 656
691 void MetricsService::HandleIdleSinceLastTransmission(bool in_idle) { 657 void MetricsService::HandleIdleSinceLastTransmission(bool in_idle) {
692 // If there wasn't a lot of action, maybe the computer was asleep, in which 658 // If there wasn't a lot of action, maybe the computer was asleep, in which
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 pref->SetInteger(path, value + 1); 1624 pref->SetInteger(path, value + 1);
1659 } 1625 }
1660 1626
1661 void MetricsService::IncrementLongPrefsValue(const char* path) { 1627 void MetricsService::IncrementLongPrefsValue(const char* path) {
1662 PrefService* pref = g_browser_process->local_state(); 1628 PrefService* pref = g_browser_process->local_state();
1663 DCHECK(pref); 1629 DCHECK(pref);
1664 int64 value = pref->GetInt64(path); 1630 int64 value = pref->GetInt64(path);
1665 pref->SetInt64(path, value + 1); 1631 pref->SetInt64(path, value + 1);
1666 } 1632 }
1667 1633
1668 void MetricsService::LogLoadStarted(content::WebContents* web_contents) {
1669 content::RecordAction(base::UserMetricsAction("PageLoad"));
1670 HISTOGRAM_ENUMERATION("Chrome.UmaPageloadCounter", 1, 2);
1671 IncrementPrefValue(prefs::kStabilityPageLoadCount);
1672 IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount);
1673 // We need to save the prefs, as page load count is a critical stat, and it
1674 // might be lost due to a crash :-(.
1675 }
1676
1677 void MetricsService::LogRendererCrash(content::RenderProcessHost* host,
1678 base::TerminationStatus status,
1679 int exit_code) {
1680 bool was_extension_process =
1681 extensions::ProcessMap::Get(host->GetBrowserContext())
1682 ->Contains(host->GetID());
1683 if (status == base::TERMINATION_STATUS_PROCESS_CRASHED ||
1684 status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) {
1685 if (was_extension_process) {
1686 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount);
1687
1688 UMA_HISTOGRAM_SPARSE_SLOWLY("CrashExitCodes.Extension",
1689 MapCrashExitCodeForHistogram(exit_code));
1690 } else {
1691 IncrementPrefValue(prefs::kStabilityRendererCrashCount);
1692
1693 UMA_HISTOGRAM_SPARSE_SLOWLY("CrashExitCodes.Renderer",
1694 MapCrashExitCodeForHistogram(exit_code));
1695 }
1696
1697 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes",
1698 was_extension_process ? 2 : 1);
1699 } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) {
1700 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills",
1701 was_extension_process ? 2 : 1);
1702 } else if (status == base::TERMINATION_STATUS_STILL_RUNNING) {
1703 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.DisconnectedAlive",
1704 was_extension_process ? 2 : 1);
1705 }
1706 }
1707
1708 void MetricsService::LogRendererHang() {
1709 IncrementPrefValue(prefs::kStabilityRendererHangCount);
1710 }
1711
1712 bool MetricsService::UmaMetricsProperlyShutdown() { 1634 bool MetricsService::UmaMetricsProperlyShutdown() {
1713 CHECK(clean_shutdown_status_ == CLEANLY_SHUTDOWN || 1635 CHECK(clean_shutdown_status_ == CLEANLY_SHUTDOWN ||
1714 clean_shutdown_status_ == NEED_TO_SHUTDOWN); 1636 clean_shutdown_status_ == NEED_TO_SHUTDOWN);
1715 return clean_shutdown_status_ == CLEANLY_SHUTDOWN; 1637 return clean_shutdown_status_ == CLEANLY_SHUTDOWN;
1716 } 1638 }
1717 1639
1718 void MetricsService::RegisterSyntheticFieldTrial( 1640 void MetricsService::RegisterSyntheticFieldTrial(
1719 const SyntheticTrialGroup& trial) { 1641 const SyntheticTrialGroup& trial) {
1720 for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) { 1642 for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) {
1721 if (synthetic_trial_groups_[i].id.name == trial.id.name) { 1643 if (synthetic_trial_groups_[i].id.name == trial.id.name) {
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1972 if (metrics_service) 1894 if (metrics_service)
1973 metrics_service->AddObserver(observer); 1895 metrics_service->AddObserver(observer);
1974 } 1896 }
1975 1897
1976 void MetricsServiceHelper::RemoveMetricsServiceObserver( 1898 void MetricsServiceHelper::RemoveMetricsServiceObserver(
1977 MetricsServiceObserver* observer) { 1899 MetricsServiceObserver* observer) {
1978 MetricsService* metrics_service = g_browser_process->metrics_service(); 1900 MetricsService* metrics_service = g_browser_process->metrics_service();
1979 if (metrics_service) 1901 if (metrics_service)
1980 metrics_service->RemoveObserver(observer); 1902 metrics_service->RemoveObserver(observer);
1981 } 1903 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698