| 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 "chrome/browser/prerender/prerender_histograms.h" | 5 #include "chrome/browser/prerender/prerender_histograms.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 REDIRECT = 1 << 1, | 29 REDIRECT = 1 << 1, |
| 30 MAIN_RESOURCE = 1 << 2, | 30 MAIN_RESOURCE = 1 << 2, |
| 31 NO_STATE_PREFETCH_RESPONSE_TYPE_COUNT = 1 << 3 | 31 NO_STATE_PREFETCH_RESPONSE_TYPE_COUNT = 1 << 3 |
| 32 }; | 32 }; |
| 33 | 33 |
| 34 int GetResourceType(bool is_main_resource, bool is_redirect, bool is_no_store) { | 34 int GetResourceType(bool is_main_resource, bool is_redirect, bool is_no_store) { |
| 35 return (is_no_store * NO_STORE) + (is_redirect * REDIRECT) + | 35 return (is_no_store * NO_STORE) + (is_redirect * REDIRECT) + |
| 36 (is_main_resource * MAIN_RESOURCE); | 36 (is_main_resource * MAIN_RESOURCE); |
| 37 } | 37 } |
| 38 | 38 |
| 39 // Similar to UMA_HISTOGRAM_ENUMERATION but allows a dynamic histogram name. | |
| 40 // Records a sample such as 0 <= sample < bucket_count, in a histogram with | |
| 41 // |bucket_count| buckets of width 1 each. | |
| 42 void RecordHistogramEnum(const std::string& histogram_name, | |
| 43 base::HistogramBase::Sample sample, | |
| 44 base::HistogramBase::Sample bucket_count) { | |
| 45 DCHECK_LT(sample, bucket_count); | |
| 46 base::HistogramBase* histogram_pointer = base::LinearHistogram::FactoryGet( | |
| 47 histogram_name, 1, bucket_count, bucket_count + 1, | |
| 48 base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 49 histogram_pointer->Add(sample); | |
| 50 } | |
| 51 | |
| 52 // Similar to UMA_HISTOGRAM_CUSTOM_TIMES but allows a dynamic histogram name. | |
| 53 void RecordHistogramTime(const std::string& histogram_name, | |
| 54 base::TimeDelta time_min, | |
| 55 base::TimeDelta time_max, | |
| 56 base::TimeDelta sample, | |
| 57 base::HistogramBase::Sample bucket_count) { | |
| 58 base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet( | |
| 59 histogram_name, time_min, time_max, bucket_count, | |
| 60 base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 61 histogram_pointer->AddTime(sample); | |
| 62 } | |
| 63 | |
| 64 // Time window for which we will record windowed PLTs from the last observed | 39 // Time window for which we will record windowed PLTs from the last observed |
| 65 // link rel=prefetch tag. This is not intended to be the same as the prerender | 40 // link rel=prefetch tag. This is not intended to be the same as the prerender |
| 66 // ttl, it's just intended to be a window during which a prerender has likely | 41 // ttl, it's just intended to be a window during which a prerender has likely |
| 67 // affected performance. | 42 // affected performance. |
| 68 const int kWindowDurationSeconds = 30; | 43 const int kWindowDurationSeconds = 30; |
| 69 | 44 |
| 70 std::string ComposeHistogramName(const std::string& prefix_type, | 45 std::string ComposeHistogramName(const std::string& prefix_type, |
| 71 const std::string& name) { | 46 const std::string& name) { |
| 72 if (prefix_type.empty()) | 47 if (prefix_type.empty()) |
| 73 return std::string("Prerender.") + name; | 48 return std::string("Prerender.") + name; |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 void PrerenderHistograms::RecordPrefetchResponseReceived( | 408 void PrerenderHistograms::RecordPrefetchResponseReceived( |
| 434 Origin origin, | 409 Origin origin, |
| 435 bool is_main_resource, | 410 bool is_main_resource, |
| 436 bool is_redirect, | 411 bool is_redirect, |
| 437 bool is_no_store) const { | 412 bool is_no_store) const { |
| 438 DCHECK(thread_checker_.CalledOnValidThread()); | 413 DCHECK(thread_checker_.CalledOnValidThread()); |
| 439 | 414 |
| 440 int sample = GetResourceType(is_main_resource, is_redirect, is_no_store); | 415 int sample = GetResourceType(is_main_resource, is_redirect, is_no_store); |
| 441 std::string histogram_name = | 416 std::string histogram_name = |
| 442 GetHistogramName(origin, IsOriginWash(), "NoStatePrefetchResponseTypes"); | 417 GetHistogramName(origin, IsOriginWash(), "NoStatePrefetchResponseTypes"); |
| 443 RecordHistogramEnum(histogram_name, sample, | 418 base::UmaHistogramExactLinear(histogram_name, sample, |
| 444 NO_STATE_PREFETCH_RESPONSE_TYPE_COUNT); | 419 NO_STATE_PREFETCH_RESPONSE_TYPE_COUNT); |
| 445 } | 420 } |
| 446 | 421 |
| 447 void PrerenderHistograms::RecordPrefetchRedirectCount( | 422 void PrerenderHistograms::RecordPrefetchRedirectCount( |
| 448 Origin origin, | 423 Origin origin, |
| 449 bool is_main_resource, | 424 bool is_main_resource, |
| 450 int redirect_count) const { | 425 int redirect_count) const { |
| 451 DCHECK(thread_checker_.CalledOnValidThread()); | 426 DCHECK(thread_checker_.CalledOnValidThread()); |
| 452 | 427 |
| 453 const int kMaxRedirectCount = 10; | 428 const int kMaxRedirectCount = 10; |
| 454 std::string histogram_base_name = base::StringPrintf( | 429 std::string histogram_base_name = base::StringPrintf( |
| 455 "NoStatePrefetch%sResourceRedirects", is_main_resource ? "Main" : "Sub"); | 430 "NoStatePrefetch%sResourceRedirects", is_main_resource ? "Main" : "Sub"); |
| 456 std::string histogram_name = | 431 std::string histogram_name = |
| 457 GetHistogramName(origin, IsOriginWash(), histogram_base_name); | 432 GetHistogramName(origin, IsOriginWash(), histogram_base_name); |
| 458 RecordHistogramEnum(histogram_name, redirect_count, kMaxRedirectCount); | 433 base::UmaHistogramExactLinear(histogram_name, redirect_count, |
| 434 kMaxRedirectCount); |
| 459 } | 435 } |
| 460 | 436 |
| 461 void PrerenderHistograms::RecordPrefetchFirstContentfulPaintTime( | 437 void PrerenderHistograms::RecordPrefetchFirstContentfulPaintTime( |
| 462 Origin origin, | 438 Origin origin, |
| 463 bool is_no_store, | 439 bool is_no_store, |
| 464 bool was_hidden, | 440 bool was_hidden, |
| 465 base::TimeDelta time, | 441 base::TimeDelta time, |
| 466 base::TimeDelta prefetch_age) { | 442 base::TimeDelta prefetch_age) { |
| 467 DCHECK(thread_checker_.CalledOnValidThread()); | 443 DCHECK(thread_checker_.CalledOnValidThread()); |
| 468 | 444 |
| 469 if (!prefetch_age.is_zero()) { | 445 if (!prefetch_age.is_zero()) { |
| 470 DCHECK_NE(origin, ORIGIN_NONE); | 446 DCHECK_NE(origin, ORIGIN_NONE); |
| 471 RecordHistogramTime(GetHistogramName(origin, IsOriginWash(), "PrefetchAge"), | 447 base::UmaHistogramCustomTimes( |
| 472 base::TimeDelta::FromMilliseconds(10), | 448 GetHistogramName(origin, IsOriginWash(), "PrefetchAge"), prefetch_age, |
| 473 base::TimeDelta::FromMinutes(30), prefetch_age, 50); | 449 base::TimeDelta::FromMilliseconds(10), base::TimeDelta::FromMinutes(30), |
| 450 50); |
| 474 } | 451 } |
| 475 | 452 |
| 476 std::string histogram_base_name; | 453 std::string histogram_base_name; |
| 477 if (prefetch_age.is_zero()) { | 454 if (prefetch_age.is_zero()) { |
| 478 histogram_base_name = "PrefetchTTFCP.Reference"; | 455 histogram_base_name = "PrefetchTTFCP.Reference"; |
| 479 } else { | 456 } else { |
| 480 histogram_base_name = prefetch_age < base::TimeDelta::FromMinutes( | 457 histogram_base_name = prefetch_age < base::TimeDelta::FromMinutes( |
| 481 net::HttpCache::kPrefetchReuseMins) | 458 net::HttpCache::kPrefetchReuseMins) |
| 482 ? "PrefetchTTFCP.Warm" | 459 ? "PrefetchTTFCP.Warm" |
| 483 : "PrefetchTTFCP.Cold"; | 460 : "PrefetchTTFCP.Cold"; |
| 484 } | 461 } |
| 485 | 462 |
| 486 histogram_base_name += is_no_store ? ".NoStore" : ".Cacheable"; | 463 histogram_base_name += is_no_store ? ".NoStore" : ".Cacheable"; |
| 487 histogram_base_name += FirstContentfulPaintHiddenName(was_hidden); | 464 histogram_base_name += FirstContentfulPaintHiddenName(was_hidden); |
| 488 std::string histogram_name = | 465 std::string histogram_name = |
| 489 GetHistogramName(origin, IsOriginWash(), histogram_base_name); | 466 GetHistogramName(origin, IsOriginWash(), histogram_base_name); |
| 490 | 467 |
| 491 RecordHistogramTime(histogram_name, base::TimeDelta::FromMilliseconds(10), | 468 base::UmaHistogramCustomTimes(histogram_name, time, |
| 492 base::TimeDelta::FromMinutes(2), time, 50); | 469 base::TimeDelta::FromMilliseconds(10), |
| 470 base::TimeDelta::FromMinutes(2), 50); |
| 493 } | 471 } |
| 494 | 472 |
| 495 bool PrerenderHistograms::IsOriginWash() const { | 473 bool PrerenderHistograms::IsOriginWash() const { |
| 496 if (!WithinWindow()) | 474 if (!WithinWindow()) |
| 497 return false; | 475 return false; |
| 498 return origin_wash_; | 476 return origin_wash_; |
| 499 } | 477 } |
| 500 | 478 |
| 501 } // namespace prerender | 479 } // namespace prerender |
| OLD | NEW |