chrome_metrics_service_client.h revision 116680a4aac90f2aa7413d9095a592090648e557
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)#ifndef CHROME_BROWSER_METRICS_CHROME_METRICS_SERVICE_CLIENT_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_METRICS_CHROME_METRICS_SERVICE_CLIENT_H_
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/basictypes.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/weak_ptr.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/threading/thread_checker.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/memory_details.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/metrics/network_stats_uploader.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/metrics/tracking_synchronizer_observer.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/metrics/metrics_service_client.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ChromeOSMetricsProvider;
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class GoogleUpdateMetricsProviderWin;
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MetricsService;
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PluginMetricsProvider;
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PrefRegistrySimple;
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ProfilerMetricsProvider;
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace base {
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class FilePath;
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace metrics {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MetricsStateManager;
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// ChromeMetricsServiceClient provides an implementation of MetricsServiceClient
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// that depends on chrome/.
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ChromeMetricsServiceClient
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : public metrics::MetricsServiceClient,
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      public chrome_browser_metrics::TrackingSynchronizerObserver,
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      public content::NotificationObserver {
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~ChromeMetricsServiceClient();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Factory function.
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static scoped_ptr<ChromeMetricsServiceClient> Create(
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      metrics::MetricsStateManager* state_manager,
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PrefService* local_state);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Registers local state prefs used by this class.
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // metrics::MetricsServiceClient:
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetMetricsClientId(const std::string& client_id) OVERRIDE;
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool IsOffTheRecordSessionActive() OVERRIDE;
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual std::string GetApplicationLocale() OVERRIDE;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool GetBrand(std::string* brand_code) OVERRIDE;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual metrics::SystemProfileProto::Channel GetChannel() OVERRIDE;
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual std::string GetVersionString() OVERRIDE;
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnLogUploadComplete() OVERRIDE;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void StartGatheringMetrics(
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const base::Closure& done_callback) OVERRIDE;
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CollectFinalMetrics(const base::Closure& done_callback)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      OVERRIDE;
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual scoped_ptr<metrics::MetricsLogUploader> CreateUploader(
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& server_url,
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& mime_type,
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::Callback<void(int)>& on_upload_complete) OVERRIDE;
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MetricsService* metrics_service() { return metrics_service_.get(); }
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void LogPluginLoadingError(const base::FilePath& plugin_path);
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit ChromeMetricsServiceClient(
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      metrics::MetricsStateManager* state_manager);
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Completes the two-phase initialization of ChromeMetricsServiceClient.
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Initialize();
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Callback that continues the init task by loading plugin information.
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnInitTaskGotHardwareClass();
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Called after the Plugin init task has been completed that continues the
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // init task by launching a task to gather Google Update statistics.
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnInitTaskGotPluginInfo();
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Called after GoogleUpdate init task has been completed that continues the
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // init task by loading profiler data.
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnInitTaskGotGoogleUpdateData();
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TrackingSynchronizerObserver:
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void ReceivedProfilerData(
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const tracked_objects::ProcessDataSnapshot& process_data,
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int process_type) OVERRIDE;
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void FinishedReceivingProfilerData() OVERRIDE;
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Callbacks for various stages of final log info collection. Do not call
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // these directly.
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnMemoryDetailCollectionDone();
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnHistogramSynchronizationDone();
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Records metrics about the switches present on the command line.
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RecordCommandLineMetrics();
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Registers |this| as an observer for notifications which indicate that a
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // user is performing work. This is useful to allow some features to sleep,
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // until the machine becomes active, such as precluding UMA uploads unless
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // there was recent activity.
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RegisterForNotifications();
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // content::NotificationObserver:
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Observe(int type,
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       const content::NotificationSource& source,
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Counts (and removes) the browser crash dump attempt signals left behind by
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // any previous browser processes which generated a crash dump.
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void CountBrowserCrashDumpAttempts();
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // OS_WIN
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ThreadChecker thread_checker_;
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Weak pointer to the MetricsStateManager.
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  metrics::MetricsStateManager* metrics_state_manager_;
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The MetricsService that |this| is a client of.
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<MetricsService> metrics_service_;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::NotificationRegistrar registrar_;
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // On ChromeOS, holds a weak pointer to the ChromeOSMetricsProvider instance
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // that has been registered with MetricsService. On other platforms, is NULL.
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ChromeOSMetricsProvider* chromeos_metrics_provider_;
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NetworkStatsUploader network_stats_uploader_;
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Saved callback received from CollectFinalMetrics().
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure collect_final_metrics_done_callback_;
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Indicates that collect final metrics step is running.
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool waiting_for_collect_final_metrics_step_;
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Number of async histogram fetch requests in progress.
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int num_async_histogram_fetches_in_progress_;
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The ProfilerMetricsProvider instance that was registered with
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // MetricsService. Has the same lifetime as |metrics_service_|.
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ProfilerMetricsProvider* profiler_metrics_provider_;
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_PLUGINS)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The PluginMetricsProvider instance that was registered with
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // MetricsService. Has the same lifetime as |metrics_service_|.
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PluginMetricsProvider* plugin_metrics_provider_;
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN)
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The GoogleUpdateMetricsProviderWin instance that was registered with
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // MetricsService. Has the same lifetime as |metrics_service_|.
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GoogleUpdateMetricsProviderWin* google_update_metrics_provider_;
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Callback that is called when initial metrics gathering is complete.
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::Closure finished_gathering_initial_metrics_callback_;
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The MemoryGrowthTracker instance that tracks memory usage growth in
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // MemoryDetails.
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MemoryGrowthTracker memory_growth_tracker_;
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::WeakPtrFactory<ChromeMetricsServiceClient> weak_ptr_factory_;
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChromeMetricsServiceClient);
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CHROME_BROWSER_METRICS_CHROME_METRICS_SERVICE_CLIENT_H_
178