| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/metrics/metrics_log.h" | 5 #include "chrome/browser/metrics/metrics_log.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/base64.h" | 11 #include "base/base64.h" |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/cpu.h" | 14 #include "base/cpu.h" |
| 15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
| 16 #include "base/prefs/pref_registry_simple.h" | 16 #include "base/prefs/pref_registry_simple.h" |
| 17 #include "base/prefs/pref_service.h" | 17 #include "base/prefs/pref_service.h" |
| 18 #include "base/profiler/alternate_timer.h" | 18 #include "base/profiler/alternate_timer.h" |
| 19 #include "base/sha1.h" | 19 #include "base/sha1.h" |
| 20 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
| 21 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
| 22 #include "base/strings/utf_string_conversions.h" | 22 #include "base/strings/utf_string_conversions.h" |
| 23 #include "base/sys_info.h" | 23 #include "base/sys_info.h" |
| 24 #include "base/third_party/nspr/prtime.h" | 24 #include "base/third_party/nspr/prtime.h" |
| 25 #include "base/time/time.h" | 25 #include "base/time/time.h" |
| 26 #include "base/tracked_objects.h" | 26 #include "base/tracked_objects.h" |
| 27 #include "chrome/browser/browser_process.h" | 27 #include "chrome/browser/browser_process.h" |
| 28 #include "chrome/browser/metrics/extension_metrics.h" | 28 #include "chrome/browser/metrics/extension_metrics.h" |
| 29 #include "chrome/browser/plugins/plugin_prefs.h" | |
| 30 #include "chrome/browser/profiles/profile_manager.h" | |
| 31 #include "chrome/common/pref_names.h" | 29 #include "chrome/common/pref_names.h" |
| 32 #include "components/metrics/metrics_provider.h" | 30 #include "components/metrics/metrics_provider.h" |
| 33 #include "components/metrics/metrics_service_client.h" | 31 #include "components/metrics/metrics_service_client.h" |
| 34 #include "components/metrics/proto/profiler_event.pb.h" | 32 #include "components/metrics/proto/profiler_event.pb.h" |
| 35 #include "components/metrics/proto/system_profile.pb.h" | 33 #include "components/metrics/proto/system_profile.pb.h" |
| 36 #include "components/nacl/common/nacl_process_type.h" | 34 #include "components/nacl/common/nacl_process_type.h" |
| 37 #include "components/variations/active_field_trials.h" | 35 #include "components/variations/active_field_trials.h" |
| 38 #include "content/public/browser/gpu_data_manager.h" | 36 #include "content/public/browser/gpu_data_manager.h" |
| 39 #include "content/public/common/content_client.h" | 37 #include "content/public/common/content_client.h" |
| 40 #include "content/public/common/webplugininfo.h" | |
| 41 #include "gpu/config/gpu_info.h" | 38 #include "gpu/config/gpu_info.h" |
| 42 #include "ui/gfx/screen.h" | 39 #include "ui/gfx/screen.h" |
| 43 #include "url/gurl.h" | 40 #include "url/gurl.h" |
| 44 | 41 |
| 45 #if defined(OS_ANDROID) | 42 #if defined(OS_ANDROID) |
| 46 #include "base/android/build_info.h" | 43 #include "base/android/build_info.h" |
| 47 #endif | 44 #endif |
| 48 | 45 |
| 49 #if defined(OS_WIN) | 46 #if defined(OS_WIN) |
| 50 #include "base/win/metro.h" | 47 #include "base/win/metro.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 return ProfilerEventProto::TrackedObject::UNKNOWN; | 106 return ProfilerEventProto::TrackedObject::UNKNOWN; |
| 110 } | 107 } |
| 111 } | 108 } |
| 112 | 109 |
| 113 // Computes a SHA-1 hash of |data| and returns it as a hex string. | 110 // Computes a SHA-1 hash of |data| and returns it as a hex string. |
| 114 std::string ComputeSHA1(const std::string& data) { | 111 std::string ComputeSHA1(const std::string& data) { |
| 115 const std::string sha1 = base::SHA1HashString(data); | 112 const std::string sha1 = base::SHA1HashString(data); |
| 116 return base::HexEncode(sha1.data(), sha1.size()); | 113 return base::HexEncode(sha1.data(), sha1.size()); |
| 117 } | 114 } |
| 118 | 115 |
| 119 #if defined(ENABLE_PLUGINS) | |
| 120 // Returns the plugin preferences corresponding for this user, if available. | |
| 121 // If multiple user profiles are loaded, returns the preferences corresponding | |
| 122 // to an arbitrary one of the profiles. | |
| 123 PluginPrefs* GetPluginPrefs() { | |
| 124 ProfileManager* profile_manager = g_browser_process->profile_manager(); | |
| 125 | |
| 126 if (!profile_manager) { | |
| 127 // The profile manager can be NULL when testing. | |
| 128 return NULL; | |
| 129 } | |
| 130 | |
| 131 std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles(); | |
| 132 if (profiles.empty()) | |
| 133 return NULL; | |
| 134 | |
| 135 return PluginPrefs::GetForProfile(profiles.front()).get(); | |
| 136 } | |
| 137 | |
| 138 // Fills |plugin| with the info contained in |plugin_info| and |plugin_prefs|. | |
| 139 void SetPluginInfo(const content::WebPluginInfo& plugin_info, | |
| 140 const PluginPrefs* plugin_prefs, | |
| 141 SystemProfileProto::Plugin* plugin) { | |
| 142 plugin->set_name(base::UTF16ToUTF8(plugin_info.name)); | |
| 143 plugin->set_filename(plugin_info.path.BaseName().AsUTF8Unsafe()); | |
| 144 plugin->set_version(base::UTF16ToUTF8(plugin_info.version)); | |
| 145 plugin->set_is_pepper(plugin_info.is_pepper_plugin()); | |
| 146 if (plugin_prefs) | |
| 147 plugin->set_is_disabled(!plugin_prefs->IsPluginEnabled(plugin_info)); | |
| 148 } | |
| 149 #endif // defined(ENABLE_PLUGINS) | |
| 150 | |
| 151 void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids, | 116 void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids, |
| 152 SystemProfileProto* system_profile) { | 117 SystemProfileProto* system_profile) { |
| 153 for (std::vector<ActiveGroupId>::const_iterator it = | 118 for (std::vector<ActiveGroupId>::const_iterator it = |
| 154 field_trial_ids.begin(); it != field_trial_ids.end(); ++it) { | 119 field_trial_ids.begin(); it != field_trial_ids.end(); ++it) { |
| 155 SystemProfileProto::FieldTrial* field_trial = | 120 SystemProfileProto::FieldTrial* field_trial = |
| 156 system_profile->add_field_trial(); | 121 system_profile->add_field_trial(); |
| 157 field_trial->set_name_id(it->name); | 122 field_trial->set_name_id(it->name); |
| 158 field_trial->set_group_id(it->group); | 123 field_trial->set_group_id(it->group); |
| 159 } | 124 } |
| 160 } | 125 } |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 extension_metrics_(uma_proto()->client_id()) { | 238 extension_metrics_(uma_proto()->client_id()) { |
| 274 uma_proto()->mutable_system_profile()->set_channel(client_->GetChannel()); | 239 uma_proto()->mutable_system_profile()->set_channel(client_->GetChannel()); |
| 275 | 240 |
| 276 #if defined(OS_CHROMEOS) | 241 #if defined(OS_CHROMEOS) |
| 277 metrics_log_chromeos_.reset(new MetricsLogChromeOS(uma_proto())); | 242 metrics_log_chromeos_.reset(new MetricsLogChromeOS(uma_proto())); |
| 278 #endif // OS_CHROMEOS | 243 #endif // OS_CHROMEOS |
| 279 } | 244 } |
| 280 | 245 |
| 281 MetricsLog::~MetricsLog() {} | 246 MetricsLog::~MetricsLog() {} |
| 282 | 247 |
| 283 // static | |
| 284 void MetricsLog::RegisterPrefs(PrefRegistrySimple* registry) { | |
| 285 registry->RegisterListPref(prefs::kStabilityPluginStats); | |
| 286 } | |
| 287 | |
| 288 void MetricsLog::RecordStabilityMetrics( | 248 void MetricsLog::RecordStabilityMetrics( |
| 289 const std::vector<metrics::MetricsProvider*>& metrics_providers, | 249 const std::vector<metrics::MetricsProvider*>& metrics_providers, |
| 290 base::TimeDelta incremental_uptime, | 250 base::TimeDelta incremental_uptime, |
| 291 base::TimeDelta uptime) { | 251 base::TimeDelta uptime) { |
| 292 DCHECK(!locked()); | 252 DCHECK(!locked()); |
| 293 DCHECK(HasEnvironment()); | 253 DCHECK(HasEnvironment()); |
| 294 DCHECK(!HasStabilityMetrics()); | 254 DCHECK(!HasStabilityMetrics()); |
| 295 | 255 |
| 296 PrefService* pref = GetPrefService(); | 256 PrefService* pref = GetPrefService(); |
| 297 DCHECK(pref); | 257 DCHECK(pref); |
| 298 | 258 |
| 299 // Get stability attributes out of Local State, zeroing out stored values. | 259 // Get stability attributes out of Local State, zeroing out stored values. |
| 300 // NOTE: This could lead to some data loss if this report isn't successfully | 260 // NOTE: This could lead to some data loss if this report isn't successfully |
| 301 // sent, but that's true for all the metrics. | 261 // sent, but that's true for all the metrics. |
| 302 | 262 |
| 303 WriteRequiredStabilityAttributes(pref); | 263 WriteRequiredStabilityAttributes(pref); |
| 304 WritePluginStabilityElements(pref); | |
| 305 | 264 |
| 306 // Record recent delta for critical stability metrics. We can't wait for a | 265 // Record recent delta for critical stability metrics. We can't wait for a |
| 307 // restart to gather these, as that delay biases our observation away from | 266 // restart to gather these, as that delay biases our observation away from |
| 308 // users that run happily for a looooong time. We send increments with each | 267 // users that run happily for a looooong time. We send increments with each |
| 309 // uma log upload, just as we send histogram data. | 268 // uma log upload, just as we send histogram data. |
| 310 WriteRealtimeStabilityAttributes(pref, incremental_uptime, uptime); | 269 WriteRealtimeStabilityAttributes(pref, incremental_uptime, uptime); |
| 311 | 270 |
| 312 SystemProfileProto::Stability* stability = | 271 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); |
| 313 uma_proto()->mutable_system_profile()->mutable_stability(); | |
| 314 for (size_t i = 0; i < metrics_providers.size(); ++i) | 272 for (size_t i = 0; i < metrics_providers.size(); ++i) |
| 315 metrics_providers[i]->ProvideStabilityMetrics(stability); | 273 metrics_providers[i]->ProvideStabilityMetrics(system_profile); |
| 316 | 274 |
| 317 // Omit some stats unless this is the initial stability log. | 275 // Omit some stats unless this is the initial stability log. |
| 318 if (log_type() != INITIAL_STABILITY_LOG) | 276 if (log_type() != INITIAL_STABILITY_LOG) |
| 319 return; | 277 return; |
| 320 | 278 |
| 321 int incomplete_shutdown_count = | 279 int incomplete_shutdown_count = |
| 322 pref->GetInteger(prefs::kStabilityIncompleteSessionEndCount); | 280 pref->GetInteger(prefs::kStabilityIncompleteSessionEndCount); |
| 323 pref->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); | 281 pref->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); |
| 324 int breakpad_registration_success_count = | 282 int breakpad_registration_success_count = |
| 325 pref->GetInteger(prefs::kStabilityBreakpadRegistrationSuccess); | 283 pref->GetInteger(prefs::kStabilityBreakpadRegistrationSuccess); |
| 326 pref->SetInteger(prefs::kStabilityBreakpadRegistrationSuccess, 0); | 284 pref->SetInteger(prefs::kStabilityBreakpadRegistrationSuccess, 0); |
| 327 int breakpad_registration_failure_count = | 285 int breakpad_registration_failure_count = |
| 328 pref->GetInteger(prefs::kStabilityBreakpadRegistrationFail); | 286 pref->GetInteger(prefs::kStabilityBreakpadRegistrationFail); |
| 329 pref->SetInteger(prefs::kStabilityBreakpadRegistrationFail, 0); | 287 pref->SetInteger(prefs::kStabilityBreakpadRegistrationFail, 0); |
| 330 int debugger_present_count = | 288 int debugger_present_count = |
| 331 pref->GetInteger(prefs::kStabilityDebuggerPresent); | 289 pref->GetInteger(prefs::kStabilityDebuggerPresent); |
| 332 pref->SetInteger(prefs::kStabilityDebuggerPresent, 0); | 290 pref->SetInteger(prefs::kStabilityDebuggerPresent, 0); |
| 333 int debugger_not_present_count = | 291 int debugger_not_present_count = |
| 334 pref->GetInteger(prefs::kStabilityDebuggerNotPresent); | 292 pref->GetInteger(prefs::kStabilityDebuggerNotPresent); |
| 335 pref->SetInteger(prefs::kStabilityDebuggerNotPresent, 0); | 293 pref->SetInteger(prefs::kStabilityDebuggerNotPresent, 0); |
| 336 | 294 |
| 337 // TODO(jar): The following are all optional, so we *could* optimize them for | 295 // TODO(jar): The following are all optional, so we *could* optimize them for |
| 338 // values of zero (and not include them). | 296 // values of zero (and not include them). |
| 297 SystemProfileProto::Stability* stability = |
| 298 system_profile->mutable_stability(); |
| 339 stability->set_incomplete_shutdown_count(incomplete_shutdown_count); | 299 stability->set_incomplete_shutdown_count(incomplete_shutdown_count); |
| 340 stability->set_breakpad_registration_success_count( | 300 stability->set_breakpad_registration_success_count( |
| 341 breakpad_registration_success_count); | 301 breakpad_registration_success_count); |
| 342 stability->set_breakpad_registration_failure_count( | 302 stability->set_breakpad_registration_failure_count( |
| 343 breakpad_registration_failure_count); | 303 breakpad_registration_failure_count); |
| 344 stability->set_debugger_present_count(debugger_present_count); | 304 stability->set_debugger_present_count(debugger_present_count); |
| 345 stability->set_debugger_not_present_count(debugger_not_present_count); | 305 stability->set_debugger_not_present_count(debugger_not_present_count); |
| 346 } | 306 } |
| 347 | 307 |
| 348 void MetricsLog::RecordGeneralMetrics( | 308 void MetricsLog::RecordGeneralMetrics( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 375 } | 335 } |
| 376 | 336 |
| 377 bool MetricsLog::HasEnvironment() const { | 337 bool MetricsLog::HasEnvironment() const { |
| 378 return uma_proto()->system_profile().has_uma_enabled_date(); | 338 return uma_proto()->system_profile().has_uma_enabled_date(); |
| 379 } | 339 } |
| 380 | 340 |
| 381 bool MetricsLog::HasStabilityMetrics() const { | 341 bool MetricsLog::HasStabilityMetrics() const { |
| 382 return uma_proto()->system_profile().stability().has_launch_count(); | 342 return uma_proto()->system_profile().stability().has_launch_count(); |
| 383 } | 343 } |
| 384 | 344 |
| 385 void MetricsLog::WritePluginStabilityElements(PrefService* pref) { | |
| 386 // Now log plugin stability info. | |
| 387 const base::ListValue* plugin_stats_list = pref->GetList( | |
| 388 prefs::kStabilityPluginStats); | |
| 389 if (!plugin_stats_list) | |
| 390 return; | |
| 391 | |
| 392 #if defined(ENABLE_PLUGINS) | |
| 393 SystemProfileProto::Stability* stability = | |
| 394 uma_proto()->mutable_system_profile()->mutable_stability(); | |
| 395 for (base::ListValue::const_iterator iter = plugin_stats_list->begin(); | |
| 396 iter != plugin_stats_list->end(); ++iter) { | |
| 397 if (!(*iter)->IsType(base::Value::TYPE_DICTIONARY)) { | |
| 398 NOTREACHED(); | |
| 399 continue; | |
| 400 } | |
| 401 base::DictionaryValue* plugin_dict = | |
| 402 static_cast<base::DictionaryValue*>(*iter); | |
| 403 | |
| 404 // Note that this search is potentially a quadratic operation, but given the | |
| 405 // low number of plugins installed on a "reasonable" setup, this should be | |
| 406 // fine. | |
| 407 // TODO(isherman): Verify that this does not show up as a hotspot in | |
| 408 // profiler runs. | |
| 409 const SystemProfileProto::Plugin* system_profile_plugin = NULL; | |
| 410 std::string plugin_name; | |
| 411 plugin_dict->GetString(prefs::kStabilityPluginName, &plugin_name); | |
| 412 const SystemProfileProto& system_profile = uma_proto()->system_profile(); | |
| 413 for (int i = 0; i < system_profile.plugin_size(); ++i) { | |
| 414 if (system_profile.plugin(i).name() == plugin_name) { | |
| 415 system_profile_plugin = &system_profile.plugin(i); | |
| 416 break; | |
| 417 } | |
| 418 } | |
| 419 | |
| 420 if (!system_profile_plugin) { | |
| 421 NOTREACHED(); | |
| 422 continue; | |
| 423 } | |
| 424 | |
| 425 SystemProfileProto::Stability::PluginStability* plugin_stability = | |
| 426 stability->add_plugin_stability(); | |
| 427 *plugin_stability->mutable_plugin() = *system_profile_plugin; | |
| 428 | |
| 429 int launches = 0; | |
| 430 plugin_dict->GetInteger(prefs::kStabilityPluginLaunches, &launches); | |
| 431 if (launches > 0) | |
| 432 plugin_stability->set_launch_count(launches); | |
| 433 | |
| 434 int instances = 0; | |
| 435 plugin_dict->GetInteger(prefs::kStabilityPluginInstances, &instances); | |
| 436 if (instances > 0) | |
| 437 plugin_stability->set_instance_count(instances); | |
| 438 | |
| 439 int crashes = 0; | |
| 440 plugin_dict->GetInteger(prefs::kStabilityPluginCrashes, &crashes); | |
| 441 if (crashes > 0) | |
| 442 plugin_stability->set_crash_count(crashes); | |
| 443 | |
| 444 int loading_errors = 0; | |
| 445 plugin_dict->GetInteger(prefs::kStabilityPluginLoadingErrors, | |
| 446 &loading_errors); | |
| 447 if (loading_errors > 0) | |
| 448 plugin_stability->set_loading_error_count(loading_errors); | |
| 449 } | |
| 450 #endif // defined(ENABLE_PLUGINS) | |
| 451 | |
| 452 pref->ClearPref(prefs::kStabilityPluginStats); | |
| 453 } | |
| 454 | |
| 455 // The server refuses data that doesn't have certain values. crashcount and | 345 // The server refuses data that doesn't have certain values. crashcount and |
| 456 // launchcount are currently "required" in the "stability" group. | 346 // launchcount are currently "required" in the "stability" group. |
| 457 // TODO(isherman): Stop writing these attributes specially once the migration to | 347 // TODO(isherman): Stop writing these attributes specially once the migration to |
| 458 // protobufs is complete. | 348 // protobufs is complete. |
| 459 void MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) { | 349 void MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) { |
| 460 int launch_count = pref->GetInteger(prefs::kStabilityLaunchCount); | 350 int launch_count = pref->GetInteger(prefs::kStabilityLaunchCount); |
| 461 pref->SetInteger(prefs::kStabilityLaunchCount, 0); | 351 pref->SetInteger(prefs::kStabilityLaunchCount, 0); |
| 462 int crash_count = pref->GetInteger(prefs::kStabilityCrashCount); | 352 int crash_count = pref->GetInteger(prefs::kStabilityCrashCount); |
| 463 pref->SetInteger(prefs::kStabilityCrashCount, 0); | 353 pref->SetInteger(prefs::kStabilityCrashCount, 0); |
| 464 | 354 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 490 #endif // OS_CHROMEOS | 380 #endif // OS_CHROMEOS |
| 491 | 381 |
| 492 const uint64 incremental_uptime_sec = incremental_uptime.InSeconds(); | 382 const uint64 incremental_uptime_sec = incremental_uptime.InSeconds(); |
| 493 if (incremental_uptime_sec) | 383 if (incremental_uptime_sec) |
| 494 stability->set_incremental_uptime_sec(incremental_uptime_sec); | 384 stability->set_incremental_uptime_sec(incremental_uptime_sec); |
| 495 const uint64 uptime_sec = uptime.InSeconds(); | 385 const uint64 uptime_sec = uptime.InSeconds(); |
| 496 if (uptime_sec) | 386 if (uptime_sec) |
| 497 stability->set_uptime_sec(uptime_sec); | 387 stability->set_uptime_sec(uptime_sec); |
| 498 } | 388 } |
| 499 | 389 |
| 500 void MetricsLog::WritePluginList( | |
| 501 const std::vector<content::WebPluginInfo>& plugin_list) { | |
| 502 DCHECK(!locked()); | |
| 503 | |
| 504 #if defined(ENABLE_PLUGINS) | |
| 505 PluginPrefs* plugin_prefs = GetPluginPrefs(); | |
| 506 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); | |
| 507 for (std::vector<content::WebPluginInfo>::const_iterator iter = | |
| 508 plugin_list.begin(); | |
| 509 iter != plugin_list.end(); ++iter) { | |
| 510 SystemProfileProto::Plugin* plugin = system_profile->add_plugin(); | |
| 511 SetPluginInfo(*iter, plugin_prefs, plugin); | |
| 512 } | |
| 513 #endif // defined(ENABLE_PLUGINS) | |
| 514 } | |
| 515 | |
| 516 void MetricsLog::RecordEnvironment( | 390 void MetricsLog::RecordEnvironment( |
| 517 const std::vector<metrics::MetricsProvider*>& metrics_providers, | 391 const std::vector<metrics::MetricsProvider*>& metrics_providers, |
| 518 const std::vector<content::WebPluginInfo>& plugin_list, | |
| 519 const std::vector<variations::ActiveGroupId>& synthetic_trials) { | 392 const std::vector<variations::ActiveGroupId>& synthetic_trials) { |
| 520 DCHECK(!HasEnvironment()); | 393 DCHECK(!HasEnvironment()); |
| 521 | 394 |
| 522 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); | 395 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); |
| 523 | 396 |
| 524 std::string brand_code; | 397 std::string brand_code; |
| 525 if (client_->GetBrand(&brand_code)) | 398 if (client_->GetBrand(&brand_code)) |
| 526 system_profile->set_brand_code(brand_code); | 399 system_profile->set_brand_code(brand_code); |
| 527 | 400 |
| 528 int enabled_date; | 401 int enabled_date; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 const gfx::Size display_size = GetScreenSize(); | 461 const gfx::Size display_size = GetScreenSize(); |
| 589 hardware->set_primary_screen_width(display_size.width()); | 462 hardware->set_primary_screen_width(display_size.width()); |
| 590 hardware->set_primary_screen_height(display_size.height()); | 463 hardware->set_primary_screen_height(display_size.height()); |
| 591 hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor()); | 464 hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor()); |
| 592 hardware->set_screen_count(GetScreenCount()); | 465 hardware->set_screen_count(GetScreenCount()); |
| 593 | 466 |
| 594 #if defined(OS_WIN) | 467 #if defined(OS_WIN) |
| 595 WriteScreenDPIInformationProto(hardware); | 468 WriteScreenDPIInformationProto(hardware); |
| 596 #endif | 469 #endif |
| 597 | 470 |
| 598 WritePluginList(plugin_list); | |
| 599 extension_metrics_.WriteExtensionList(uma_proto()->mutable_system_profile()); | 471 extension_metrics_.WriteExtensionList(uma_proto()->mutable_system_profile()); |
| 600 | 472 |
| 601 std::vector<ActiveGroupId> field_trial_ids; | 473 std::vector<ActiveGroupId> field_trial_ids; |
| 602 GetFieldTrialIds(&field_trial_ids); | 474 GetFieldTrialIds(&field_trial_ids); |
| 603 WriteFieldTrials(field_trial_ids, system_profile); | 475 WriteFieldTrials(field_trial_ids, system_profile); |
| 604 WriteFieldTrials(synthetic_trials, system_profile); | 476 WriteFieldTrials(synthetic_trials, system_profile); |
| 605 | 477 |
| 606 #if defined(OS_CHROMEOS) | 478 #if defined(OS_CHROMEOS) |
| 607 metrics_log_chromeos_->LogChromeOSMetrics(); | 479 metrics_log_chromeos_->LogChromeOSMetrics(); |
| 608 #endif // OS_CHROMEOS | 480 #endif // OS_CHROMEOS |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 profile = uma_proto()->add_profiler_event(); | 530 profile = uma_proto()->add_profiler_event(); |
| 659 profile->set_profile_type(ProfilerEventProto::STARTUP_PROFILE); | 531 profile->set_profile_type(ProfilerEventProto::STARTUP_PROFILE); |
| 660 profile->set_time_source(ProfilerEventProto::WALL_CLOCK_TIME); | 532 profile->set_time_source(ProfilerEventProto::WALL_CLOCK_TIME); |
| 661 } else { | 533 } else { |
| 662 // For the remaining calls, re-use the existing field. | 534 // For the remaining calls, re-use the existing field. |
| 663 profile = uma_proto()->mutable_profiler_event(0); | 535 profile = uma_proto()->mutable_profiler_event(0); |
| 664 } | 536 } |
| 665 | 537 |
| 666 WriteProfilerData(process_data, process_type, profile); | 538 WriteProfilerData(process_data, process_type, profile); |
| 667 } | 539 } |
| OLD | NEW |