| 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 "content/browser/download/download_stats.h" | 5 #include "content/browser/download/download_stats.h" |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/metrics/histogram_functions.h" | 8 #include "base/metrics/histogram_functions.h" |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.DownloadSize", | 382 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.DownloadSize", |
| 383 download_len, | 383 download_len, |
| 384 1, | 384 1, |
| 385 max, | 385 max, |
| 386 256); | 386 256); |
| 387 } | 387 } |
| 388 | 388 |
| 389 void RecordDownloadInterrupted(DownloadInterruptReason reason, | 389 void RecordDownloadInterrupted(DownloadInterruptReason reason, |
| 390 int64_t received, | 390 int64_t received, |
| 391 int64_t total, | 391 int64_t total, |
| 392 bool uses_parallel_requests) { | 392 bool is_parallelizable, |
| 393 bool is_parallel_download_enabled) { |
| 393 RecordDownloadCount(INTERRUPTED_COUNT); | 394 RecordDownloadCount(INTERRUPTED_COUNT); |
| 394 if (uses_parallel_requests) | 395 if (is_parallelizable) { |
| 395 RecordParallelDownloadCount(INTERRUPTED_COUNT); | 396 RecordParallelizableDownloadCount(INTERRUPTED_COUNT, |
| 397 is_parallel_download_enabled); |
| 398 } |
| 396 | 399 |
| 397 std::vector<base::HistogramBase::Sample> samples = | 400 std::vector<base::HistogramBase::Sample> samples = |
| 398 base::CustomHistogram::ArrayToCustomRanges( | 401 base::CustomHistogram::ArrayToCustomRanges( |
| 399 kAllInterruptReasonCodes, arraysize(kAllInterruptReasonCodes)); | 402 kAllInterruptReasonCodes, arraysize(kAllInterruptReasonCodes)); |
| 400 UMA_HISTOGRAM_CUSTOM_ENUMERATION("Download.InterruptedReason", reason, | 403 UMA_HISTOGRAM_CUSTOM_ENUMERATION("Download.InterruptedReason", reason, |
| 401 samples); | 404 samples); |
| 402 if (uses_parallel_requests) { | 405 if (is_parallel_download_enabled) { |
| 403 UMA_HISTOGRAM_CUSTOM_ENUMERATION( | 406 UMA_HISTOGRAM_CUSTOM_ENUMERATION( |
| 404 "Download.InterruptedReason.ParallelDownload", reason, samples); | 407 "Download.InterruptedReason.ParallelDownload", reason, samples); |
| 405 } | 408 } |
| 406 | 409 |
| 407 // The maximum should be 2^kBuckets, to have the logarithmic bucket | 410 // The maximum should be 2^kBuckets, to have the logarithmic bucket |
| 408 // boundaries fall on powers of 2. | 411 // boundaries fall on powers of 2. |
| 409 static const int kBuckets = 30; | 412 static const int kBuckets = 30; |
| 410 static const int64_t kMaxKb = 1 << kBuckets; // One Terabyte, in Kilobytes. | 413 static const int64_t kMaxKb = 1 << kBuckets; // One Terabyte, in Kilobytes. |
| 411 int64_t delta_bytes = total - received; | 414 int64_t delta_bytes = total - received; |
| 412 bool unknown_size = total <= 0; | 415 bool unknown_size = total <= 0; |
| 413 int64_t received_kb = received / 1024; | 416 int64_t received_kb = received / 1024; |
| 414 int64_t total_kb = total / 1024; | 417 int64_t total_kb = total / 1024; |
| 415 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedReceivedSizeK", | 418 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedReceivedSizeK", |
| 416 received_kb, | 419 received_kb, |
| 417 1, | 420 1, |
| 418 kMaxKb, | 421 kMaxKb, |
| 419 kBuckets); | 422 kBuckets); |
| 420 if (uses_parallel_requests) { | 423 if (is_parallel_download_enabled) { |
| 421 UMA_HISTOGRAM_CUSTOM_COUNTS( | 424 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 422 "Download.InterruptedReceivedSizeK.ParallelDownload", received_kb, 1, | 425 "Download.InterruptedReceivedSizeK.ParallelDownload", received_kb, 1, |
| 423 kMaxKb, kBuckets); | 426 kMaxKb, kBuckets); |
| 424 } | 427 } |
| 425 | 428 |
| 426 if (!unknown_size) { | 429 if (!unknown_size) { |
| 427 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedTotalSizeK", | 430 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedTotalSizeK", |
| 428 total_kb, | 431 total_kb, |
| 429 1, | 432 1, |
| 430 kMaxKb, | 433 kMaxKb, |
| 431 kBuckets); | 434 kBuckets); |
| 432 if (uses_parallel_requests) { | 435 if (is_parallel_download_enabled) { |
| 433 UMA_HISTOGRAM_CUSTOM_COUNTS( | 436 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 434 "Download.InterruptedTotalSizeK.ParallelDownload", total_kb, 1, | 437 "Download.InterruptedTotalSizeK.ParallelDownload", total_kb, 1, |
| 435 kMaxKb, kBuckets); | 438 kMaxKb, kBuckets); |
| 436 } | 439 } |
| 437 if (delta_bytes == 0) { | 440 if (delta_bytes == 0) { |
| 438 RecordDownloadCount(INTERRUPTED_AT_END_COUNT); | 441 RecordDownloadCount(INTERRUPTED_AT_END_COUNT); |
| 439 UMA_HISTOGRAM_CUSTOM_ENUMERATION("Download.InterruptedAtEndReason", | 442 UMA_HISTOGRAM_CUSTOM_ENUMERATION("Download.InterruptedAtEndReason", |
| 440 reason, samples); | 443 reason, samples); |
| 441 | 444 |
| 442 if (uses_parallel_requests) { | 445 if (is_parallelizable) { |
| 443 RecordParallelDownloadCount(INTERRUPTED_AT_END_COUNT); | 446 RecordParallelizableDownloadCount(INTERRUPTED_AT_END_COUNT, |
| 447 is_parallel_download_enabled); |
| 444 UMA_HISTOGRAM_CUSTOM_ENUMERATION( | 448 UMA_HISTOGRAM_CUSTOM_ENUMERATION( |
| 445 "Download.InterruptedAtEndReason.ParallelDownload", reason, | 449 "Download.InterruptedAtEndReason.ParallelDownload", reason, |
| 446 samples); | 450 samples); |
| 447 } | 451 } |
| 448 } else if (delta_bytes > 0) { | 452 } else if (delta_bytes > 0) { |
| 449 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedOverrunBytes", | 453 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedOverrunBytes", |
| 450 delta_bytes, | 454 delta_bytes, |
| 451 1, | 455 1, |
| 452 kMaxKb, | 456 kMaxKb, |
| 453 kBuckets); | 457 kBuckets); |
| 454 if (uses_parallel_requests) { | 458 if (is_parallel_download_enabled) { |
| 455 UMA_HISTOGRAM_CUSTOM_COUNTS( | 459 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 456 "Download.InterruptedOverrunBytes.ParallelDownload", delta_bytes, 1, | 460 "Download.InterruptedOverrunBytes.ParallelDownload", delta_bytes, 1, |
| 457 kMaxKb, kBuckets); | 461 kMaxKb, kBuckets); |
| 458 } | 462 } |
| 459 } else { | 463 } else { |
| 460 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedUnderrunBytes", | 464 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.InterruptedUnderrunBytes", |
| 461 -delta_bytes, | 465 -delta_bytes, |
| 462 1, | 466 1, |
| 463 kMaxKb, | 467 kMaxKb, |
| 464 kBuckets); | 468 kBuckets); |
| 465 if (uses_parallel_requests) { | 469 if (is_parallel_download_enabled) { |
| 466 UMA_HISTOGRAM_CUSTOM_COUNTS( | 470 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 467 "Download.InterruptedUnderrunBytes.ParallelDownload", -delta_bytes, | 471 "Download.InterruptedUnderrunBytes.ParallelDownload", -delta_bytes, |
| 468 1, kMaxKb, kBuckets); | 472 1, kMaxKb, kBuckets); |
| 469 } | 473 } |
| 470 } | 474 } |
| 471 } | 475 } |
| 472 | 476 |
| 473 UMA_HISTOGRAM_BOOLEAN("Download.InterruptedUnknownSize", unknown_size); | 477 UMA_HISTOGRAM_BOOLEAN("Download.InterruptedUnknownSize", unknown_size); |
| 474 } | 478 } |
| 475 | 479 |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 void RecordFileBandwidth(size_t length, | 764 void RecordFileBandwidth(size_t length, |
| 761 base::TimeDelta disk_write_time, | 765 base::TimeDelta disk_write_time, |
| 762 base::TimeDelta elapsed_time) { | 766 base::TimeDelta elapsed_time) { |
| 763 RecordBandwidthMetric("Download.BandwidthOverallBytesPerSecond", | 767 RecordBandwidthMetric("Download.BandwidthOverallBytesPerSecond", |
| 764 CalculateBandwidthBytesPerSecond(length, elapsed_time)); | 768 CalculateBandwidthBytesPerSecond(length, elapsed_time)); |
| 765 RecordBandwidthMetric( | 769 RecordBandwidthMetric( |
| 766 "Download.BandwidthDiskBytesPerSecond", | 770 "Download.BandwidthDiskBytesPerSecond", |
| 767 CalculateBandwidthBytesPerSecond(length, disk_write_time)); | 771 CalculateBandwidthBytesPerSecond(length, disk_write_time)); |
| 768 } | 772 } |
| 769 | 773 |
| 770 void RecordParallelDownloadCount(DownloadCountTypes type) { | 774 void RecordParallelizableDownloadCount(DownloadCountTypes type, |
| 771 UMA_HISTOGRAM_ENUMERATION("Download.Counts.ParallelDownload", type, | 775 bool is_parallel_download_enabled) { |
| 772 DOWNLOAD_COUNT_TYPES_LAST_ENTRY); | 776 std::string histogram_name = is_parallel_download_enabled |
| 777 ? "Download.Counts.ParallelDownload" |
| 778 : "Download.Counts.ParallelizableDownload"; |
| 779 base::UmaHistogramEnumeration(histogram_name, type, |
| 780 DOWNLOAD_COUNT_TYPES_LAST_ENTRY); |
| 773 } | 781 } |
| 774 | 782 |
| 775 void RecordParallelDownloadRequestCount(int request_count) { | 783 void RecordParallelDownloadRequestCount(int request_count) { |
| 776 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.ParallelDownloadRequestCount", | 784 UMA_HISTOGRAM_CUSTOM_COUNTS("Download.ParallelDownloadRequestCount", |
| 777 request_count, 1, 10, 11); | 785 request_count, 1, 10, 11); |
| 778 } | 786 } |
| 779 | 787 |
| 780 void RecordParallelDownloadAddStreamSuccess(bool success) { | 788 void RecordParallelDownloadAddStreamSuccess(bool success) { |
| 781 UMA_HISTOGRAM_BOOLEAN("Download.ParallelDownloadAddStreamSuccess", success); | 789 UMA_HISTOGRAM_BOOLEAN("Download.ParallelDownloadAddStreamSuccess", success); |
| 782 } | 790 } |
| 783 | 791 |
| 784 void RecordParallelDownloadStats( | 792 void RecordParallelizableDownloadStats( |
| 785 size_t bytes_downloaded_with_parallel_streams, | 793 size_t bytes_downloaded_with_parallel_streams, |
| 786 base::TimeDelta time_with_parallel_streams, | 794 base::TimeDelta time_with_parallel_streams, |
| 787 size_t bytes_downloaded_without_parallel_streams, | 795 size_t bytes_downloaded_without_parallel_streams, |
| 788 base::TimeDelta time_without_parallel_streams) { | 796 base::TimeDelta time_without_parallel_streams, |
| 789 int64_t bandwidth_without_parallel_streams = CalculateBandwidthBytesPerSecond( | 797 bool uses_parallel_requests) { |
| 790 bytes_downloaded_without_parallel_streams, time_without_parallel_streams); | 798 int64_t bandwidth_without_parallel_streams = 0; |
| 791 RecordBandwidthMetric( | 799 if (bytes_downloaded_without_parallel_streams > 0) { |
| 792 "Download.BandwidthWithoutParallelStreamsBytesPerSecond", | 800 bandwidth_without_parallel_streams = CalculateBandwidthBytesPerSecond( |
| 793 bandwidth_without_parallel_streams); | 801 bytes_downloaded_without_parallel_streams, |
| 794 RecordBandwidthMetric( | 802 time_without_parallel_streams); |
| 795 "Download.BandwidthWithParallelStreamsBytesPerSecond", | 803 if (uses_parallel_requests) { |
| 796 CalculateBandwidthBytesPerSecond(bytes_downloaded_with_parallel_streams, | 804 RecordBandwidthMetric( |
| 797 time_with_parallel_streams)); | 805 "Download.ParallelizableDownloadBandwidth." |
| 806 "WithParallelRequestsSingleStream", |
| 807 bandwidth_without_parallel_streams); |
| 808 } else { |
| 809 RecordBandwidthMetric( |
| 810 "Download.ParallelizableDownloadBandwidth." |
| 811 "WithoutParallelRequests", |
| 812 bandwidth_without_parallel_streams); |
| 813 } |
| 814 } |
| 815 |
| 816 if (!uses_parallel_requests) |
| 817 return; |
| 818 |
| 819 if (bytes_downloaded_with_parallel_streams > 0) { |
| 820 RecordBandwidthMetric( |
| 821 "Download.ParallelizableDownloadBandwidth." |
| 822 "WithParallelRequestsMultipleStreams", |
| 823 CalculateBandwidthBytesPerSecond(bytes_downloaded_with_parallel_streams, |
| 824 time_with_parallel_streams)); |
| 825 } |
| 798 | 826 |
| 799 base::TimeDelta time_saved; | 827 base::TimeDelta time_saved; |
| 800 if (bandwidth_without_parallel_streams > 0) { | 828 if (bandwidth_without_parallel_streams > 0) { |
| 801 time_saved = base::TimeDelta::FromMilliseconds( | 829 time_saved = base::TimeDelta::FromMilliseconds( |
| 802 1000.0 * bytes_downloaded_with_parallel_streams / | 830 1000.0 * bytes_downloaded_with_parallel_streams / |
| 803 bandwidth_without_parallel_streams) - | 831 bandwidth_without_parallel_streams) - |
| 804 time_with_parallel_streams; | 832 time_with_parallel_streams; |
| 805 } | 833 } |
| 806 int kMillisecondsPerHour = | 834 int kMillisecondsPerHour = |
| 807 base::checked_cast<int>(base::Time::kMillisecondsPerSecond * 60 * 60); | 835 base::checked_cast<int>(base::Time::kMillisecondsPerSecond * 60 * 60); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 if (!page_transition) | 926 if (!page_transition) |
| 899 return; | 927 return; |
| 900 | 928 |
| 901 UMA_HISTOGRAM_ENUMERATION( | 929 UMA_HISTOGRAM_ENUMERATION( |
| 902 "Download.PageTransition", | 930 "Download.PageTransition", |
| 903 ui::PageTransitionStripQualifier(page_transition.value()), | 931 ui::PageTransitionStripQualifier(page_transition.value()), |
| 904 ui::PAGE_TRANSITION_LAST_CORE + 1); | 932 ui::PAGE_TRANSITION_LAST_CORE + 1); |
| 905 } | 933 } |
| 906 | 934 |
| 907 } // namespace content | 935 } // namespace content |
| OLD | NEW |