summaryrefslogtreecommitdiffstats
path: root/chrome/browser/performance_monitor/key_builder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/performance_monitor/key_builder.cc')
-rw-r--r--chrome/browser/performance_monitor/key_builder.cc247
1 files changed, 247 insertions, 0 deletions
diff --git a/chrome/browser/performance_monitor/key_builder.cc b/chrome/browser/performance_monitor/key_builder.cc
new file mode 100644
index 0000000..cfe0e29
--- /dev/null
+++ b/chrome/browser/performance_monitor/key_builder.cc
@@ -0,0 +1,247 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/performance_monitor/key_builder.h"
+
+#include "base/format_macros.h"
+#include "base/logging.h"
+#include "base/string_number_conversions.h"
+#include "base/string_split.h"
+#include "base/stringprintf.h"
+
+namespace performance_monitor {
+
+namespace {
+
+const char kDelimiter = '!';
+
+// These values are used as the portion of the generated key which represents
+// the event/metric type when inserting values in the database. We use an ASCII
+// character as a mapping, rather than the enum of the metric or event itself,
+// so that we can edit the MetricType and EventType enums as desired, without
+// worrying about the integrity of the database.
+//
+// Once a character mapping has been set for a metric or event, do not change
+// its value! New character mappings should be greater than 34 (ASCII characters
+// below 32 have meaning, 33 is '!' - the database delimiter, and 34 is reserved
+// for the 'Undefined' character mapping). Do not repeat values within the
+// metric/event sets (repeated values between sets are okay).
+//
+// Deprecated keys: A key which is deprecated should be clearly marked as such,
+// and its use discontinued. Do not remove the key from the listing! (Otherwise,
+// a new metric may take its key and think the old data belongs to it.)
+
+enum MetricKeyChar {
+METRIC_UNDEFINED_KEY_CHAR = 34,
+METRIC_CPU_USAGE_KEY_CHAR = 35,
+METRIC_PRIVATE_MEMORY_USAGE_KEY_CHAR = 36,
+METRIC_SHARED_MEMORY_USAGE_KEY_CHAR = 37,
+METRIC_STARTUP_TIME_KEY_CHAR = 38,
+METRIC_TEST_STARTUP_TIME_KEY_CHAR = 39,
+METRIC_SESSION_RESTORE_TIME_KEY_CHAR = 40,
+METRIC_PAGE_LOAD_TIME_KEY_CHAR = 41,
+METRIC_NETWORK_BYTES_READ_KEY_CHAR = 42,
+METRIC_NUMBER_OF_METRICS_KEY_CHAR = 255,
+};
+
+enum EventKeyChar {
+EVENT_UNDEFINED_KEY_CHAR = 34,
+EVENT_EXTENSION_INSTALL_KEY_CHAR = 35,
+EVENT_EXTENSION_UNINSTALL_KEY_CHAR = 36,
+EVENT_EXTENSION_UPDATE_KEY_CHAR = 37,
+EVENT_EXTENSION_ENABLE_KEY_CHAR = 38,
+EVENT_EXTENSION_DISABLE_KEY_CHAR = 39,
+EVENT_CHROME_UPDATE_KEY_CHAR = 40,
+EVENT_RENDERER_FREEZE_KEY_CHAR = 41,
+EVENT_RENDERER_CRASH_KEY_CHAR = 42,
+EVENT_KILLED_BY_OS_CRASH_KEY_CHAR = 43,
+EVENT_UNCLEAN_EXIT_KEY_CHAR = 44,
+EVENT_NUMBER_OF_EVENTS_KEY_CHAR = 255,
+};
+
+// The position of different elements in the key for the event db.
+enum EventKeyPosition {
+ EVENT_TIME, // The time the event was generated.
+ EVENT_TYPE // The type of event.
+};
+
+// The position of different elements in the key for the recent db.
+enum RecentKeyPosition {
+ RECENT_TIME, // The time the stat was gathered.
+ RECENT_TYPE, // The unique identifier for the type of metric gathered.
+ RECENT_ACTIVITY // The unique identifier for the activity.
+};
+
+// The position of different elements in the key for the max value db.
+enum MaxValueKeyPosition {
+ MAX_VALUE_TYPE, // The unique identifier for the type of metric gathered.
+ MAX_VALUE_ACTIVITY // The unique identifier for the activity.
+};
+
+// The position of different elements in the key for a metric db.
+enum MetricKeyPosition {
+ METRIC_TYPE, // The unique identifier for the metric.
+ METRIC_TIME, // The time the stat was gathered.
+ METRIC_ACTIVITY // The unique identifier for the activity.
+};
+
+} // namespace
+
+RecentKey::RecentKey(const std::string& recent_time,
+ MetricType recent_type,
+ const std::string& recent_activity)
+ : time(recent_time), type(recent_type), activity(recent_activity) {
+}
+
+RecentKey::~RecentKey() {
+}
+
+MetricKey::MetricKey(const std::string& metric_time,
+ MetricType metric_type,
+ const std::string& metric_activity)
+ : time(metric_time), type(metric_type), activity(metric_activity) {
+}
+
+MetricKey::~MetricKey() {
+}
+
+KeyBuilder::KeyBuilder() {
+ PopulateKeyMaps();
+}
+
+KeyBuilder::~KeyBuilder() {
+}
+
+void KeyBuilder::PopulateKeyMaps() {
+ // Hard-code the generation of the map between event types and event key
+ // character mappings.
+ event_type_to_event_key_char_[EVENT_UNDEFINED] = EVENT_UNDEFINED_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_EXTENSION_INSTALL] =
+ EVENT_EXTENSION_INSTALL_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_EXTENSION_UNINSTALL] =
+ EVENT_EXTENSION_UNINSTALL_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_EXTENSION_UPDATE] =
+ EVENT_EXTENSION_UPDATE_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_EXTENSION_ENABLE] =
+ EVENT_EXTENSION_ENABLE_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_EXTENSION_DISABLE] =
+ EVENT_EXTENSION_DISABLE_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_RENDERER_FREEZE] =
+ EVENT_RENDERER_FREEZE_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_RENDERER_CRASH] =
+ EVENT_RENDERER_CRASH_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_KILLED_BY_OS_CRASH] =
+ EVENT_KILLED_BY_OS_CRASH_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_UNCLEAN_EXIT] =
+ EVENT_UNCLEAN_EXIT_KEY_CHAR;
+ event_type_to_event_key_char_[EVENT_NUMBER_OF_EVENTS] =
+ EVENT_NUMBER_OF_EVENTS_KEY_CHAR;
+ DCHECK(event_type_to_event_key_char_.size() == EVENT_NUMBER_OF_EVENTS);
+
+ // Generate the reverse map for easy look-up between event character mappings
+ // and event types.
+ for (int i = static_cast<int>(EVENT_UNDEFINED);
+ i <= static_cast<int>(EVENT_NUMBER_OF_EVENTS); ++i) {
+ event_key_char_to_event_type_[event_type_to_event_key_char_[
+ static_cast<EventType>(i)]] = static_cast<EventType>(i);
+ }
+
+ // Repeat the process for metrics.
+ metric_type_to_metric_key_char_[METRIC_UNDEFINED] = METRIC_UNDEFINED_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_CPU_USAGE] = METRIC_CPU_USAGE_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_PRIVATE_MEMORY_USAGE] =
+ METRIC_PRIVATE_MEMORY_USAGE_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_SHARED_MEMORY_USAGE] =
+ METRIC_SHARED_MEMORY_USAGE_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_STARTUP_TIME] =
+ METRIC_STARTUP_TIME_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_TEST_STARTUP_TIME] =
+ METRIC_TEST_STARTUP_TIME_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_PAGE_LOAD_TIME] =
+ METRIC_PAGE_LOAD_TIME_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_NETWORK_BYTES_READ] =
+ METRIC_NETWORK_BYTES_READ_KEY_CHAR;
+ metric_type_to_metric_key_char_[METRIC_NUMBER_OF_METRICS] =
+ METRIC_NUMBER_OF_METRICS_KEY_CHAR;
+ DCHECK(metric_type_to_metric_key_char_.size() == METRIC_NUMBER_OF_METRICS);
+
+ for (int i = static_cast<int>(METRIC_UNDEFINED);
+ i <= static_cast<int>(METRIC_NUMBER_OF_METRICS); ++i) {
+ metric_key_char_to_metric_type_[metric_type_to_metric_key_char_[
+ static_cast<MetricType>(i)]] = static_cast<MetricType>(i);
+ }
+}
+
+std::string KeyBuilder::CreateActiveIntervalKey(const base::Time& time) {
+ return StringPrintf("%016" PRId64, time.ToInternalValue());
+}
+
+std::string KeyBuilder::CreateMetricKey(const base::Time& time,
+ const MetricType type,
+ const std::string& activity) {
+ return StringPrintf("%c%c%016" PRId64 "%c%s",
+ metric_type_to_metric_key_char_[type],
+ kDelimiter, time.ToInternalValue(),
+ kDelimiter, activity.c_str());
+}
+
+std::string KeyBuilder::CreateEventKey(const base::Time& time,
+ const EventType type) {
+ return StringPrintf("%016" PRId64 "%c%c",
+ time.ToInternalValue(), kDelimiter,
+ event_type_to_event_key_char_[type]);
+}
+
+std::string KeyBuilder::CreateRecentKey(const base::Time& time,
+ const MetricType type,
+ const std::string& activity) {
+ return StringPrintf("%016" PRId64 "%c%c%c%s",
+ time.ToInternalValue(),
+ kDelimiter, metric_type_to_metric_key_char_[type],
+ kDelimiter, activity.c_str());
+}
+
+std::string KeyBuilder::CreateRecentMapKey(const MetricType type,
+ const std::string& activity) {
+ return StringPrintf("%s%c%c",
+ activity.c_str(),
+ kDelimiter, metric_type_to_metric_key_char_[type]);
+}
+
+std::string KeyBuilder::CreateMaxValueKey(const MetricType type,
+ const std::string& activity) {
+ return StringPrintf("%c%c%s",
+ metric_type_to_metric_key_char_[type],
+ kDelimiter, activity.c_str());
+}
+
+EventType KeyBuilder::EventKeyToEventType(const std::string& event_key) {
+ std::vector<std::string> split;
+ base::SplitString(event_key, kDelimiter, &split);
+ DCHECK(split[EVENT_TYPE].size() == 1);
+ return event_key_char_to_event_type_[
+ static_cast<int>(split[EVENT_TYPE].at(0))];
+}
+
+RecentKey KeyBuilder::SplitRecentKey(const std::string& key) {
+ std::vector<std::string> split;
+ base::SplitString(key, kDelimiter, &split);
+ DCHECK(split[RECENT_TYPE].size() == 1);
+ return RecentKey(split[RECENT_TIME],
+ metric_key_char_to_metric_type_[
+ static_cast<int>(split[RECENT_TYPE].at(0))],
+ split[RECENT_ACTIVITY]);
+}
+
+MetricKey KeyBuilder::SplitMetricKey(const std::string& key) {
+ std::vector<std::string> split;
+ base::SplitString(key, kDelimiter, &split);
+ DCHECK(split[METRIC_TYPE].size() == 1);
+ return MetricKey(split[METRIC_TIME],
+ metric_key_char_to_metric_type_[
+ static_cast<int>(split[METRIC_TYPE].at(0))],
+ split[METRIC_ACTIVITY]);
+}
+
+} // namespace performance_monitor