| 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 |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 void MetricsLog::set_version_extension(const std::string& extension) { | 417 void MetricsLog::set_version_extension(const std::string& extension) { |
| 418 g_version_extension.Get() = extension; | 418 g_version_extension.Get() = extension; |
| 419 } | 419 } |
| 420 | 420 |
| 421 // static | 421 // static |
| 422 const std::string& MetricsLog::version_extension() { | 422 const std::string& MetricsLog::version_extension() { |
| 423 return g_version_extension.Get(); | 423 return g_version_extension.Get(); |
| 424 } | 424 } |
| 425 | 425 |
| 426 void MetricsLog::RecordStabilityMetrics( | 426 void MetricsLog::RecordStabilityMetrics( |
| 427 const std::vector<content::WebPluginInfo>& plugin_list, | |
| 428 base::TimeDelta incremental_uptime, | 427 base::TimeDelta incremental_uptime, |
| 429 LogType log_type) { | 428 LogType log_type) { |
| 430 DCHECK_NE(NO_LOG, log_type); | 429 DCHECK_NE(NO_LOG, log_type); |
| 431 DCHECK(!locked()); | 430 DCHECK(!locked()); |
| 431 // Check UMA enabled date presence to ensure system profile has been filled. |
| 432 DCHECK(uma_proto()->system_profile().has_uma_enabled_date()); |
| 432 | 433 |
| 433 PrefService* pref = GetPrefService(); | 434 PrefService* pref = GetPrefService(); |
| 434 DCHECK(pref); | 435 DCHECK(pref); |
| 435 | 436 |
| 436 // Get stability attributes out of Local State, zeroing out stored values. | 437 // Get stability attributes out of Local State, zeroing out stored values. |
| 437 // NOTE: This could lead to some data loss if this report isn't successfully | 438 // NOTE: This could lead to some data loss if this report isn't successfully |
| 438 // sent, but that's true for all the metrics. | 439 // sent, but that's true for all the metrics. |
| 439 | 440 |
| 440 WriteRequiredStabilityAttributes(pref); | 441 WriteRequiredStabilityAttributes(pref); |
| 441 WritePluginStabilityElements(plugin_list, pref); | 442 WritePluginStabilityElements(pref); |
| 442 | 443 |
| 443 // Record recent delta for critical stability metrics. We can't wait for a | 444 // Record recent delta for critical stability metrics. We can't wait for a |
| 444 // restart to gather these, as that delay biases our observation away from | 445 // restart to gather these, as that delay biases our observation away from |
| 445 // users that run happily for a looooong time. We send increments with each | 446 // users that run happily for a looooong time. We send increments with each |
| 446 // uma log upload, just as we send histogram data. | 447 // uma log upload, just as we send histogram data. |
| 447 WriteRealtimeStabilityAttributes(pref, incremental_uptime); | 448 WriteRealtimeStabilityAttributes(pref, incremental_uptime); |
| 448 | 449 |
| 449 // Omit some stats unless this is the initial stability log. | 450 // Omit some stats unless this is the initial stability log. |
| 450 if (log_type != INITIAL_LOG) | 451 if (log_type != INITIAL_LOG) |
| 451 return; | 452 return; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 int MetricsLog::GetScreenCount() const { | 496 int MetricsLog::GetScreenCount() const { |
| 496 // TODO(scottmg): NativeScreen maybe wrong. http://crbug.com/133312 | 497 // TODO(scottmg): NativeScreen maybe wrong. http://crbug.com/133312 |
| 497 return gfx::Screen::GetNativeScreen()->GetNumDisplays(); | 498 return gfx::Screen::GetNativeScreen()->GetNumDisplays(); |
| 498 } | 499 } |
| 499 | 500 |
| 500 void MetricsLog::GetFieldTrialIds( | 501 void MetricsLog::GetFieldTrialIds( |
| 501 std::vector<ActiveGroupId>* field_trial_ids) const { | 502 std::vector<ActiveGroupId>* field_trial_ids) const { |
| 502 chrome_variations::GetFieldTrialActiveGroupIds(field_trial_ids); | 503 chrome_variations::GetFieldTrialActiveGroupIds(field_trial_ids); |
| 503 } | 504 } |
| 504 | 505 |
| 505 void MetricsLog::WritePluginStabilityElements( | 506 void MetricsLog::WritePluginStabilityElements(PrefService* pref) { |
| 506 const std::vector<content::WebPluginInfo>& plugin_list, | |
| 507 PrefService* pref) { | |
| 508 // Now log plugin stability info. | 507 // Now log plugin stability info. |
| 509 const ListValue* plugin_stats_list = pref->GetList( | 508 const ListValue* plugin_stats_list = pref->GetList( |
| 510 prefs::kStabilityPluginStats); | 509 prefs::kStabilityPluginStats); |
| 511 if (!plugin_stats_list) | 510 if (!plugin_stats_list) |
| 512 return; | 511 return; |
| 513 | 512 |
| 514 #if defined(ENABLE_PLUGINS) | 513 #if defined(ENABLE_PLUGINS) |
| 515 SystemProfileProto::Stability* stability = | 514 SystemProfileProto::Stability* stability = |
| 516 uma_proto()->mutable_system_profile()->mutable_stability(); | 515 uma_proto()->mutable_system_profile()->mutable_stability(); |
| 517 PluginPrefs* plugin_prefs = GetPluginPrefs(); | |
| 518 for (ListValue::const_iterator iter = plugin_stats_list->begin(); | 516 for (ListValue::const_iterator iter = plugin_stats_list->begin(); |
| 519 iter != plugin_stats_list->end(); ++iter) { | 517 iter != plugin_stats_list->end(); ++iter) { |
| 520 if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) { | 518 if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) { |
| 521 NOTREACHED(); | 519 NOTREACHED(); |
| 522 continue; | 520 continue; |
| 523 } | 521 } |
| 524 DictionaryValue* plugin_dict = static_cast<DictionaryValue*>(*iter); | 522 DictionaryValue* plugin_dict = static_cast<DictionaryValue*>(*iter); |
| 525 | 523 |
| 526 // Write the protobuf version. | |
| 527 // Note that this search is potentially a quadratic operation, but given the | 524 // Note that this search is potentially a quadratic operation, but given the |
| 528 // low number of plugins installed on a "reasonable" setup, this should be | 525 // low number of plugins installed on a "reasonable" setup, this should be |
| 529 // fine. | 526 // fine. |
| 530 // TODO(isherman): Verify that this does not show up as a hotspot in | 527 // TODO(isherman): Verify that this does not show up as a hotspot in |
| 531 // profiler runs. | 528 // profiler runs. |
| 532 const content::WebPluginInfo* plugin_info = NULL; | 529 const SystemProfileProto::Plugin* system_profile_plugin = NULL; |
| 533 std::string plugin_name; | 530 std::string plugin_name; |
| 534 plugin_dict->GetString(prefs::kStabilityPluginName, &plugin_name); | 531 plugin_dict->GetString(prefs::kStabilityPluginName, &plugin_name); |
| 535 const string16 plugin_name_utf16 = UTF8ToUTF16(plugin_name); | 532 const SystemProfileProto& system_profile = uma_proto()->system_profile(); |
| 536 for (std::vector<content::WebPluginInfo>::const_iterator iter = | 533 for (int i = 0; i < system_profile.plugin_size(); ++i) { |
| 537 plugin_list.begin(); | 534 if (system_profile.plugin(i).name() == plugin_name) { |
| 538 iter != plugin_list.end(); ++iter) { | 535 system_profile_plugin = &system_profile.plugin(i); |
| 539 if (iter->name == plugin_name_utf16) { | |
| 540 plugin_info = &(*iter); | |
| 541 break; | 536 break; |
| 542 } | 537 } |
| 543 } | 538 } |
| 544 | 539 |
| 545 if (!plugin_info) { | 540 if (!system_profile_plugin) { |
| 546 NOTREACHED(); | 541 NOTREACHED(); |
| 547 continue; | 542 continue; |
| 548 } | 543 } |
| 549 | 544 |
| 550 SystemProfileProto::Stability::PluginStability* plugin_stability = | 545 SystemProfileProto::Stability::PluginStability* plugin_stability = |
| 551 stability->add_plugin_stability(); | 546 stability->add_plugin_stability(); |
| 552 SetPluginInfo(*plugin_info, plugin_prefs, | 547 *plugin_stability->mutable_plugin() = *system_profile_plugin; |
| 553 plugin_stability->mutable_plugin()); | |
| 554 | 548 |
| 555 int launches = 0; | 549 int launches = 0; |
| 556 plugin_dict->GetInteger(prefs::kStabilityPluginLaunches, &launches); | 550 plugin_dict->GetInteger(prefs::kStabilityPluginLaunches, &launches); |
| 557 if (launches > 0) | 551 if (launches > 0) |
| 558 plugin_stability->set_launch_count(launches); | 552 plugin_stability->set_launch_count(launches); |
| 559 | 553 |
| 560 int instances = 0; | 554 int instances = 0; |
| 561 plugin_dict->GetInteger(prefs::kStabilityPluginInstances, &instances); | 555 plugin_dict->GetInteger(prefs::kStabilityPluginInstances, &instances); |
| 562 if (instances > 0) | 556 if (instances > 0) |
| 563 plugin_stability->set_instance_count(instances); | 557 plugin_stability->set_instance_count(instances); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 592 uma_proto()->mutable_system_profile()->mutable_stability(); | 586 uma_proto()->mutable_system_profile()->mutable_stability(); |
| 593 stability->set_launch_count(launch_count); | 587 stability->set_launch_count(launch_count); |
| 594 stability->set_crash_count(crash_count); | 588 stability->set_crash_count(crash_count); |
| 595 } | 589 } |
| 596 | 590 |
| 597 void MetricsLog::WriteRealtimeStabilityAttributes( | 591 void MetricsLog::WriteRealtimeStabilityAttributes( |
| 598 PrefService* pref, | 592 PrefService* pref, |
| 599 base::TimeDelta incremental_uptime) { | 593 base::TimeDelta incremental_uptime) { |
| 600 // Update the stats which are critical for real-time stability monitoring. | 594 // Update the stats which are critical for real-time stability monitoring. |
| 601 // Since these are "optional," only list ones that are non-zero, as the counts | 595 // Since these are "optional," only list ones that are non-zero, as the counts |
| 602 // are aggergated (summed) server side. | 596 // are aggregated (summed) server side. |
| 603 | 597 |
| 604 SystemProfileProto::Stability* stability = | 598 SystemProfileProto::Stability* stability = |
| 605 uma_proto()->mutable_system_profile()->mutable_stability(); | 599 uma_proto()->mutable_system_profile()->mutable_stability(); |
| 606 int count = pref->GetInteger(prefs::kStabilityPageLoadCount); | 600 int count = pref->GetInteger(prefs::kStabilityPageLoadCount); |
| 607 if (count) { | 601 if (count) { |
| 608 stability->set_page_load_count(count); | 602 stability->set_page_load_count(count); |
| 609 pref->SetInteger(prefs::kStabilityPageLoadCount, 0); | 603 pref->SetInteger(prefs::kStabilityPageLoadCount, 0); |
| 610 } | 604 } |
| 611 | 605 |
| 612 count = pref->GetInteger(prefs::kStabilityRendererCrashCount); | 606 count = pref->GetInteger(prefs::kStabilityRendererCrashCount); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 | 947 |
| 954 // We invalidate the user count if it changed while the log was open. | 948 // We invalidate the user count if it changed while the log was open. |
| 955 if (system_profile->has_multi_profile_user_count() && | 949 if (system_profile->has_multi_profile_user_count() && |
| 956 user_count != system_profile->multi_profile_user_count()) | 950 user_count != system_profile->multi_profile_user_count()) |
| 957 user_count = 0; | 951 user_count = 0; |
| 958 | 952 |
| 959 system_profile->set_multi_profile_user_count(user_count); | 953 system_profile->set_multi_profile_user_count(user_count); |
| 960 } | 954 } |
| 961 } | 955 } |
| 962 #endif | 956 #endif |
| OLD | NEW |