metrics_log.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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
18class PrefRegistrySimple;
19class PrefService;
20
21namespace base {
22class DictionaryValue;
23class HistogramSamples;
24}
25
26namespace content {
27struct WebPluginInfo;
28}
29
30namespace tracked_objects {
31struct ProcessDataSnapshot;
32}
33
34namespace variations {
35struct ActiveGroupId;
36}
37
38namespace metrics {
39
40class MetricsProvider;
41class MetricsServiceClient;
42
43class 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