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