• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
creation_time()133   const base::TimeTicks& creation_time() const {
134     return creation_time_;
135   }
136 
num_events()137   int num_events() const {
138     return uma_proto_.omnibox_event_size() +
139            uma_proto_.user_action_event_size();
140   }
141 
log_type()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 
uma_proto()152   ChromeUserMetricsExtension* uma_proto() { return &uma_proto_; }
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