1// Copyright (c) 2010 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#pragma once
11
12#include "base/basictypes.h"
13#include "chrome/common/metrics_helpers.h"
14#include "content/common/page_transition_types.h"
15
16struct AutocompleteLog;
17class DictionaryValue;
18class GURL;
19class PrefService;
20
21namespace webkit {
22namespace npapi {
23struct WebPluginInfo;
24}
25}
26
27class MetricsLog : public MetricsLogBase {
28 public:
29  // Creates a new metrics log
30  // client_id is the identifier for this profile on this installation
31  // session_id is an integer that's incremented on each application launch
32  MetricsLog(const std::string& client_id, int session_id);
33  virtual ~MetricsLog();
34
35  static void RegisterPrefs(PrefService* prefs);
36
37  // Records the current operating environment.  Takes the list of installed
38  // plugins as a parameter because that can't be obtained synchronously
39  // from the UI thread.
40  // profile_metrics, if non-null, gives a dictionary of all profile metrics
41  // that are to be recorded. Each value in profile_metrics should be a
42  // dictionary giving the metrics for the profile.
43  void RecordEnvironment(
44      const std::vector<webkit::npapi::WebPluginInfo>& plugin_list,
45      const DictionaryValue* profile_metrics);
46
47  // Records the input text, available choices, and selected entry when the
48  // user uses the Omnibox to open a URL.
49  void RecordOmniboxOpenedURL(const AutocompleteLog& log);
50
51  // Record recent delta for critical stability metrics.  We can't wait for a
52  // restart to gather these, as that delay biases our observation away from
53  // users that run happily for a looooong time.  We send increments with each
54  // uma log upload, just as we send histogram data.
55  void RecordIncrementalStabilityElements();
56
57  // Get the amount of uptime in seconds since this function was last called.
58  // This updates the cumulative uptime metric for uninstall as a side effect.
59  static int64 GetIncrementalUptime(PrefService* pref);
60
61  // Get the current version of the application as a string.
62  static std::string GetVersionString();
63
64  virtual MetricsLog* AsMetricsLog();
65
66 private:
67  FRIEND_TEST_ALL_PREFIXES(MetricsLogTest, ChromeOSStabilityData);
68
69  // Returns the date at which the current metrics client ID was created as
70  // a string containing milliseconds since the epoch, or "0" if none was found.
71  std::string GetInstallDate() const;
72
73
74  // Writes application stability metrics (as part of the profile log).
75  // NOTE: Has the side-effect of clearing those counts.
76  void WriteStabilityElement(PrefService* pref);
77
78  // Within stability group, write plugin crash stats.
79  void WritePluginStabilityElements(PrefService* pref);
80
81  // Within the stability group, write required attributes.
82  void WriteRequiredStabilityAttributes(PrefService* pref);
83
84  // Within the stability group, write attributes that need to be updated asap
85  // and can't be delayed until the user decides to restart chromium.
86  // Delaying these stats would bias metrics away from happy long lived
87  // chromium processes (ones that don't crash, and keep on running).
88  void WriteRealtimeStabilityAttributes(PrefService* pref);
89
90  // Writes the list of installed plugins.
91  void WritePluginList(
92      const std::vector<webkit::npapi::WebPluginInfo>& plugin_list);
93
94  // Within the profile group, write basic install info including appversion.
95  void WriteInstallElement();
96
97  // Writes all profile metrics. This invokes WriteProfileMetrics for each key
98  // in all_profiles_metrics that starts with kProfilePrefix.
99  void WriteAllProfilesMetrics(const DictionaryValue& all_profiles_metrics);
100
101  // Writes metrics for the profile identified by key. This writes all
102  // key/value pairs in profile_metrics.
103  void WriteProfileMetrics(const std::string& key,
104                           const DictionaryValue& profile_metrics);
105
106  DISALLOW_COPY_AND_ASSIGN(MetricsLog);
107};
108
109#endif  // CHROME_BROWSER_METRICS_METRICS_LOG_H_
110