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 //------------------------------------------------------------------------------ | 5 //------------------------------------------------------------------------------ |
6 // Description of the life cycle of a instance of MetricsService. | 6 // Description of the life cycle of a instance of MetricsService. |
7 // | 7 // |
8 // OVERVIEW | 8 // OVERVIEW |
9 // | 9 // |
10 // A MetricsService instance is typically created at application startup. It | 10 // A MetricsService instance is typically created at application startup. It |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 #include "chrome/browser/prefs/pref_service.h" | 178 #include "chrome/browser/prefs/pref_service.h" |
179 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 179 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
180 #include "chrome/browser/profiles/profile.h" | 180 #include "chrome/browser/profiles/profile.h" |
181 #include "chrome/browser/search_engines/template_url_service.h" | 181 #include "chrome/browser/search_engines/template_url_service.h" |
182 #include "chrome/browser/ui/browser_list.h" | 182 #include "chrome/browser/ui/browser_list.h" |
183 #include "chrome/browser/ui/browser_otr_state.h" | 183 #include "chrome/browser/ui/browser_otr_state.h" |
184 #include "chrome/common/child_process_logging.h" | 184 #include "chrome/common/child_process_logging.h" |
185 #include "chrome/common/chrome_notification_types.h" | 185 #include "chrome/common/chrome_notification_types.h" |
186 #include "chrome/common/chrome_result_codes.h" | 186 #include "chrome/common/chrome_result_codes.h" |
187 #include "chrome/common/chrome_switches.h" | 187 #include "chrome/common/chrome_switches.h" |
| 188 #include "chrome/common/metrics/entropy_provider.h" |
188 #include "chrome/common/metrics/metrics_log_manager.h" | 189 #include "chrome/common/metrics/metrics_log_manager.h" |
189 #include "chrome/common/net/test_server_locations.h" | 190 #include "chrome/common/net/test_server_locations.h" |
190 #include "chrome/common/pref_names.h" | 191 #include "chrome/common/pref_names.h" |
191 #include "chrome/common/render_messages.h" | 192 #include "chrome/common/render_messages.h" |
192 #include "content/public/browser/child_process_data.h" | 193 #include "content/public/browser/child_process_data.h" |
193 #include "content/public/browser/histogram_fetcher.h" | 194 #include "content/public/browser/histogram_fetcher.h" |
194 #include "content/public/browser/load_notification_details.h" | 195 #include "content/public/browser/load_notification_details.h" |
195 #include "content/public/browser/notification_service.h" | 196 #include "content/public/browser/notification_service.h" |
196 #include "content/public/browser/plugin_service.h" | 197 #include "content/public/browser/plugin_service.h" |
197 #include "content/public/browser/render_process_host.h" | 198 #include "content/public/browser/render_process_host.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 case net::URLFetcher::RESPONSE_CODE_INVALID: | 268 case net::URLFetcher::RESPONSE_CODE_INVALID: |
268 return NO_RESPONSE; | 269 return NO_RESPONSE; |
269 default: | 270 default: |
270 return UNKNOWN_FAILURE; | 271 return UNKNOWN_FAILURE; |
271 } | 272 } |
272 } | 273 } |
273 | 274 |
274 // The argument used to generate a non-identifying entropy source. We want no | 275 // The argument used to generate a non-identifying entropy source. We want no |
275 // more than 13 bits of entropy, so use this max to return a number between 1 | 276 // more than 13 bits of entropy, so use this max to return a number between 1 |
276 // and 2^13 = 8192 as the entropy source. | 277 // and 2^13 = 8192 as the entropy source. |
277 const uint32 kMaxEntropySize = (1 << 13); | 278 const uint32 kMaxLowEntropySize = (1 << 13); |
278 | 279 |
279 // Generates a new non-identifying entropy source used to seed persistent | 280 // Generates a new non-identifying entropy source used to seed persistent |
280 // activities. | 281 // activities. |
281 int GenerateLowEntropySource() { | 282 int GenerateLowEntropySource() { |
282 return base::RandInt(1, kMaxEntropySize); | 283 return base::RandInt(0, kMaxLowEntropySize - 1); |
283 } | 284 } |
284 | 285 |
285 // Converts an exit code into something that can be inserted into our | 286 // Converts an exit code into something that can be inserted into our |
286 // histograms (which expect non-negative numbers less than MAX_INT). | 287 // histograms (which expect non-negative numbers less than MAX_INT). |
287 int MapCrashExitCodeForHistogram(int exit_code) { | 288 int MapCrashExitCodeForHistogram(int exit_code) { |
288 #if defined(OS_WIN) | 289 #if defined(OS_WIN) |
289 // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in | 290 // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in |
290 // histograms.cc. Solve this by remapping it to a smaller value, which | 291 // histograms.cc. Solve this by remapping it to a smaller value, which |
291 // hopefully doesn't conflict with other codes. | 292 // hopefully doesn't conflict with other codes. |
292 if (exit_code == STATUS_GUARD_PAGE_VIOLATION) | 293 if (exit_code == STATUS_GUARD_PAGE_VIOLATION) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 STATUS_STACK_OVERFLOW, | 338 STATUS_STACK_OVERFLOW, |
338 }; | 339 }; |
339 | 340 |
340 for (size_t i = 0; i < arraysize(kExceptionCodes); ++i) | 341 for (size_t i = 0; i < arraysize(kExceptionCodes); ++i) |
341 codes.push_back(MapCrashExitCodeForHistogram(kExceptionCodes[i])); | 342 codes.push_back(MapCrashExitCodeForHistogram(kExceptionCodes[i])); |
342 #endif | 343 #endif |
343 | 344 |
344 return codes; | 345 return codes; |
345 } | 346 } |
346 | 347 |
347 } | 348 } // namespace |
348 | 349 |
349 // static | 350 // static |
350 MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = | 351 MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = |
351 MetricsService::CLEANLY_SHUTDOWN; | 352 MetricsService::CLEANLY_SHUTDOWN; |
352 | 353 |
353 // This is used to quickly log stats from child process related notifications in | 354 // This is used to quickly log stats from child process related notifications in |
354 // MetricsService::child_stats_buffer_. The buffer's contents are transferred | 355 // MetricsService::child_stats_buffer_. The buffer's contents are transferred |
355 // out when Local State is periodically saved. The information is then | 356 // out when Local State is periodically saved. The information is then |
356 // reported to the UMA server on next launch. | 357 // reported to the UMA server on next launch. |
357 struct MetricsService::ChildProcessStats { | 358 struct MetricsService::ChildProcessStats { |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 void MetricsService::Stop() { | 533 void MetricsService::Stop() { |
533 HandleIdleSinceLastTransmission(false); | 534 HandleIdleSinceLastTransmission(false); |
534 SetReporting(false); | 535 SetReporting(false); |
535 SetRecording(false); | 536 SetRecording(false); |
536 } | 537 } |
537 | 538 |
538 std::string MetricsService::GetClientId() { | 539 std::string MetricsService::GetClientId() { |
539 return client_id_; | 540 return client_id_; |
540 } | 541 } |
541 | 542 |
542 std::string MetricsService::GetEntropySource(bool reporting_will_be_enabled) { | 543 scoped_ptr<const base::FieldTrial::EntropyProvider> |
| 544 MetricsService::CreateEntropyProvider(bool reporting_will_be_enabled) { |
543 // For metrics reporting-enabled users, we combine the client ID and low | 545 // For metrics reporting-enabled users, we combine the client ID and low |
544 // entropy source to get the final entropy source. Otherwise, only use the low | 546 // entropy source to get the final entropy source. Otherwise, only use the low |
545 // entropy source. | 547 // entropy source. |
546 // This has two useful properties: | 548 // This has two useful properties: |
547 // 1) It makes the entropy source less identifiable for parties that do not | 549 // 1) It makes the entropy source less identifiable for parties that do not |
548 // know the low entropy source. | 550 // know the low entropy source. |
549 // 2) It makes the final entropy source resettable. | 551 // 2) It makes the final entropy source resettable. |
550 std::string low_entropy_source = base::IntToString(GetLowEntropySource()); | |
551 if (reporting_will_be_enabled) { | 552 if (reporting_will_be_enabled) { |
552 if (entropy_source_returned_ == LAST_ENTROPY_NONE) | 553 if (entropy_source_returned_ == LAST_ENTROPY_NONE) |
553 entropy_source_returned_ = LAST_ENTROPY_HIGH; | 554 entropy_source_returned_ = LAST_ENTROPY_HIGH; |
554 DCHECK_EQ(LAST_ENTROPY_HIGH, entropy_source_returned_); | 555 DCHECK_EQ(LAST_ENTROPY_HIGH, entropy_source_returned_); |
555 return client_id_ + low_entropy_source; | 556 const std::string high_entropy_source = |
| 557 client_id_ + base::IntToString(GetLowEntropySource()); |
| 558 return scoped_ptr<const base::FieldTrial::EntropyProvider>( |
| 559 new metrics::SHA1EntropyProvider(high_entropy_source)); |
556 } | 560 } |
| 561 |
557 if (entropy_source_returned_ == LAST_ENTROPY_NONE) | 562 if (entropy_source_returned_ == LAST_ENTROPY_NONE) |
558 entropy_source_returned_ = LAST_ENTROPY_LOW; | 563 entropy_source_returned_ = LAST_ENTROPY_LOW; |
559 DCHECK_EQ(LAST_ENTROPY_LOW, entropy_source_returned_); | 564 DCHECK_EQ(LAST_ENTROPY_LOW, entropy_source_returned_); |
560 return low_entropy_source; | 565 return scoped_ptr<const base::FieldTrial::EntropyProvider>( |
| 566 new metrics::PermutedEntropyProvider(GetLowEntropySource(), |
| 567 kMaxLowEntropySize)); |
561 } | 568 } |
562 | 569 |
563 void MetricsService::ForceClientIdCreation() { | 570 void MetricsService::ForceClientIdCreation() { |
564 if (!client_id_.empty()) | 571 if (!client_id_.empty()) |
565 return; | 572 return; |
566 PrefService* pref = g_browser_process->local_state(); | 573 PrefService* pref = g_browser_process->local_state(); |
567 client_id_ = pref->GetString(prefs::kMetricsClientID); | 574 client_id_ = pref->GetString(prefs::kMetricsClientID); |
568 if (!client_id_.empty()) | 575 if (!client_id_.empty()) |
569 return; | 576 return; |
570 | 577 |
(...skipping 1342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1913 if (local_state) { | 1920 if (local_state) { |
1914 const PrefService::Preference* uma_pref = | 1921 const PrefService::Preference* uma_pref = |
1915 local_state->FindPreference(prefs::kMetricsReportingEnabled); | 1922 local_state->FindPreference(prefs::kMetricsReportingEnabled); |
1916 if (uma_pref) { | 1923 if (uma_pref) { |
1917 bool success = uma_pref->GetValue()->GetAsBoolean(&result); | 1924 bool success = uma_pref->GetValue()->GetAsBoolean(&result); |
1918 DCHECK(success); | 1925 DCHECK(success); |
1919 } | 1926 } |
1920 } | 1927 } |
1921 return result; | 1928 return result; |
1922 } | 1929 } |
OLD | NEW |