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