blob: 1469fccf5d105db9d9182d4521acb2bcadcbebaa [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/prerender/prerender_histograms.h"
#include <string>
#include "base/format_macros.h"
#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/common/prerender_util.h"
#include "components/google/core/common/google_util.h"
#include "net/http/http_cache.h"
namespace prerender {
namespace {
std::string GetHistogramName(Origin origin, const std::string& name) {
return ComposeHistogramName(PrerenderHistograms::GetHistogramPrefix(origin),
name);
}
const char* FirstContentfulPaintHiddenName(bool was_hidden) {
return was_hidden ? ".Hidden" : ".Visible";
}
} // namespace
PrerenderHistograms::PrerenderHistograms() {}
std::string PrerenderHistograms::GetHistogramPrefix(Origin origin) {
switch (origin) {
case ORIGIN_OMNIBOX:
return "omnibox";
case ORIGIN_NONE:
return "none";
case ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN:
return "websame";
case ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN:
return "webcross";
case ORIGIN_EXTERNAL_REQUEST:
return "externalrequest";
case ORIGIN_LINK_REL_NEXT:
return "webnext";
case ORIGIN_GWS_PRERENDER:
return "gws";
case ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER:
return "externalrequestforced";
default:
NOTREACHED();
break;
}
// Dummy return value to make the compiler happy.
return "none";
}
void PrerenderHistograms::RecordPerceivedFirstContentfulPaintStatus(
Origin origin,
bool successful,
bool was_hidden) const {
base::UmaHistogramBoolean(GetHistogramName(origin, "PerceivedTTFCPRecorded") +
FirstContentfulPaintHiddenName(was_hidden),
successful);
}
void PrerenderHistograms::RecordFinalStatus(
Origin origin,
FinalStatus final_status) const {
DCHECK(final_status != FINAL_STATUS_MAX);
base::UmaHistogramEnumeration(GetHistogramName(origin, "FinalStatus"),
final_status, FINAL_STATUS_MAX);
base::UmaHistogramEnumeration(ComposeHistogramName("", "FinalStatus"),
final_status, FINAL_STATUS_MAX);
}
void PrerenderHistograms::RecordNetworkBytesConsumed(
Origin origin,
int64_t prerender_bytes,
int64_t profile_bytes) const {
const int kHistogramMin = 1;
const int kHistogramMax = 100000000; // 100M.
const int kBucketCount = 50;
UMA_HISTOGRAM_CUSTOM_COUNTS("Prerender.NetworkBytesTotalForProfile",
profile_bytes,
kHistogramMin,
1000000000, // 1G
kBucketCount);
if (prerender_bytes == 0)
return;
base::UmaHistogramCustomCounts(GetHistogramName(origin, "NetworkBytesWasted"),
prerender_bytes, kHistogramMin, kHistogramMax,
kBucketCount);
base::UmaHistogramCustomCounts(ComposeHistogramName("", "NetworkBytesWasted"),
prerender_bytes, kHistogramMin, kHistogramMax,
kBucketCount);
}
void PrerenderHistograms::RecordPrefetchFirstContentfulPaintTime(
Origin origin,
bool is_no_store,
bool was_hidden,
base::TimeDelta time,
base::TimeDelta prefetch_age) const {
DCHECK(thread_checker_.CalledOnValidThread());
if (!prefetch_age.is_zero()) {
DCHECK_NE(origin, ORIGIN_NONE);
base::UmaHistogramCustomTimes(GetHistogramName(origin, "PrefetchAge"),
prefetch_age,
base::TimeDelta::FromMilliseconds(10),
base::TimeDelta::FromMinutes(30), 50);
}
std::string histogram_base_name;
if (prefetch_age.is_zero()) {
histogram_base_name = "PrefetchTTFCP.Reference";
} else {
histogram_base_name = prefetch_age < base::TimeDelta::FromMinutes(
net::HttpCache::kPrefetchReuseMins)
? "PrefetchTTFCP.Warm"
: "PrefetchTTFCP.Cold";
}
histogram_base_name += is_no_store ? ".NoStore" : ".Cacheable";
histogram_base_name += FirstContentfulPaintHiddenName(was_hidden);
std::string histogram_name = GetHistogramName(origin, histogram_base_name);
base::UmaHistogramCustomTimes(histogram_name, time,
base::TimeDelta::FromMilliseconds(10),
base::TimeDelta::FromMinutes(2), 50);
}
} // namespace prerender