chrome_metrics_service_client.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/metrics/chrome_metrics_service_client.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <vector>
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/files/file_path.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/metrics/histogram.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/prefs/pref_service.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string16.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/threading/platform_thread.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/browser_process.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/google/google_brand.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/metrics/chrome_stability_metrics_provider.h"
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/metrics/omnibox_metrics_provider.h"
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/browser_otr_state.h"
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/crash_keys.h"
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/pref_names.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/render_messages.h"
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/metrics/gpu/gpu_metrics_provider.h"
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/metrics/metrics_service.h"
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/metrics/net/net_metrics_log_uploader.h"
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/metrics/net/network_metrics_provider.h"
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/metrics/profiler/profiler_metrics_provider.h"
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/metrics/profiler/tracking_synchronizer.h"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/histogram_fetcher.h"
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/notification_service.h"
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/metrics/android_metrics_provider.h"
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/service_process/service_process_control.h"
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/metrics/extensions_metrics_provider.h"
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_PLUGINS)
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/metrics/plugin_metrics_provider.h"
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/metrics/chromeos_metrics_provider.h"
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <windows.h>
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/win/registry.h"
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/metrics/google_update_metrics_provider_win.h"
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_IOS)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/metrics/signin_status_metrics_provider.h"
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This specifies the amount of time to wait for all renderers to send their
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// data.
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kMaxHistogramGatheringWaitDuration = 60000;  // 60 seconds.
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)metrics::SystemProfileProto::Channel AsProtobufChannel(
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    chrome::VersionInfo::Channel channel) {
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (channel) {
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::VersionInfo::CHANNEL_UNKNOWN:
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return metrics::SystemProfileProto::CHANNEL_UNKNOWN;
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::VersionInfo::CHANNEL_CANARY:
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return metrics::SystemProfileProto::CHANNEL_CANARY;
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::VersionInfo::CHANNEL_DEV:
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return metrics::SystemProfileProto::CHANNEL_DEV;
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::VersionInfo::CHANNEL_BETA:
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return metrics::SystemProfileProto::CHANNEL_BETA;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::VersionInfo::CHANNEL_STABLE:
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return metrics::SystemProfileProto::CHANNEL_STABLE;
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NOTREACHED();
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return metrics::SystemProfileProto::CHANNEL_UNKNOWN;
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Handles asynchronous fetching of memory details.
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Will run the provided task after finished.
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MetricsMemoryDetails : public MemoryDetails {
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MetricsMemoryDetails(
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::Closure& callback,
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      MemoryGrowthTracker* memory_growth_tracker)
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : callback_(callback) {
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetMemoryGrowthTracker(memory_growth_tracker);
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnDetailsAvailable() OVERRIDE {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE, callback_);
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~MetricsMemoryDetails() {}
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure callback_;
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MetricsMemoryDetails);
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ChromeMetricsServiceClient::ChromeMetricsServiceClient(
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    metrics::MetricsStateManager* state_manager)
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : metrics_state_manager_(state_manager),
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      chromeos_metrics_provider_(NULL),
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      waiting_for_collect_final_metrics_step_(false),
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      num_async_histogram_fetches_in_progress_(0),
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      weak_ptr_factory_(this) {
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RecordCommandLineMetrics();
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RegisterForNotifications();
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CountBrowserCrashDumpAttempts();
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // defined(OS_WIN)
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ChromeMetricsServiceClient::~ChromeMetricsServiceClient() {
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<ChromeMetricsServiceClient> ChromeMetricsServiceClient::Create(
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    metrics::MetricsStateManager* state_manager,
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrefService* local_state) {
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Perform two-phase initialization so that |client->metrics_service_| only
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // receives pointers to fully constructed objects.
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ChromeMetricsServiceClient> client(
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new ChromeMetricsServiceClient(state_manager));
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  client->Initialize();
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return client.Pass();
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) {
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  registry->RegisterInt64Pref(prefs::kUninstallLastLaunchTimeSec, 0);
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  registry->RegisterInt64Pref(prefs::kUninstallLastObservedRunTimeSec, 0);
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metrics::MetricsService::RegisterPrefs(registry);
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ChromeStabilityMetricsProvider::RegisterPrefs(registry);
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AndroidMetricsProvider::RegisterPrefs(registry);
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_ANDROID)
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_PLUGINS)
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PluginMetricsProvider::RegisterPrefs(registry);
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(ENABLE_PLUGINS)
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeMetricsServiceClient::SetMetricsClientId(
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& client_id) {
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  crash_keys::SetCrashClientIdFromGUID(client_id);
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ChromeMetricsServiceClient::IsOffTheRecordSessionActive() {
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return chrome::IsOffTheRecordSessionActive();
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string ChromeMetricsServiceClient::GetApplicationLocale() {
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return g_browser_process->GetApplicationLocale();
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ChromeMetricsServiceClient::GetBrand(std::string* brand_code) {
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return google_brand::GetBrand(brand_code);
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)metrics::SystemProfileProto::Channel ChromeMetricsServiceClient::GetChannel() {
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return AsProtobufChannel(chrome::VersionInfo::GetChannel());
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string ChromeMetricsServiceClient::GetVersionString() {
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chrome::VersionInfo version_info;
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!version_info.is_valid()) {
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NOTREACHED();
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return std::string();
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string version = version_info.Version();
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(ARCH_CPU_64_BITS)
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  version += "-64";
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // defined(ARCH_CPU_64_BITS)
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!version_info.IsOfficialBuild())
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    version.append("-devel");
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return version;
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::OnLogUploadComplete() {
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Collect network stats after each UMA upload.
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  network_stats_uploader_.CollectAndReportNetworkStats();
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ChromeMetricsServiceClient::StartGatheringMetrics(
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::Closure& done_callback) {
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  finished_gathering_initial_metrics_callback_ = done_callback;
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::Closure got_hardware_class_callback =
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotHardwareClass,
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr());
22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_CHROMEOS)
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos_metrics_provider_->InitTaskGetHardwareClass(
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      got_hardware_class_callback);
22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#else
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  got_hardware_class_callback.Run();
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::CollectFinalMetrics(
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::Closure& done_callback) {
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  collect_final_metrics_done_callback_ = done_callback;
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Begin the multi-step process of collecting memory usage histograms:
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // First spawn a task to collect the memory details; when that task is
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // finished, it will call OnMemoryDetailCollectionDone. That will in turn
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // call HistogramSynchronization to collect histograms from all renderers and
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // then call OnHistogramSynchronizationDone to continue processing.
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!waiting_for_collect_final_metrics_step_);
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  waiting_for_collect_final_metrics_step_ = true;
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_IOS)
2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Record the signin status histogram value.
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  signin_status_metrics_provider_->RecordSigninStatusHistogram();
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure callback =
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&ChromeMetricsServiceClient::OnMemoryDetailCollectionDone,
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr());
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<MetricsMemoryDetails> details(
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new MetricsMemoryDetails(callback, &memory_growth_tracker_));
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  details->StartFetch(MemoryDetails::UPDATE_USER_METRICS);
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Collect WebCore cache information to put into a histogram.
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (content::RenderProcessHost::iterator i(
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          content::RenderProcessHost::AllHostsIterator());
259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       !i.IsAtEnd(); i.Advance()) {
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    i.GetCurrentValue()->Send(new ChromeViewMsg_GetCacheResourceStats());
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<metrics::MetricsLogUploader>
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ChromeMetricsServiceClient::CreateUploader(
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& server_url,
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& mime_type,
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::Callback<void(int)>& on_upload_complete) {
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return scoped_ptr<metrics::MetricsLogUploader>(
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      new metrics::NetMetricsLogUploader(
27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          g_browser_process->system_request_context(), server_url, mime_type,
27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          on_upload_complete));
27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 ChromeMetricsServiceClient::GetRegistryBackupKey() {
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return L"Software\\" PRODUCT_STRING_PATH L"\\StabilityMetrics";
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return base::string16();
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::LogPluginLoadingError(
284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::FilePath& plugin_path) {
285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_PLUGINS)
286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  plugin_metrics_provider_->LogPluginLoadingError(plugin_path);
287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NOTREACHED();
289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(ENABLE_PLUGINS)
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::Initialize() {
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metrics_service_.reset(new metrics::MetricsService(
294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics_state_manager_, this, g_browser_process->local_state()));
295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Register metrics providers.
2976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(
300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          new ExtensionsMetricsProvider(metrics_state_manager_)));
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<metrics::MetricsProvider>(new NetworkMetricsProvider(
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content::BrowserThread::GetBlockingPool())));
305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider));
307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(new ChromeStabilityMetricsProvider));
309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<metrics::MetricsProvider>(new metrics::GPUMetricsProvider()));
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profiler_metrics_provider_ = new metrics::ProfilerMetricsProvider;
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(profiler_metrics_provider_));
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          new AndroidMetricsProvider(g_browser_process->local_state())));
319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_ANDROID)
320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN)
322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  google_update_metrics_provider_ = new GoogleUpdateMetricsProviderWin;
323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(google_update_metrics_provider_));
325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_WIN)
326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_PLUGINS)
328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  plugin_metrics_provider_ =
329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new PluginMetricsProvider(g_browser_process->local_state());
330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(plugin_metrics_provider_));
332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(ENABLE_PLUGINS)
333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_CHROMEOS)
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ChromeOSMetricsProvider* chromeos_metrics_provider =
336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new ChromeOSMetricsProvider;
337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos_metrics_provider_ = chromeos_metrics_provider;
338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(chromeos_metrics_provider));
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_IOS)
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  signin_status_metrics_provider_ =
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      SigninStatusMetricsProvider::CreateInstance();
3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  metrics_service_->RegisterMetricsProvider(
3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      scoped_ptr<metrics::MetricsProvider>(signin_status_metrics_provider_));
3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::OnInitTaskGotHardwareClass() {
351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::Closure got_plugin_info_callback =
352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotPluginInfo,
353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr());
354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_PLUGINS)
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  plugin_metrics_provider_->GetPluginInformation(got_plugin_info_callback);
357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  got_plugin_info_callback.Run();
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(ENABLE_PLUGINS)
360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::OnInitTaskGotPluginInfo() {
363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::Closure got_metrics_callback =
364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotGoogleUpdateData,
365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr());
366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  google_update_metrics_provider_->GetGoogleUpdateData(got_metrics_callback);
369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  got_metrics_callback.Run();
371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::OnInitTaskGotGoogleUpdateData() {
375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Start the next part of the init task: fetching performance data.  This will
376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // call into |FinishedReceivingProfilerData()| when the task completes.
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously(
378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      weak_ptr_factory_.GetWeakPtr());
379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::ReceivedProfilerData(
382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const tracked_objects::ProcessDataSnapshot& process_data,
383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int process_type) {
384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  profiler_metrics_provider_->RecordProfilerData(process_data, process_type);
385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChromeMetricsServiceClient::FinishedReceivingProfilerData() {
388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  finished_gathering_initial_metrics_callback_.Run();
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::OnMemoryDetailCollectionDone() {
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This function should only be called as the callback from an ansynchronous
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // step.
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(waiting_for_collect_final_metrics_step_);
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Create a callback_task for OnHistogramSynchronizationDone.
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure callback = base::Bind(
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      &ChromeMetricsServiceClient::OnHistogramSynchronizationDone,
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      weak_ptr_factory_.GetWeakPtr());
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::TimeDelta timeout =
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kMaxHistogramGatheringWaitDuration);
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_EQ(num_async_histogram_fetches_in_progress_, 0);
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(ENABLE_FULL_PRINTING)
409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  num_async_histogram_fetches_in_progress_ = 1;
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else  // !ENABLE_FULL_PRINTING
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  num_async_histogram_fetches_in_progress_ = 2;
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Run requests to service and content in parallel.
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!ServiceProcessControl::GetInstance()->GetHistograms(callback, timeout)) {
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Assume |num_async_histogram_fetches_in_progress_| is not changed by
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // |GetHistograms()|.
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(num_async_histogram_fetches_in_progress_, 2);
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Assign |num_async_histogram_fetches_in_progress_| above and decrement it
418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // here to make code work even if |GetHistograms()| fired |callback|.
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    --num_async_histogram_fetches_in_progress_;
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // !ENABLE_FULL_PRINTING
422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set up the callback to task to call after we receive histograms from all
424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // child processes. |timeout| specifies how long to wait before absolutely
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // calling us back on the task.
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::FetchHistogramsAsynchronously(base::MessageLoop::current(), callback,
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         timeout);
428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::OnHistogramSynchronizationDone() {
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This function should only be called as the callback from an ansynchronous
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // step.
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(waiting_for_collect_final_metrics_step_);
436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_GT(num_async_histogram_fetches_in_progress_, 0);
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Check if all expected requests finished.
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (--num_async_histogram_fetches_in_progress_ > 0)
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  waiting_for_collect_final_metrics_step_ = false;
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  collect_final_metrics_done_callback_.Run();
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::RecordCommandLineMetrics() {
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Get stats on use of command line.
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const CommandLine* command_line(CommandLine::ForCurrentProcess());
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t common_commands = 0;
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (command_line->HasSwitch(switches::kUserDataDir)) {
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ++common_commands;
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100("Chrome.CommandLineDatDirCount", 1);
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (command_line->HasSwitch(switches::kApp)) {
456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ++common_commands;
457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100("Chrome.CommandLineAppModeCount", 1);
458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(rohitrao): Should these be logged on iOS as well?
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // http://crbug.com/375794
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t switch_count = command_line->GetSwitches().size();
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS_100("Chrome.CommandLineFlagCount", switch_count);
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS_100("Chrome.CommandLineUncommonFlagCount",
465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           switch_count - common_commands);
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::RegisterForNotifications() {
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_BROWSER_OPENED,
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllBrowserContextsAndSources());
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_BROWSER_CLOSED,
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_TAB_PARENTED,
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_TAB_CLOSING,
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_LOAD_START,
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_LOAD_STOP,
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_HOST_HANG,
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_OMNIBOX_OPENED_URL,
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 content::NotificationService::AllSources());
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::Observe(
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int type,
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const content::NotificationSource& source,
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const content::NotificationDetails& details) {
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type) {
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::NOTIFICATION_BROWSER_OPENED:
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::NOTIFICATION_BROWSER_CLOSED:
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::NOTIFICATION_OMNIBOX_OPENED_URL:
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::NOTIFICATION_TAB_PARENTED:
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case chrome::NOTIFICATION_TAB_CLOSING:
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case content::NOTIFICATION_LOAD_STOP:
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case content::NOTIFICATION_LOAD_START:
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case content::NOTIFICATION_RENDERER_PROCESS_CLOSED:
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case content::NOTIFICATION_RENDER_WIDGET_HOST_HANG:
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      metrics_service_->OnApplicationNotIdle();
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeMetricsServiceClient::CountBrowserCrashDumpAttempts() {
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Open the registry key for iteration.
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::win::RegKey regkey;
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (regkey.Open(HKEY_CURRENT_USER,
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  chrome::kBrowserCrashDumpAttemptsRegistryPath,
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  KEY_ALL_ACCESS) != ERROR_SUCCESS) {
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The values we're interested in counting are all prefixed with the version.
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::string16 chrome_version(base::ASCIIToUTF16(chrome::kChromeVersion));
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Track a list of values to delete. We don't modify the registry key while
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // we're iterating over its values.
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef std::vector<base::string16> StringVector;
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  StringVector to_delete;
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Iterate over the values in the key counting dumps with and without crashes.
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We directly walk the values instead of using RegistryValueIterator in order
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to read all of the values as DWORDS instead of strings.
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::string16 name;
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DWORD value = 0;
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int dumps_with_crash = 0;
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int dumps_with_no_crash = 0;
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (int i = regkey.GetValueCount() - 1; i >= 0; --i) {
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (regkey.GetValueNameAt(i, &name) == ERROR_SUCCESS &&
540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        StartsWith(name, chrome_version, false) &&
541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        regkey.ReadValueDW(name.c_str(), &value) == ERROR_SUCCESS) {
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      to_delete.push_back(name);
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (value == 0)
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ++dumps_with_no_crash;
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      else
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ++dumps_with_crash;
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Delete the registry keys we've just counted.
551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (StringVector::iterator i = to_delete.begin(); i != to_delete.end(); ++i)
552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    regkey.DeleteValue(i->c_str());
553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Capture the histogram samples.
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (dumps_with_crash != 0)
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithCrash", dumps_with_crash);
557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (dumps_with_no_crash != 0)
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithNoCrash", dumps_with_no_crash);
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int total_dumps = dumps_with_crash + dumps_with_no_crash;
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (total_dumps != 0)
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS("Chrome.BrowserCrashDumpAttempts", total_dumps);
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // defined(OS_WIN)
564