Home | History | Annotate | Download | only in metrics
      1 // Copyright 2014 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 COMPONENTS_METRICS_METRICS_LOG_H_
      9 #define COMPONENTS_METRICS_METRICS_LOG_H_
     10 
     11 #include <string>
     12 #include <vector>
     13 
     14 #include "base/basictypes.h"
     15 #include "base/time/time.h"
     16 #include "components/metrics/proto/chrome_user_metrics_extension.pb.h"
     17 
     18 class PrefRegistrySimple;
     19 class PrefService;
     20 
     21 namespace base {
     22 class DictionaryValue;
     23 class HistogramSamples;
     24 }
     25 
     26 namespace content {
     27 struct WebPluginInfo;
     28 }
     29 
     30 namespace tracked_objects {
     31 struct ProcessDataSnapshot;
     32 }
     33 
     34 namespace variations {
     35 struct ActiveGroupId;
     36 }
     37 
     38 namespace metrics {
     39 
     40 class MetricsProvider;
     41 class MetricsServiceClient;
     42 
     43 class MetricsLog {
     44  public:
     45   enum LogType {
     46     INITIAL_STABILITY_LOG,  // The initial log containing stability stats.
     47     ONGOING_LOG,            // Subsequent logs in a session.
     48   };
     49 
     50   // Creates a new metrics log of the specified type.
     51   // |client_id| is the identifier for this profile on this installation
     52   // |session_id| is an integer that's incremented on each application launch
     53   // |client| is used to interact with the embedder.
     54   // |local_state| is the PrefService that this instance should use.
     55   // Note: |this| instance does not take ownership of the |client|, but rather
     56   // stores a weak pointer to it. The caller should ensure that the |client| is
     57   // valid for the lifetime of this class.
     58   MetricsLog(const std::string& client_id,
     59              int session_id,
     60              LogType log_type,
     61              MetricsServiceClient* client,
     62              PrefService* local_state);
     63   virtual ~MetricsLog();
     64 
     65   // Registers local state prefs used by this class.
     66   static void RegisterPrefs(PrefRegistrySimple* registry);
     67 
     68   // Computes the MD5 hash of the given string, and returns the first 8 bytes of
     69   // the hash.
     70   static uint64 Hash(const std::string& value);
     71 
     72   // Get the GMT buildtime for the current binary, expressed in seconds since
     73   // January 1, 1970 GMT.
     74   // The value is used to identify when a new build is run, so that previous
     75   // reliability stats, from other builds, can be abandoned.
     76   static int64 GetBuildTime();
     77 
     78   // Convenience function to return the current time at a resolution in seconds.
     79   // This wraps base::TimeTicks, and hence provides an abstract time that is
     80   // always incrementing for use in measuring time durations.
     81   static int64 GetCurrentTime();
     82 
     83   // Records a user-initiated action.
     84   void RecordUserAction(const std::string& key);
     85 
     86   // Record any changes in a given histogram for transmission.
     87   void RecordHistogramDelta(const std::string& histogram_name,
     88                             const base::HistogramSamples& snapshot);
     89 
     90   // Records the current operating environment, including metrics provided by
     91   // the specified set of |metrics_providers|.  Takes the list of installed
     92   // plugins, Google Update statistics, and synthetic trial IDs as parameters
     93   // because those can't be obtained synchronously from the UI thread.
     94   // A synthetic trial is one that is set up dynamically by code in Chrome. For
     95   // example, a pref may be mapped to a synthetic trial such that the group
     96   // is determined by the pref value.
     97   void RecordEnvironment(
     98       const std::vector<MetricsProvider*>& metrics_providers,
     99       const std::vector<variations::ActiveGroupId>& synthetic_trials,
    100       int64 install_date);
    101 
    102   // Loads the environment proto that was saved by the last RecordEnvironment()
    103   // call from prefs and clears the pref value. Returns true on success or false
    104   // if there was no saved environment in prefs or it could not be decoded.
    105   bool LoadSavedEnvironmentFromPrefs();
    106 
    107   // Writes application stability metrics, including stability metrics provided
    108   // by the specified set of |metrics_providers|. The system profile portion of
    109   // the log must have already been filled in by a call to RecordEnvironment()
    110   // or LoadSavedEnvironmentFromPrefs().
    111   // NOTE: Has the side-effect of clearing the stability prefs..
    112   //
    113   // If this log is of type INITIAL_STABILITY_LOG, records additional info such
    114   // as number of incomplete shutdowns as well as extra breakpad and debugger
    115   // stats.
    116   void RecordStabilityMetrics(
    117       const std::vector<MetricsProvider*>& metrics_providers,
    118       base::TimeDelta incremental_uptime,
    119       base::TimeDelta uptime);
    120 
    121   // Records general metrics based on the specified |metrics_providers|.
    122   void RecordGeneralMetrics(
    123       const std::vector<MetricsProvider*>& metrics_providers);
    124 
    125   // Stop writing to this record and generate the encoded representation.
    126   // None of the Record* methods can be called after this is called.
    127   void CloseLog();
    128 
    129   // Fills |encoded_log| with the serialized protobuf representation of the
    130   // record.  Must only be called after CloseLog() has been called.
    131   void GetEncodedLog(std::string* encoded_log);
    132 
    133   const base::TimeTicks& creation_time() const {
    134     return creation_time_;
    135   }
    136 
    137   int num_events() const {
    138     return uma_proto_.omnibox_event_size() +
    139            uma_proto_.user_action_event_size();
    140   }
    141 
    142   LogType log_type() const { return log_type_; }
    143 
    144  protected:
    145   // Exposed for the sake of mocking/accessing in test code.
    146 
    147   // Fills |field_trial_ids| with the list of initialized field trials name and
    148   // group ids.
    149   virtual void GetFieldTrialIds(
    150       std::vector<variations::ActiveGroupId>* field_trial_ids) const;
    151 
    152   ChromeUserMetricsExtension* uma_proto() { return &uma_proto_; }
    153   const ChromeUserMetricsExtension* uma_proto() const {
    154     return &uma_proto_;
    155   }
    156 
    157  private:
    158   // Returns true if the environment has already been filled in by a call to
    159   // RecordEnvironment() or LoadSavedEnvironmentFromPrefs().
    160   bool HasEnvironment() const;
    161 
    162   // Returns true if the stability metrics have already been filled in by a
    163   // call to RecordStabilityMetrics().
    164   bool HasStabilityMetrics() const;
    165 
    166   // Within the stability group, write required attributes.
    167   void WriteRequiredStabilityAttributes(PrefService* pref);
    168 
    169   // Within the stability group, write attributes that need to be updated asap
    170   // and can't be delayed until the user decides to restart chromium.
    171   // Delaying these stats would bias metrics away from happy long lived
    172   // chromium processes (ones that don't crash, and keep on running).
    173   void WriteRealtimeStabilityAttributes(PrefService* pref,
    174                                         base::TimeDelta incremental_uptime,
    175                                         base::TimeDelta uptime);
    176 
    177   // closed_ is true when record has been packed up for sending, and should
    178   // no longer be written to.  It is only used for sanity checking.
    179   bool closed_;
    180 
    181   // The type of the log, i.e. initial or ongoing.
    182   const LogType log_type_;
    183 
    184   // Stores the protocol buffer representation for this log.
    185   ChromeUserMetricsExtension uma_proto_;
    186 
    187   // Used to interact with the embedder. Weak pointer; must outlive |this|
    188   // instance.
    189   MetricsServiceClient* const client_;
    190 
    191   // The time when the current log was created.
    192   const base::TimeTicks creation_time_;
    193 
    194   PrefService* local_state_;
    195 
    196   DISALLOW_COPY_AND_ASSIGN(MetricsLog);
    197 };
    198 
    199 }  // namespace metrics
    200 
    201 #endif  // COMPONENTS_METRICS_METRICS_LOG_H_
    202