Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Side by Side Diff: components/metrics/metrics_log.cc

Issue 573403002: Change UMA proto product field to be an int32. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments and add a couple of tests. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/metrics/metrics_log.h" 5 #include "components/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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 } 55 }
56 56
57 // Returns the date at which the current metrics client ID was created as 57 // Returns the date at which the current metrics client ID was created as
58 // a string containing seconds since the epoch, or "0" if none was found. 58 // a string containing seconds since the epoch, or "0" if none was found.
59 std::string GetMetricsEnabledDate(PrefService* pref) { 59 std::string GetMetricsEnabledDate(PrefService* pref) {
60 if (!pref) { 60 if (!pref) {
61 NOTREACHED(); 61 NOTREACHED();
62 return "0"; 62 return "0";
63 } 63 }
64 64
65 return pref->GetString(metrics::prefs::kMetricsReportingEnabledTimestamp); 65 return pref->GetString(prefs::kMetricsReportingEnabledTimestamp);
66 } 66 }
67 67
68 // Computes a SHA-1 hash of |data| and returns it as a hex string. 68 // Computes a SHA-1 hash of |data| and returns it as a hex string.
69 std::string ComputeSHA1(const std::string& data) { 69 std::string ComputeSHA1(const std::string& data) {
70 const std::string sha1 = base::SHA1HashString(data); 70 const std::string sha1 = base::SHA1HashString(data);
71 return base::HexEncode(sha1.data(), sha1.size()); 71 return base::HexEncode(sha1.data(), sha1.size());
72 } 72 }
73 73
74 void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids, 74 void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids,
75 SystemProfileProto* system_profile) { 75 SystemProfileProto* system_profile) {
(...skipping 11 matching lines...) Expand all
87 // timestamps. 87 // timestamps.
88 int64 RoundSecondsToHour(int64 time_in_seconds) { 88 int64 RoundSecondsToHour(int64 time_in_seconds) {
89 return 3600 * (time_in_seconds / 3600); 89 return 3600 * (time_in_seconds / 3600);
90 } 90 }
91 91
92 } // namespace 92 } // namespace
93 93
94 MetricsLog::MetricsLog(const std::string& client_id, 94 MetricsLog::MetricsLog(const std::string& client_id,
95 int session_id, 95 int session_id,
96 LogType log_type, 96 LogType log_type,
97 metrics::MetricsServiceClient* client, 97 MetricsServiceClient* client,
98 PrefService* local_state) 98 PrefService* local_state)
99 : closed_(false), 99 : closed_(false),
100 log_type_(log_type), 100 log_type_(log_type),
101 client_(client), 101 client_(client),
102 creation_time_(base::TimeTicks::Now()), 102 creation_time_(base::TimeTicks::Now()),
103 local_state_(local_state) { 103 local_state_(local_state) {
104 if (IsTestingID(client_id)) 104 if (IsTestingID(client_id))
105 uma_proto_.set_client_id(0); 105 uma_proto_.set_client_id(0);
106 else 106 else
107 uma_proto_.set_client_id(Hash(client_id)); 107 uma_proto_.set_client_id(Hash(client_id));
108 108
109 uma_proto_.set_session_id(session_id); 109 uma_proto_.set_session_id(session_id);
110 110
111 const int32 product = client_->GetProduct();
112 // Only set the product if it differs from the default value.
113 if (product != uma_proto_.product())
114 uma_proto_.set_product(product);
115
111 SystemProfileProto* system_profile = uma_proto_.mutable_system_profile(); 116 SystemProfileProto* system_profile = uma_proto_.mutable_system_profile();
112 system_profile->set_build_timestamp(GetBuildTime()); 117 system_profile->set_build_timestamp(GetBuildTime());
113 system_profile->set_app_version(client_->GetVersionString()); 118 system_profile->set_app_version(client_->GetVersionString());
114 system_profile->set_channel(client_->GetChannel()); 119 system_profile->set_channel(client_->GetChannel());
115 } 120 }
116 121
117 MetricsLog::~MetricsLog() { 122 MetricsLog::~MetricsLog() {
118 } 123 }
119 124
120 // static 125 // static
121 void MetricsLog::RegisterPrefs(PrefRegistrySimple* registry) { 126 void MetricsLog::RegisterPrefs(PrefRegistrySimple* registry) {
122 registry->RegisterIntegerPref(metrics::prefs::kStabilityLaunchCount, 0); 127 registry->RegisterIntegerPref(prefs::kStabilityLaunchCount, 0);
123 registry->RegisterIntegerPref(metrics::prefs::kStabilityCrashCount, 0); 128 registry->RegisterIntegerPref(prefs::kStabilityCrashCount, 0);
129 registry->RegisterIntegerPref(prefs::kStabilityIncompleteSessionEndCount, 0);
130 registry->RegisterIntegerPref(prefs::kStabilityBreakpadRegistrationFail, 0);
124 registry->RegisterIntegerPref( 131 registry->RegisterIntegerPref(
125 metrics::prefs::kStabilityIncompleteSessionEndCount, 0); 132 prefs::kStabilityBreakpadRegistrationSuccess, 0);
126 registry->RegisterIntegerPref( 133 registry->RegisterIntegerPref(prefs::kStabilityDebuggerPresent, 0);
127 metrics::prefs::kStabilityBreakpadRegistrationFail, 0); 134 registry->RegisterIntegerPref(prefs::kStabilityDebuggerNotPresent, 0);
128 registry->RegisterIntegerPref( 135 registry->RegisterStringPref(prefs::kStabilitySavedSystemProfile,
129 metrics::prefs::kStabilityBreakpadRegistrationSuccess, 0);
130 registry->RegisterIntegerPref(metrics::prefs::kStabilityDebuggerPresent, 0);
131 registry->RegisterIntegerPref(metrics::prefs::kStabilityDebuggerNotPresent,
132 0);
133 registry->RegisterStringPref(metrics::prefs::kStabilitySavedSystemProfile,
134 std::string()); 136 std::string());
135 registry->RegisterStringPref(metrics::prefs::kStabilitySavedSystemProfileHash, 137 registry->RegisterStringPref(prefs::kStabilitySavedSystemProfileHash,
136 std::string()); 138 std::string());
137 } 139 }
138 140
139 // static 141 // static
140 uint64 MetricsLog::Hash(const std::string& value) { 142 uint64 MetricsLog::Hash(const std::string& value) {
141 uint64 hash = metrics::HashMetricName(value); 143 uint64 hash = HashMetricName(value);
142 144
143 // The following log is VERY helpful when folks add some named histogram into 145 // The following log is VERY helpful when folks add some named histogram into
144 // the code, but forgot to update the descriptive list of histograms. When 146 // the code, but forgot to update the descriptive list of histograms. When
145 // that happens, all we get to see (server side) is a hash of the histogram 147 // that happens, all we get to see (server side) is a hash of the histogram
146 // name. We can then use this logging to find out what histogram name was 148 // name. We can then use this logging to find out what histogram name was
147 // being hashed to a given MD5 value by just running the version of Chromium 149 // being hashed to a given MD5 value by just running the version of Chromium
148 // in question with --enable-logging. 150 // in question with --enable-logging.
149 DVLOG(1) << "Metrics: Hash numeric [" << value << "]=[" << hash << "]"; 151 DVLOG(1) << "Metrics: Hash numeric [" << value << "]=[" << hash << "]";
150 152
151 return hash; 153 return hash;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 if (i + 1 < histogram_proto->bucket_size() && 208 if (i + 1 < histogram_proto->bucket_size() &&
207 bucket->max() == histogram_proto->bucket(i + 1).min()) { 209 bucket->max() == histogram_proto->bucket(i + 1).min()) {
208 bucket->clear_max(); 210 bucket->clear_max();
209 } else if (bucket->max() == bucket->min() + 1) { 211 } else if (bucket->max() == bucket->min() + 1) {
210 bucket->clear_min(); 212 bucket->clear_min();
211 } 213 }
212 } 214 }
213 } 215 }
214 216
215 void MetricsLog::RecordStabilityMetrics( 217 void MetricsLog::RecordStabilityMetrics(
216 const std::vector<metrics::MetricsProvider*>& metrics_providers, 218 const std::vector<MetricsProvider*>& metrics_providers,
217 base::TimeDelta incremental_uptime, 219 base::TimeDelta incremental_uptime,
218 base::TimeDelta uptime) { 220 base::TimeDelta uptime) {
219 DCHECK(!closed_); 221 DCHECK(!closed_);
220 DCHECK(HasEnvironment()); 222 DCHECK(HasEnvironment());
221 DCHECK(!HasStabilityMetrics()); 223 DCHECK(!HasStabilityMetrics());
222 224
223 PrefService* pref = local_state_; 225 PrefService* pref = local_state_;
224 DCHECK(pref); 226 DCHECK(pref);
225 227
226 // Get stability attributes out of Local State, zeroing out stored values. 228 // Get stability attributes out of Local State, zeroing out stored values.
(...skipping 10 matching lines...) Expand all
237 239
238 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); 240 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile();
239 for (size_t i = 0; i < metrics_providers.size(); ++i) 241 for (size_t i = 0; i < metrics_providers.size(); ++i)
240 metrics_providers[i]->ProvideStabilityMetrics(system_profile); 242 metrics_providers[i]->ProvideStabilityMetrics(system_profile);
241 243
242 // Omit some stats unless this is the initial stability log. 244 // Omit some stats unless this is the initial stability log.
243 if (log_type() != INITIAL_STABILITY_LOG) 245 if (log_type() != INITIAL_STABILITY_LOG)
244 return; 246 return;
245 247
246 int incomplete_shutdown_count = 248 int incomplete_shutdown_count =
247 pref->GetInteger(metrics::prefs::kStabilityIncompleteSessionEndCount); 249 pref->GetInteger(prefs::kStabilityIncompleteSessionEndCount);
248 pref->SetInteger(metrics::prefs::kStabilityIncompleteSessionEndCount, 0); 250 pref->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0);
249 int breakpad_registration_success_count = 251 int breakpad_registration_success_count =
250 pref->GetInteger(metrics::prefs::kStabilityBreakpadRegistrationSuccess); 252 pref->GetInteger(prefs::kStabilityBreakpadRegistrationSuccess);
251 pref->SetInteger(metrics::prefs::kStabilityBreakpadRegistrationSuccess, 0); 253 pref->SetInteger(prefs::kStabilityBreakpadRegistrationSuccess, 0);
252 int breakpad_registration_failure_count = 254 int breakpad_registration_failure_count =
253 pref->GetInteger(metrics::prefs::kStabilityBreakpadRegistrationFail); 255 pref->GetInteger(prefs::kStabilityBreakpadRegistrationFail);
254 pref->SetInteger(metrics::prefs::kStabilityBreakpadRegistrationFail, 0); 256 pref->SetInteger(prefs::kStabilityBreakpadRegistrationFail, 0);
255 int debugger_present_count = 257 int debugger_present_count =
256 pref->GetInteger(metrics::prefs::kStabilityDebuggerPresent); 258 pref->GetInteger(prefs::kStabilityDebuggerPresent);
257 pref->SetInteger(metrics::prefs::kStabilityDebuggerPresent, 0); 259 pref->SetInteger(prefs::kStabilityDebuggerPresent, 0);
258 int debugger_not_present_count = 260 int debugger_not_present_count =
259 pref->GetInteger(metrics::prefs::kStabilityDebuggerNotPresent); 261 pref->GetInteger(prefs::kStabilityDebuggerNotPresent);
260 pref->SetInteger(metrics::prefs::kStabilityDebuggerNotPresent, 0); 262 pref->SetInteger(prefs::kStabilityDebuggerNotPresent, 0);
261 263
262 // TODO(jar): The following are all optional, so we *could* optimize them for 264 // TODO(jar): The following are all optional, so we *could* optimize them for
263 // values of zero (and not include them). 265 // values of zero (and not include them).
264 SystemProfileProto::Stability* stability = 266 SystemProfileProto::Stability* stability =
265 system_profile->mutable_stability(); 267 system_profile->mutable_stability();
266 stability->set_incomplete_shutdown_count(incomplete_shutdown_count); 268 stability->set_incomplete_shutdown_count(incomplete_shutdown_count);
267 stability->set_breakpad_registration_success_count( 269 stability->set_breakpad_registration_success_count(
268 breakpad_registration_success_count); 270 breakpad_registration_success_count);
269 stability->set_breakpad_registration_failure_count( 271 stability->set_breakpad_registration_failure_count(
270 breakpad_registration_failure_count); 272 breakpad_registration_failure_count);
271 stability->set_debugger_present_count(debugger_present_count); 273 stability->set_debugger_present_count(debugger_present_count);
272 stability->set_debugger_not_present_count(debugger_not_present_count); 274 stability->set_debugger_not_present_count(debugger_not_present_count);
273 } 275 }
274 276
275 void MetricsLog::RecordGeneralMetrics( 277 void MetricsLog::RecordGeneralMetrics(
276 const std::vector<metrics::MetricsProvider*>& metrics_providers) { 278 const std::vector<MetricsProvider*>& metrics_providers) {
277 for (size_t i = 0; i < metrics_providers.size(); ++i) 279 for (size_t i = 0; i < metrics_providers.size(); ++i)
278 metrics_providers[i]->ProvideGeneralMetrics(uma_proto()); 280 metrics_providers[i]->ProvideGeneralMetrics(uma_proto());
279 } 281 }
280 282
281 void MetricsLog::GetFieldTrialIds( 283 void MetricsLog::GetFieldTrialIds(
282 std::vector<ActiveGroupId>* field_trial_ids) const { 284 std::vector<ActiveGroupId>* field_trial_ids) const {
283 variations::GetFieldTrialActiveGroupIds(field_trial_ids); 285 variations::GetFieldTrialActiveGroupIds(field_trial_ids);
284 } 286 }
285 287
286 bool MetricsLog::HasEnvironment() const { 288 bool MetricsLog::HasEnvironment() const {
287 return uma_proto()->system_profile().has_uma_enabled_date(); 289 return uma_proto()->system_profile().has_uma_enabled_date();
288 } 290 }
289 291
290 bool MetricsLog::HasStabilityMetrics() const { 292 bool MetricsLog::HasStabilityMetrics() const {
291 return uma_proto()->system_profile().stability().has_launch_count(); 293 return uma_proto()->system_profile().stability().has_launch_count();
292 } 294 }
293 295
294 // The server refuses data that doesn't have certain values. crashcount and 296 // The server refuses data that doesn't have certain values. crashcount and
295 // launchcount are currently "required" in the "stability" group. 297 // launchcount are currently "required" in the "stability" group.
296 // TODO(isherman): Stop writing these attributes specially once the migration to 298 // TODO(isherman): Stop writing these attributes specially once the migration to
297 // protobufs is complete. 299 // protobufs is complete.
298 void MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) { 300 void MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) {
299 int launch_count = pref->GetInteger(metrics::prefs::kStabilityLaunchCount); 301 int launch_count = pref->GetInteger(prefs::kStabilityLaunchCount);
300 pref->SetInteger(metrics::prefs::kStabilityLaunchCount, 0); 302 pref->SetInteger(prefs::kStabilityLaunchCount, 0);
301 int crash_count = pref->GetInteger(metrics::prefs::kStabilityCrashCount); 303 int crash_count = pref->GetInteger(prefs::kStabilityCrashCount);
302 pref->SetInteger(metrics::prefs::kStabilityCrashCount, 0); 304 pref->SetInteger(prefs::kStabilityCrashCount, 0);
303 305
304 SystemProfileProto::Stability* stability = 306 SystemProfileProto::Stability* stability =
305 uma_proto()->mutable_system_profile()->mutable_stability(); 307 uma_proto()->mutable_system_profile()->mutable_stability();
306 stability->set_launch_count(launch_count); 308 stability->set_launch_count(launch_count);
307 stability->set_crash_count(crash_count); 309 stability->set_crash_count(crash_count);
308 } 310 }
309 311
310 void MetricsLog::WriteRealtimeStabilityAttributes( 312 void MetricsLog::WriteRealtimeStabilityAttributes(
311 PrefService* pref, 313 PrefService* pref,
312 base::TimeDelta incremental_uptime, 314 base::TimeDelta incremental_uptime,
313 base::TimeDelta uptime) { 315 base::TimeDelta uptime) {
314 // Update the stats which are critical for real-time stability monitoring. 316 // Update the stats which are critical for real-time stability monitoring.
315 // Since these are "optional," only list ones that are non-zero, as the counts 317 // Since these are "optional," only list ones that are non-zero, as the counts
316 // are aggregated (summed) server side. 318 // are aggregated (summed) server side.
317 319
318 SystemProfileProto::Stability* stability = 320 SystemProfileProto::Stability* stability =
319 uma_proto()->mutable_system_profile()->mutable_stability(); 321 uma_proto()->mutable_system_profile()->mutable_stability();
320 322
321 const uint64 incremental_uptime_sec = incremental_uptime.InSeconds(); 323 const uint64 incremental_uptime_sec = incremental_uptime.InSeconds();
322 if (incremental_uptime_sec) 324 if (incremental_uptime_sec)
323 stability->set_incremental_uptime_sec(incremental_uptime_sec); 325 stability->set_incremental_uptime_sec(incremental_uptime_sec);
324 const uint64 uptime_sec = uptime.InSeconds(); 326 const uint64 uptime_sec = uptime.InSeconds();
325 if (uptime_sec) 327 if (uptime_sec)
326 stability->set_uptime_sec(uptime_sec); 328 stability->set_uptime_sec(uptime_sec);
327 } 329 }
328 330
329 void MetricsLog::RecordEnvironment( 331 void MetricsLog::RecordEnvironment(
330 const std::vector<metrics::MetricsProvider*>& metrics_providers, 332 const std::vector<MetricsProvider*>& metrics_providers,
331 const std::vector<variations::ActiveGroupId>& synthetic_trials, 333 const std::vector<variations::ActiveGroupId>& synthetic_trials,
332 int64 install_date) { 334 int64 install_date) {
333 DCHECK(!HasEnvironment()); 335 DCHECK(!HasEnvironment());
334 336
335 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); 337 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile();
336 338
337 std::string brand_code; 339 std::string brand_code;
338 if (client_->GetBrand(&brand_code)) 340 if (client_->GetBrand(&brand_code))
339 system_profile->set_brand_code(brand_code); 341 system_profile->set_brand_code(brand_code);
340 342
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 WriteFieldTrials(synthetic_trials, system_profile); 393 WriteFieldTrials(synthetic_trials, system_profile);
392 394
393 for (size_t i = 0; i < metrics_providers.size(); ++i) 395 for (size_t i = 0; i < metrics_providers.size(); ++i)
394 metrics_providers[i]->ProvideSystemProfileMetrics(system_profile); 396 metrics_providers[i]->ProvideSystemProfileMetrics(system_profile);
395 397
396 std::string serialied_system_profile; 398 std::string serialied_system_profile;
397 std::string base64_system_profile; 399 std::string base64_system_profile;
398 if (system_profile->SerializeToString(&serialied_system_profile)) { 400 if (system_profile->SerializeToString(&serialied_system_profile)) {
399 base::Base64Encode(serialied_system_profile, &base64_system_profile); 401 base::Base64Encode(serialied_system_profile, &base64_system_profile);
400 PrefService* local_state = local_state_; 402 PrefService* local_state = local_state_;
401 local_state->SetString(metrics::prefs::kStabilitySavedSystemProfile, 403 local_state->SetString(prefs::kStabilitySavedSystemProfile,
402 base64_system_profile); 404 base64_system_profile);
403 local_state->SetString(metrics::prefs::kStabilitySavedSystemProfileHash, 405 local_state->SetString(prefs::kStabilitySavedSystemProfileHash,
404 ComputeSHA1(serialied_system_profile)); 406 ComputeSHA1(serialied_system_profile));
405 } 407 }
406 } 408 }
407 409
408 bool MetricsLog::LoadSavedEnvironmentFromPrefs() { 410 bool MetricsLog::LoadSavedEnvironmentFromPrefs() {
409 PrefService* local_state = local_state_; 411 PrefService* local_state = local_state_;
410 const std::string base64_system_profile = 412 const std::string base64_system_profile =
411 local_state->GetString(metrics::prefs::kStabilitySavedSystemProfile); 413 local_state->GetString(prefs::kStabilitySavedSystemProfile);
412 if (base64_system_profile.empty()) 414 if (base64_system_profile.empty())
413 return false; 415 return false;
414 416
415 const std::string system_profile_hash = 417 const std::string system_profile_hash =
416 local_state->GetString(metrics::prefs::kStabilitySavedSystemProfileHash); 418 local_state->GetString(prefs::kStabilitySavedSystemProfileHash);
417 local_state->ClearPref(metrics::prefs::kStabilitySavedSystemProfile); 419 local_state->ClearPref(prefs::kStabilitySavedSystemProfile);
418 local_state->ClearPref(metrics::prefs::kStabilitySavedSystemProfileHash); 420 local_state->ClearPref(prefs::kStabilitySavedSystemProfileHash);
419 421
420 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); 422 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile();
421 std::string serialied_system_profile; 423 std::string serialied_system_profile;
422 return base::Base64Decode(base64_system_profile, &serialied_system_profile) && 424 return base::Base64Decode(base64_system_profile, &serialied_system_profile) &&
423 ComputeSHA1(serialied_system_profile) == system_profile_hash && 425 ComputeSHA1(serialied_system_profile) == system_profile_hash &&
424 system_profile->ParseFromString(serialied_system_profile); 426 system_profile->ParseFromString(serialied_system_profile);
425 } 427 }
426 428
427 void MetricsLog::CloseLog() { 429 void MetricsLog::CloseLog() {
428 DCHECK(!closed_); 430 DCHECK(!closed_);
429 closed_ = true; 431 closed_ = true;
430 } 432 }
431 433
432 void MetricsLog::GetEncodedLog(std::string* encoded_log) { 434 void MetricsLog::GetEncodedLog(std::string* encoded_log) {
433 DCHECK(closed_); 435 DCHECK(closed_);
434 uma_proto_.SerializeToString(encoded_log); 436 uma_proto_.SerializeToString(encoded_log);
435 } 437 }
436 438
437 } // namespace metrics 439 } // namespace metrics
OLDNEW
« no previous file with comments | « chromecast/metrics/cast_metrics_service_client.cc ('k') | components/metrics/metrics_log_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698