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
3 // found in the LICENSE file.
5 #include "chrome/browser/performance_monitor/key_builder.h"
7 #include "base/format_macros.h"
8 #include "base/logging.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_split.h"
11 #include "base/strings/stringprintf.h"
13 namespace performance_monitor
{
17 const char kDelimiter
= '!';
19 // These values are used as the portion of the generated key which represents
20 // the event/metric type when inserting values in the database. We use an ASCII
21 // character as a mapping, rather than the enum of the metric or event itself,
22 // so that we can edit the MetricType and EventType enums as desired, without
23 // worrying about the integrity of the database.
25 // Once a character mapping has been set for a metric or event, do not change
26 // its value! New character mappings should be greater than 34 (ASCII characters
27 // below 32 have meaning, 33 is '!' - the database delimiter, and 34 is reserved
28 // for the 'Undefined' character mapping). Do not repeat values within the
29 // metric/event sets (repeated values between sets are okay).
31 // Deprecated keys: A key which is deprecated should be clearly marked as such,
32 // and its use discontinued. Do not remove the key from the listing! (Otherwise,
33 // a new metric may take its key and think the old data belongs to it.)
36 METRIC_UNDEFINED_KEY_CHAR
= 34,
37 METRIC_CPU_USAGE_KEY_CHAR
= 35,
38 METRIC_PRIVATE_MEMORY_USAGE_KEY_CHAR
= 36,
39 METRIC_SHARED_MEMORY_USAGE_KEY_CHAR
= 37,
40 METRIC_STARTUP_TIME_KEY_CHAR
= 38,
41 METRIC_TEST_STARTUP_TIME_KEY_CHAR
= 39,
42 METRIC_SESSION_RESTORE_TIME_KEY_CHAR
= 40,
43 METRIC_PAGE_LOAD_TIME_KEY_CHAR
= 41,
44 METRIC_NETWORK_BYTES_READ_KEY_CHAR
= 42,
45 METRIC_NUMBER_OF_METRICS_KEY_CHAR
= 255,
49 EVENT_UNDEFINED_KEY_CHAR
= 34,
50 EVENT_EXTENSION_INSTALL_KEY_CHAR
= 35,
51 EVENT_EXTENSION_UNINSTALL_KEY_CHAR
= 36,
52 EVENT_EXTENSION_UPDATE_KEY_CHAR
= 37,
53 EVENT_EXTENSION_ENABLE_KEY_CHAR
= 38,
54 EVENT_EXTENSION_DISABLE_KEY_CHAR
= 39,
55 EVENT_CHROME_UPDATE_KEY_CHAR
= 40,
56 EVENT_RENDERER_HANG_KEY_CHAR
= 41,
57 EVENT_RENDERER_CRASH_KEY_CHAR
= 42,
58 EVENT_RENDERER_KILLED_KEY_CHAR
= 43,
59 EVENT_UNCLEAN_EXIT_KEY_CHAR
= 44,
60 EVENT_NUMBER_OF_EVENTS_KEY_CHAR
= 255,
63 // The position of different elements in the key for the event db.
64 enum EventKeyPosition
{
65 EVENT_TIME
, // The time the event was generated.
66 EVENT_TYPE
// The type of event.
69 // The position of different elements in the key for the recent db.
70 enum RecentKeyPosition
{
71 RECENT_TIME
, // The time the stat was gathered.
72 RECENT_TYPE
, // The unique identifier for the type of metric gathered.
73 RECENT_ACTIVITY
// The unique identifier for the activity.
76 // The position of different elements in the key for the max value db.
77 enum MaxValueKeyPosition
{
78 MAX_VALUE_TYPE
, // The unique identifier for the type of metric gathered.
79 MAX_VALUE_ACTIVITY
// The unique identifier for the activity.
82 // The position of different elements in the key for a metric db.
83 enum MetricKeyPosition
{
84 METRIC_TYPE
, // The unique identifier for the metric.
85 METRIC_TIME
, // The time the stat was gathered.
86 METRIC_ACTIVITY
// The unique identifier for the activity.
91 RecentKey::RecentKey(const std::string
& recent_time
,
92 MetricType recent_type
,
93 const std::string
& recent_activity
)
94 : time(recent_time
), type(recent_type
), activity(recent_activity
) {
97 RecentKey::~RecentKey() {
100 MetricKey::MetricKey(const std::string
& metric_time
,
101 MetricType metric_type
,
102 const std::string
& metric_activity
)
103 : time(metric_time
), type(metric_type
), activity(metric_activity
) {
106 MetricKey::~MetricKey() {
109 KeyBuilder::KeyBuilder() {
113 KeyBuilder::~KeyBuilder() {
116 void KeyBuilder::PopulateKeyMaps() {
117 // Hard-code the generation of the map between event types and event key
118 // character mappings.
119 event_type_to_event_key_char_
[EVENT_UNDEFINED
] = EVENT_UNDEFINED_KEY_CHAR
;
120 event_type_to_event_key_char_
[EVENT_EXTENSION_INSTALL
] =
121 EVENT_EXTENSION_INSTALL_KEY_CHAR
;
122 event_type_to_event_key_char_
[EVENT_EXTENSION_UNINSTALL
] =
123 EVENT_EXTENSION_UNINSTALL_KEY_CHAR
;
124 event_type_to_event_key_char_
[EVENT_EXTENSION_UPDATE
] =
125 EVENT_EXTENSION_UPDATE_KEY_CHAR
;
126 event_type_to_event_key_char_
[EVENT_EXTENSION_ENABLE
] =
127 EVENT_EXTENSION_ENABLE_KEY_CHAR
;
128 event_type_to_event_key_char_
[EVENT_EXTENSION_DISABLE
] =
129 EVENT_EXTENSION_DISABLE_KEY_CHAR
;
130 event_type_to_event_key_char_
[EVENT_RENDERER_HANG
] =
131 EVENT_RENDERER_HANG_KEY_CHAR
;
132 event_type_to_event_key_char_
[EVENT_RENDERER_CRASH
] =
133 EVENT_RENDERER_CRASH_KEY_CHAR
;
134 event_type_to_event_key_char_
[EVENT_RENDERER_KILLED
] =
135 EVENT_RENDERER_KILLED_KEY_CHAR
;
136 event_type_to_event_key_char_
[EVENT_UNCLEAN_EXIT
] =
137 EVENT_UNCLEAN_EXIT_KEY_CHAR
;
138 event_type_to_event_key_char_
[EVENT_NUMBER_OF_EVENTS
] =
139 EVENT_NUMBER_OF_EVENTS_KEY_CHAR
;
140 DCHECK(event_type_to_event_key_char_
.size() == EVENT_NUMBER_OF_EVENTS
);
142 // Generate the reverse map for easy look-up between event character mappings
144 for (int i
= static_cast<int>(EVENT_UNDEFINED
);
145 i
<= static_cast<int>(EVENT_NUMBER_OF_EVENTS
); ++i
) {
146 event_key_char_to_event_type_
[event_type_to_event_key_char_
[
147 static_cast<EventType
>(i
)]] = static_cast<EventType
>(i
);
150 // Repeat the process for metrics.
151 metric_type_to_metric_key_char_
[METRIC_UNDEFINED
] = METRIC_UNDEFINED_KEY_CHAR
;
152 metric_type_to_metric_key_char_
[METRIC_CPU_USAGE
] = METRIC_CPU_USAGE_KEY_CHAR
;
153 metric_type_to_metric_key_char_
[METRIC_PRIVATE_MEMORY_USAGE
] =
154 METRIC_PRIVATE_MEMORY_USAGE_KEY_CHAR
;
155 metric_type_to_metric_key_char_
[METRIC_SHARED_MEMORY_USAGE
] =
156 METRIC_SHARED_MEMORY_USAGE_KEY_CHAR
;
157 metric_type_to_metric_key_char_
[METRIC_STARTUP_TIME
] =
158 METRIC_STARTUP_TIME_KEY_CHAR
;
159 metric_type_to_metric_key_char_
[METRIC_TEST_STARTUP_TIME
] =
160 METRIC_TEST_STARTUP_TIME_KEY_CHAR
;
161 metric_type_to_metric_key_char_
[METRIC_PAGE_LOAD_TIME
] =
162 METRIC_PAGE_LOAD_TIME_KEY_CHAR
;
163 metric_type_to_metric_key_char_
[METRIC_NETWORK_BYTES_READ
] =
164 METRIC_NETWORK_BYTES_READ_KEY_CHAR
;
165 metric_type_to_metric_key_char_
[METRIC_NUMBER_OF_METRICS
] =
166 METRIC_NUMBER_OF_METRICS_KEY_CHAR
;
167 DCHECK(metric_type_to_metric_key_char_
.size() == METRIC_NUMBER_OF_METRICS
);
169 for (int i
= static_cast<int>(METRIC_UNDEFINED
);
170 i
<= static_cast<int>(METRIC_NUMBER_OF_METRICS
); ++i
) {
171 metric_key_char_to_metric_type_
[metric_type_to_metric_key_char_
[
172 static_cast<MetricType
>(i
)]] = static_cast<MetricType
>(i
);
176 std::string
KeyBuilder::CreateActiveIntervalKey(const base::Time
& time
) {
177 return base::StringPrintf("%016" PRId64
, time
.ToInternalValue());
180 std::string
KeyBuilder::CreateMetricKey(const base::Time
& time
,
181 const MetricType type
,
182 const std::string
& activity
) {
183 return base::StringPrintf("%c%c%016" PRId64
"%c%s",
184 metric_type_to_metric_key_char_
[type
],
185 kDelimiter
, time
.ToInternalValue(),
186 kDelimiter
, activity
.c_str());
189 std::string
KeyBuilder::CreateEventKey(const base::Time
& time
,
190 const EventType type
) {
191 return base::StringPrintf("%016" PRId64
"%c%c",
192 time
.ToInternalValue(), kDelimiter
,
193 event_type_to_event_key_char_
[type
]);
196 std::string
KeyBuilder::CreateRecentKey(const base::Time
& time
,
197 const MetricType type
,
198 const std::string
& activity
) {
199 return base::StringPrintf("%016" PRId64
"%c%c%c%s",
200 time
.ToInternalValue(),
201 kDelimiter
, metric_type_to_metric_key_char_
[type
],
202 kDelimiter
, activity
.c_str());
205 std::string
KeyBuilder::CreateRecentMapKey(const MetricType type
,
206 const std::string
& activity
) {
207 return base::StringPrintf("%s%c%c",
209 kDelimiter
, metric_type_to_metric_key_char_
[type
]);
212 std::string
KeyBuilder::CreateMaxValueKey(const MetricType type
,
213 const std::string
& activity
) {
214 return base::StringPrintf("%c%c%s",
215 metric_type_to_metric_key_char_
[type
],
216 kDelimiter
, activity
.c_str());
219 EventType
KeyBuilder::EventKeyToEventType(const std::string
& event_key
) {
220 std::vector
<std::string
> split
;
221 base::SplitString(event_key
, kDelimiter
, &split
);
222 DCHECK(split
[EVENT_TYPE
].size() == 1);
223 return event_key_char_to_event_type_
[
224 static_cast<int>(split
[EVENT_TYPE
].at(0))];
227 RecentKey
KeyBuilder::SplitRecentKey(const std::string
& key
) {
228 std::vector
<std::string
> split
;
229 base::SplitString(key
, kDelimiter
, &split
);
230 DCHECK(split
[RECENT_TYPE
].size() == 1);
231 return RecentKey(split
[RECENT_TIME
],
232 metric_key_char_to_metric_type_
[
233 static_cast<int>(split
[RECENT_TYPE
].at(0))],
234 split
[RECENT_ACTIVITY
]);
237 MetricKey
KeyBuilder::SplitMetricKey(const std::string
& key
) {
238 std::vector
<std::string
> split
;
239 base::SplitString(key
, kDelimiter
, &split
);
240 DCHECK(split
[METRIC_TYPE
].size() == 1);
241 return MetricKey(split
[METRIC_TIME
],
242 metric_key_char_to_metric_type_
[
243 static_cast<int>(split
[METRIC_TYPE
].at(0))],
244 split
[METRIC_ACTIVITY
]);
247 } // namespace performance_monitor