1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/metrics/metrics_log.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/perftimer.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/sys_info.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/third_party/nspr/prtime.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete.h"
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/gpu_data_manager.h"
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_version_info.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/logging_chrome.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "webkit/plugins/npapi/webplugininfo.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define OPEN_ELEMENT_FOR_SCOPE(name) ScopedElement scoped_element(this, name)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochextern "C" IMAGE_DOS_HEADER __ImageBase;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMetricsLog::MetricsLog(const std::string& client_id, int session_id)
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : MetricsLogBase(client_id, session_id, MetricsLog::GetVersionString()) {}
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMetricsLog::~MetricsLog() {}
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RegisterPrefs(PrefService* local_state) {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  local_state->RegisterListPref(prefs::kStabilityPluginStats);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint64 MetricsLog::GetIncrementalUptime(PrefService* pref) {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeTicks now = base::TimeTicks::Now();
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static base::TimeTicks last_updated_time(now);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 incremental_time = (now - last_updated_time).InSeconds();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  last_updated_time = now;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (incremental_time > 0) {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int64 metrics_uptime = pref->GetInt64(prefs::kUninstallMetricsUptimeSec);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    metrics_uptime += incremental_time;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref->SetInt64(prefs::kUninstallMetricsUptimeSec, metrics_uptime);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return incremental_time;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string MetricsLog::GetInstallDate() const {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* pref = g_browser_process->local_state();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (pref) {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return pref->GetString(prefs::kMetricsClientIDTimestamp);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return "0";
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string MetricsLog::GetVersionString() {
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chrome::VersionInfo version_info;
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!version_info.is_valid()) {
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NOTREACHED() << "Unable to retrieve version info.";
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return std::string();
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string version = version_info.Version();
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!version_extension_.empty())
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    version += version_extension_;
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!version_info.IsOfficialBuild())
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    version.append("-devel");
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return version;
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickMetricsLog* MetricsLog::AsMetricsLog() {
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return this;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RecordIncrementalStabilityElements() {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!locked_);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* pref = g_browser_process->local_state();
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(pref);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OPEN_ELEMENT_FOR_SCOPE("profile");
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteCommonEventAttributes();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WriteInstallElement();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("stability");  // Minimal set of stability elements.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteRequiredStabilityAttributes(pref);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteRealtimeStabilityAttributes(pref);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WritePluginStabilityElements(pref);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid MetricsLog::WriteStabilityElement(PrefService* pref) {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!locked_);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(pref);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get stability attributes out of Local State, zeroing out stored values.
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: This could lead to some data loss if this report isn't successfully
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //       sent, but that's true for all the metrics.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OPEN_ELEMENT_FOR_SCOPE("stability");
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteRequiredStabilityAttributes(pref);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteRealtimeStabilityAttributes(pref);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(jar): The following are all optional, so we *could* optimize them for
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // values of zero (and not include them).
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("incompleteshutdowncount",
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    pref->GetInteger(
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        prefs::kStabilityIncompleteSessionEndCount));
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pref->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("breakpadregistrationok",
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pref->GetInteger(prefs::kStabilityBreakpadRegistrationSuccess));
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pref->SetInteger(prefs::kStabilityBreakpadRegistrationSuccess, 0);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("breakpadregistrationfail",
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pref->GetInteger(prefs::kStabilityBreakpadRegistrationFail));
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pref->SetInteger(prefs::kStabilityBreakpadRegistrationFail, 0);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("debuggerpresent",
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   pref->GetInteger(prefs::kStabilityDebuggerPresent));
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pref->SetInteger(prefs::kStabilityDebuggerPresent, 0);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("debuggernotpresent",
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   pref->GetInteger(prefs::kStabilityDebuggerNotPresent));
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pref->SetInteger(prefs::kStabilityDebuggerNotPresent, 0);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WritePluginStabilityElements(pref);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WritePluginStabilityElements(PrefService* pref) {
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now log plugin stability info.
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const ListValue* plugin_stats_list = pref->GetList(
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      prefs::kStabilityPluginStats);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (plugin_stats_list) {
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("plugins");
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (ListValue::const_iterator iter = plugin_stats_list->begin();
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         iter != plugin_stats_list->end(); ++iter) {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NOTREACHED();
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        continue;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DictionaryValue* plugin_dict = static_cast<DictionaryValue*>(*iter);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      std::string plugin_name;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      plugin_dict->GetString(prefs::kStabilityPluginName, &plugin_name);
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OPEN_ELEMENT_FOR_SCOPE("pluginstability");
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Use "filename" instead of "name", otherwise we need to update the
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // UMA servers.
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WriteAttribute("filename", CreateBase64Hash(plugin_name));
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int launches = 0;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      plugin_dict->GetInteger(prefs::kStabilityPluginLaunches, &launches);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("launchcount", launches);
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int instances = 0;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      plugin_dict->GetInteger(prefs::kStabilityPluginInstances, &instances);
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("instancecount", instances);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int crashes = 0;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      plugin_dict->GetInteger(prefs::kStabilityPluginCrashes, &crashes);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("crashcount", crashes);
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref->ClearPref(prefs::kStabilityPluginStats);
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) {
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The server refuses data that doesn't have certain values.  crashcount and
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // launchcount are currently "required" in the "stability" group.
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("launchcount",
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    pref->GetInteger(prefs::kStabilityLaunchCount));
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pref->SetInteger(prefs::kStabilityLaunchCount, 0);
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("crashcount",
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    pref->GetInteger(prefs::kStabilityCrashCount));
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pref->SetInteger(prefs::kStabilityCrashCount, 0);
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteRealtimeStabilityAttributes(PrefService* pref) {
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Update the stats which are critical for real-time stability monitoring.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Since these are "optional," only list ones that are non-zero, as the counts
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // are aggergated (summed) server side.
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int count = pref->GetInteger(prefs::kStabilityPageLoadCount);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (count) {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("pageloadcount", count);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref->SetInteger(prefs::kStabilityPageLoadCount, 0);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  count = pref->GetInteger(prefs::kStabilityRendererCrashCount);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (count) {
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("renderercrashcount", count);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref->SetInteger(prefs::kStabilityRendererCrashCount, 0);
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  count = pref->GetInteger(prefs::kStabilityExtensionRendererCrashCount);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (count) {
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("extensionrenderercrashcount", count);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref->SetInteger(prefs::kStabilityExtensionRendererCrashCount, 0);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  count = pref->GetInteger(prefs::kStabilityRendererHangCount);
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (count) {
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("rendererhangcount", count);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref->SetInteger(prefs::kStabilityRendererHangCount, 0);
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  count = pref->GetInteger(prefs::kStabilityChildProcessCrashCount);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (count) {
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("childprocesscrashcount", count);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref->SetInteger(prefs::kStabilityChildProcessCrashCount, 0);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_CHROMEOS)
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  count = pref->GetInteger(prefs::kStabilityOtherUserCrashCount);
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (count) {
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // TODO(kmixter): Write attribute once log server supports it
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // and remove warning log.
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // WriteIntAttribute("otherusercrashcount", count);
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    LOG(WARNING) << "Not yet able to send otherusercrashcount="
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 << count;
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    pref->SetInteger(prefs::kStabilityOtherUserCrashCount, 0);
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  count = pref->GetInteger(prefs::kStabilityKernelCrashCount);
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (count) {
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // TODO(kmixter): Write attribute once log server supports it
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // and remove warning log.
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // WriteIntAttribute("kernelcrashcount", count);
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    LOG(WARNING) << "Not yet able to send kernelcrashcount="
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 << count;
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    pref->SetInteger(prefs::kStabilityKernelCrashCount, 0);
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  count = pref->GetInteger(prefs::kStabilitySystemUncleanShutdownCount);
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (count) {
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // TODO(kmixter): Write attribute once log server supports it
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // and remove warning log.
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // WriteIntAttribute("systemuncleanshutdowns", count);
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    LOG(WARNING) << "Not yet able to send systemuncleanshutdowns="
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 << count;
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    pref->SetInteger(prefs::kStabilitySystemUncleanShutdownCount, 0);
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // OS_CHROMEOS
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 recent_duration = GetIncrementalUptime(pref);
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (recent_duration)
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteInt64Attribute("uptimesec", recent_duration);
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WritePluginList(
27221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::vector<webkit::npapi::WebPluginInfo>& plugin_list) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!locked_);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OPEN_ELEMENT_FOR_SCOPE("plugins");
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (std::vector<webkit::npapi::WebPluginInfo>::const_iterator iter =
27821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen           plugin_list.begin();
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       iter != plugin_list.end(); ++iter) {
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("plugin");
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Plugin name and filename are hashed for the privacy of those
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // testing unreleased new extensions.
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteAttribute("name", CreateBase64Hash(UTF16ToUTF8(iter->name)));
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string filename_bytes =
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_WIN)
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        UTF16ToUTF8(iter->path.BaseName().value());
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        iter->path.BaseName().value();
29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    WriteAttribute("filename", CreateBase64Hash(filename_bytes));
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteAttribute("version", UTF16ToUTF8(iter->version));
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteInstallElement() {
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OPEN_ELEMENT_FOR_SCOPE("install");
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteAttribute("installdate", GetInstallDate());
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("buildid", 0);  // We're using appversion instead.
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RecordEnvironment(
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen         const std::vector<webkit::npapi::WebPluginInfo>& plugin_list,
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         const DictionaryValue* profile_metrics) {
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!locked_);
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* pref = g_browser_process->local_state();
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OPEN_ELEMENT_FOR_SCOPE("profile");
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteCommonEventAttributes();
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteInstallElement();
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WritePluginList(plugin_list);
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WriteStabilityElement(pref);
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("cpu");
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteAttribute("arch", base::SysInfo::CPUArchitecture());
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("memory");
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("mb", base::SysInfo::AmountOfPhysicalMemoryMB());
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("dllbase", reinterpret_cast<int>(&__ImageBase));
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("os");
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteAttribute("name",
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   base::SysInfo::OperatingSystemName());
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteAttribute("version",
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   base::SysInfo::OperatingSystemVersion());
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("gpu");
341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    GpuDataManager* gpu_data_manager = GpuDataManager::GetInstance();
342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (gpu_data_manager) {
343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      WriteIntAttribute("vendorid", gpu_data_manager->gpu_info().vendor_id);
344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      WriteIntAttribute("deviceid", gpu_data_manager->gpu_info().device_id);
345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("display");
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int width = 0;
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int height = 0;
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::SysInfo::GetPrimaryDisplayDimensions(&width, &height);
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("xsize", width);
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("ysize", height);
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("screens", base::SysInfo::DisplayCount());
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("bookmarks");
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int num_bookmarks_on_bookmark_bar =
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        pref->GetInteger(prefs::kNumBookmarksOnBookmarkBar);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int num_folders_on_bookmark_bar =
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        pref->GetInteger(prefs::kNumFoldersOnBookmarkBar);
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int num_bookmarks_in_other_bookmarks_folder =
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        pref->GetInteger(prefs::kNumBookmarksInOtherBookmarkFolder);
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int num_folders_in_other_bookmarks_folder =
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        pref->GetInteger(prefs::kNumFoldersInOtherBookmarkFolder);
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OPEN_ELEMENT_FOR_SCOPE("bookmarklocation");
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteAttribute("name", "full-tree");
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("foldercount",
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          num_folders_on_bookmark_bar + num_folders_in_other_bookmarks_folder);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("itemcount",
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          num_bookmarks_on_bookmark_bar +
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          num_bookmarks_in_other_bookmarks_folder);
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OPEN_ELEMENT_FOR_SCOPE("bookmarklocation");
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteAttribute("name", "toolbar");
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("foldercount", num_folders_on_bookmark_bar);
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("itemcount", num_bookmarks_on_bookmark_bar);
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("keywords");
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("count", pref->GetInteger(prefs::kNumKeywords));
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (profile_metrics)
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteAllProfilesMetrics(*profile_metrics);
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteAllProfilesMetrics(
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const DictionaryValue& all_profiles_metrics) {
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string profile_prefix(prefs::kProfilePrefix);
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (DictionaryValue::key_iterator i = all_profiles_metrics.begin_keys();
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != all_profiles_metrics.end_keys(); ++i) {
3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string& key_name = *i;
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (key_name.compare(0, profile_prefix.size(), profile_prefix) == 0) {
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DictionaryValue* profile;
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (all_profiles_metrics.GetDictionaryWithoutPathExpansion(key_name,
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                                 &profile))
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        WriteProfileMetrics(key_name.substr(profile_prefix.size()), *profile);
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid MetricsLog::WriteProfileMetrics(const std::string& profileidhash,
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     const DictionaryValue& profile_metrics) {
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OPEN_ELEMENT_FOR_SCOPE("userprofile");
4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WriteAttribute("profileidhash", profileidhash);
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (DictionaryValue::key_iterator i = profile_metrics.begin_keys();
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != profile_metrics.end_keys(); ++i) {
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Value* value;
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (profile_metrics.GetWithoutPathExpansion(*i, &value)) {
4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      DCHECK(*i != "id");
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      switch (value->GetType()) {
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        case Value::TYPE_STRING: {
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          std::string string_value;
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          if (value->GetAsString(&string_value)) {
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            OPEN_ELEMENT_FOR_SCOPE("profileparam");
4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            WriteAttribute("name", *i);
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            WriteAttribute("value", string_value);
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          }
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          break;
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        case Value::TYPE_BOOLEAN: {
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          bool bool_value;
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          if (value->GetAsBoolean(&bool_value)) {
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            OPEN_ELEMENT_FOR_SCOPE("profileparam");
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            WriteAttribute("name", *i);
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            WriteIntAttribute("value", bool_value ? 1 : 0);
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          }
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          break;
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        case Value::TYPE_INTEGER: {
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          int int_value;
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          if (value->GetAsInteger(&int_value)) {
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            OPEN_ELEMENT_FOR_SCOPE("profileparam");
4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            WriteAttribute("name", *i);
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            WriteIntAttribute("value", int_value);
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          }
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          break;
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        default:
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          NOTREACHED();
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          break;
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RecordOmniboxOpenedURL(const AutocompleteLog& log) {
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!locked_);
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OPEN_ELEMENT_FOR_SCOPE("uielement");
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteAttribute("action", "autocomplete");
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteAttribute("targetidhash", "");
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(kochi): Properly track windows.
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteIntAttribute("window", 0);
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteCommonEventAttributes();
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OPEN_ELEMENT_FOR_SCOPE("autocomplete");
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("typedlength", static_cast<int>(log.text.length()));
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("selectedindex", static_cast<int>(log.selected_index));
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WriteIntAttribute("completedlength",
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      static_cast<int>(log.inline_autocompleted_length));
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string input_type(
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        AutocompleteInput::TypeToString(log.input_type));
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!input_type.empty())
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteAttribute("inputtype", input_type);
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (AutocompleteResult::const_iterator i(log.result.begin());
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         i != log.result.end(); ++i) {
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OPEN_ELEMENT_FOR_SCOPE("autocompleteitem");
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (i->provider)
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        WriteAttribute("provider", i->provider->name());
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::string result_type(AutocompleteMatch::TypeToString(i->type));
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!result_type.empty())
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        WriteAttribute("resulttype", result_type);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("relevance", i->relevance);
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WriteIntAttribute("isstarred", i->starred ? 1 : 0);
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ++num_events_;
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
494