Home | History | Annotate | Download | only in metrics
      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
      3 // found in the LICENSE file.
      4 
      5 // This file defines a set of user experience metrics data recorded by
      6 // the MetricsService.  This is the unit of data that is sent to the server.
      7 
      8 #ifndef CHROME_BROWSER_METRICS_METRICS_LOG_H_
      9 #define CHROME_BROWSER_METRICS_METRICS_LOG_H_
     10 
     11 #include <string>
     12 #include <vector>
     13 
     14 #include "base/basictypes.h"
     15 #include "chrome/browser/metrics/metrics_network_observer.h"
     16 #include "chrome/common/metrics/metrics_log_base.h"
     17 #include "chrome/common/metrics/variations/variations_util.h"
     18 #include "chrome/installer/util/google_update_settings.h"
     19 #include "ui/gfx/size.h"
     20 
     21 #if defined(OS_CHROMEOS)
     22 #include "chrome/browser/metrics/perf_provider_chromeos.h"
     23 #endif
     24 
     25 class MetricsNetworkObserver;
     26 struct OmniboxLog;
     27 class PrefService;
     28 class PrefRegistrySimple;
     29 
     30 namespace base {
     31 class DictionaryValue;
     32 }
     33 
     34 namespace content {
     35 struct WebPluginInfo;
     36 }
     37 
     38 namespace device {
     39 class BluetoothAdapter;
     40 }
     41 
     42 namespace tracked_objects {
     43 struct ProcessDataSnapshot;
     44 }
     45 
     46 namespace chrome_variations {
     47 struct ActiveGroupId;
     48 }
     49 
     50 // This is a small helper struct to pass Google Update metrics in a single
     51 // reference argument to MetricsLog::RecordEnvironment().
     52 struct GoogleUpdateMetrics {
     53     GoogleUpdateMetrics();
     54     ~GoogleUpdateMetrics();
     55 
     56     // Defines whether this is a user-level or system-level install.
     57     bool is_system_install;
     58     // The time at which Google Update last started an automatic update check.
     59     base::Time last_started_au;
     60     // The time at which Google Update last successfully recieved update
     61     // information from Google servers.
     62     base::Time last_checked;
     63     // Details about Google Update's attempts to update itself.
     64     GoogleUpdateSettings::ProductData google_update_data;
     65     // Details about Google Update's attempts to update this product.
     66     GoogleUpdateSettings::ProductData product_data;
     67 };
     68 
     69 class MetricsLog : public MetricsLogBase {
     70  public:
     71   // Creates a new metrics log
     72   // client_id is the identifier for this profile on this installation
     73   // session_id is an integer that's incremented on each application launch
     74   MetricsLog(const std::string& client_id, int session_id);
     75   virtual ~MetricsLog();
     76 
     77   static void RegisterPrefs(PrefRegistrySimple* registry);
     78 
     79   // Get the current version of the application as a string.
     80   static std::string GetVersionString();
     81 
     82   // Use |extension| in all uploaded appversions in addition to the standard
     83   // version string.
     84   static void set_version_extension(const std::string& extension);
     85   static const std::string& version_extension();
     86 
     87   // Records the current operating environment.  Takes the list of installed
     88   // plugins, Google Update statistics, and synthetic trial IDs as parameters
     89   // because those can't be obtained synchronously from the UI thread.
     90   // A synthetic trial is one that is set up dynamically by code in Chrome. For
     91   // example, a pref may be mapped to a synthetic trial such that the group
     92   // is determined by the pref value.
     93   void RecordEnvironment(
     94       const std::vector<content::WebPluginInfo>& plugin_list,
     95       const GoogleUpdateMetrics& google_update_metrics,
     96       const std::vector<chrome_variations::ActiveGroupId>& synthetic_trials);
     97 
     98   // Loads the environment proto that was saved by the last RecordEnvironment()
     99   // call from prefs and clears the pref value. Returns true on success or false
    100   // if there was no saved environment in prefs or it could not be decoded.
    101   bool LoadSavedEnvironmentFromPrefs();
    102 
    103   // Records the input text, available choices, and selected entry when the
    104   // user uses the Omnibox to open a URL.
    105   void RecordOmniboxOpenedURL(const OmniboxLog& log);
    106 
    107   // Records the passed profiled data, which should be a snapshot of the
    108   // browser's profiled performance during startup for a single process.
    109   void RecordProfilerData(
    110       const tracked_objects::ProcessDataSnapshot& process_data,
    111       int process_type);
    112 
    113   // Writes application stability metrics (as part of the profile log). The
    114   // system profile portion of the log must have already been filled in by a
    115   // call to RecordEnvironment() or LoadSavedEnvironmentFromPrefs().
    116   // NOTE: Has the side-effect of clearing the stability prefs..
    117   //
    118   // If |log_type| is INITIAL_LOG, records additional info such as number of
    119   // incomplete shutdowns as well as extra breakpad and debugger stats.
    120   void RecordStabilityMetrics(
    121       base::TimeDelta incremental_uptime,
    122       LogType log_type);
    123 
    124   const base::TimeTicks& creation_time() const {
    125     return creation_time_;
    126   }
    127 
    128  protected:
    129   // Exposed for the sake of mocking in test code.
    130 
    131   // Returns the PrefService from which to log metrics data.
    132   virtual PrefService* GetPrefService();
    133 
    134   // Returns the screen size for the primary monitor.
    135   virtual gfx::Size GetScreenSize() const;
    136 
    137   // Returns the device scale factor for the primary monitor.
    138   virtual float GetScreenDeviceScaleFactor() const;
    139 
    140   // Returns the number of monitors the user is using.
    141   virtual int GetScreenCount() const;
    142 
    143   // Fills |field_trial_ids| with the list of initialized field trials name and
    144   // group ids.
    145   virtual void GetFieldTrialIds(
    146       std::vector<chrome_variations::ActiveGroupId>* field_trial_ids) const;
    147 
    148  private:
    149   FRIEND_TEST_ALL_PREFIXES(MetricsLogTest, ChromeOSStabilityData);
    150 
    151   // Returns true if the environment has already been filled in by a call to
    152   // RecordEnvironment() or LoadSavedEnvironmentFromPrefs().
    153   bool HasEnvironment() const;
    154 
    155   // Returns true if the stability metrics have already been filled in by a
    156   // call to RecordStabilityMetrics().
    157   bool HasStabilityMetrics() const;
    158 
    159   // Within stability group, write plugin crash stats.
    160   void WritePluginStabilityElements(PrefService* pref);
    161 
    162   // Within the stability group, write required attributes.
    163   void WriteRequiredStabilityAttributes(PrefService* pref);
    164 
    165   // Within the stability group, write attributes that need to be updated asap
    166   // and can't be delayed until the user decides to restart chromium.
    167   // Delaying these stats would bias metrics away from happy long lived
    168   // chromium processes (ones that don't crash, and keep on running).
    169   void WriteRealtimeStabilityAttributes(PrefService* pref,
    170                                         base::TimeDelta incremental_uptime);
    171 
    172   // Writes the list of installed plugins.
    173   void WritePluginList(const std::vector<content::WebPluginInfo>& plugin_list);
    174 
    175   // Writes info about the Google Update install that is managing this client.
    176   // This is a no-op if called on a non-Windows platform.
    177   void WriteGoogleUpdateProto(const GoogleUpdateMetrics& google_update_metrics);
    178 
    179   // Sets the Bluetooth Adapter instance used for the WriteBluetoothProto()
    180   // call.
    181   void SetBluetoothAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
    182 
    183   // Writes info about paired Bluetooth devices on this system.
    184   // This is a no-op if called on a non-Chrome OS platform.
    185   void WriteBluetoothProto(metrics::SystemProfileProto::Hardware* hardware);
    186 
    187 #if defined(OS_CHROMEOS)
    188   // Update the number of users logged into a multi-profile session.
    189   // If the number of users change while the log is open, the call invalidates
    190   // the user count value.
    191   void UpdateMultiProfileUserCount();
    192 #endif
    193 
    194   // Observes network state to provide values for SystemProfile::Network.
    195   MetricsNetworkObserver network_observer_;
    196 
    197 #if defined(OS_CHROMEOS)
    198   metrics::PerfProvider perf_provider_;
    199 #endif
    200 
    201   // Bluetooth Adapter instance for collecting information about paired devices.
    202   scoped_refptr<device::BluetoothAdapter> adapter_;
    203 
    204   // The time when the current log was created.
    205   const base::TimeTicks creation_time_;
    206 
    207   DISALLOW_COPY_AND_ASSIGN(MetricsLog);
    208 };
    209 
    210 #endif  // CHROME_BROWSER_METRICS_METRICS_LOG_H_
    211