Commit eeb85af7 authored by tburkard@chromium.org's avatar tburkard@chromium.org

Create prerender event histograms by origin & experiment.

R=asvitkine@chromium.org, davidben@chromium.org

Review URL: https://codereview.chromium.org/100133002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238440 0039d316-1c4b-4281-b951-d872f2087c98
parent 58030de8
...@@ -387,9 +387,12 @@ void PrerenderHistograms::RecordFinalStatus( ...@@ -387,9 +387,12 @@ void PrerenderHistograms::RecordFinalStatus(
} }
} }
void PrerenderHistograms::RecordEvent(PrerenderEvent event) const { void PrerenderHistograms::RecordEvent(Origin origin, uint8 experiment_id,
PrerenderEvent event) const {
DCHECK_LT(event, PRERENDER_EVENT_MAX); DCHECK_LT(event, PRERENDER_EVENT_MAX);
UMA_HISTOGRAM_ENUMERATION("Prerender.Event", event, PRERENDER_EVENT_MAX); PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(
"Event", origin, experiment_id,
UMA_HISTOGRAM_ENUMERATION(name, event, PRERENDER_EVENT_MAX));
} }
uint8 PrerenderHistograms::GetCurrentExperimentId() const { uint8 PrerenderHistograms::GetCurrentExperimentId() const {
......
...@@ -89,7 +89,8 @@ class PrerenderHistograms { ...@@ -89,7 +89,8 @@ class PrerenderHistograms {
void RecordFractionPixelsFinalAtSwapin(Origin origin, double fraction) const; void RecordFractionPixelsFinalAtSwapin(Origin origin, double fraction) const;
// Records a prerender event. // Records a prerender event.
void RecordEvent(PrerenderEvent event) const; void RecordEvent(Origin origin, uint8 experiment_id, PrerenderEvent event)
const;
private: private:
base::TimeTicks GetCurrentTimeTicks() const; base::TimeTicks GetCurrentTimeTicks() const;
......
...@@ -443,13 +443,16 @@ void PrerenderManager::ProcessMergeResult( ...@@ -443,13 +443,16 @@ void PrerenderManager::ProcessMergeResult(
// No pending_swap should never happen. If it does anyways (in a retail // No pending_swap should never happen. If it does anyways (in a retail
// build), log this and bail. // build), log this and bail.
if (!pending_swap) { if (!pending_swap) {
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_NO_PENDING_SWAPIN); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_NO_PENDING_SWAPIN);
return; return;
} }
if (timed_out) { if (timed_out) {
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_TIMEOUT_CB); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_TIMEOUT_CB);
} else { } else {
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_CB); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_CB);
UMA_HISTOGRAM_TIMES("Prerender.SessionStorageNamespaceMergeTime", UMA_HISTOGRAM_TIMES("Prerender.SessionStorageNamespaceMergeTime",
pending_swap->GetElapsedTime()); pending_swap->GetElapsedTime());
} }
...@@ -459,35 +462,44 @@ void PrerenderManager::ProcessMergeResult( ...@@ -459,35 +462,44 @@ void PrerenderManager::ProcessMergeResult(
// in. In that case, SwapInternal will take care of deleting // in. In that case, SwapInternal will take care of deleting
// |prerender_data| and sending the appropriate notifications to the tracker. // |prerender_data| and sending the appropriate notifications to the tracker.
if (timed_out) { if (timed_out) {
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_TIMED_OUT); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_TIMED_OUT);
prerender_data->ClearPendingSwap(); prerender_data->ClearPendingSwap();
return; return;
} }
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_MERGE_DONE); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_MERGE_DONE);
// Log the exact merge result in a histogram. // Log the exact merge result in a histogram.
switch (result) { switch (result) {
case content::SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_FOUND: case content::SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_FOUND:
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NAMESPACE_NOT_FOUND); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_NAMESPACE_NOT_FOUND);
break; break;
case content::SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_ALIAS: case content::SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_ALIAS:
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NAMESPACE_NOT_ALIAS); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_NAMESPACE_NOT_ALIAS);
break; break;
case content::SessionStorageNamespace::MERGE_RESULT_NOT_LOGGING: case content::SessionStorageNamespace::MERGE_RESULT_NOT_LOGGING:
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NOT_LOGGING); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_NOT_LOGGING);
break; break;
case content::SessionStorageNamespace::MERGE_RESULT_NO_TRANSACTIONS: case content::SessionStorageNamespace::MERGE_RESULT_NO_TRANSACTIONS:
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NO_TRANSACTIONS); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_NO_TRANSACTIONS);
break; break;
case content::SessionStorageNamespace::MERGE_RESULT_TOO_MANY_TRANSACTIONS: case content::SessionStorageNamespace::MERGE_RESULT_TOO_MANY_TRANSACTIONS:
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_TOO_MANY_TRANSACTIONS); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_TOO_MANY_TRANSACTIONS);
break; break;
case content::SessionStorageNamespace::MERGE_RESULT_NOT_MERGEABLE: case content::SessionStorageNamespace::MERGE_RESULT_NOT_MERGEABLE:
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NOT_MERGEABLE); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_NOT_MERGEABLE);
break; break;
case content::SessionStorageNamespace::MERGE_RESULT_MERGEABLE: case content::SessionStorageNamespace::MERGE_RESULT_MERGEABLE:
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_MERGEABLE); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_RESULT_MERGEABLE);
break; break;
default: default:
NOTREACHED(); NOTREACHED();
...@@ -496,12 +508,14 @@ void PrerenderManager::ProcessMergeResult( ...@@ -496,12 +508,14 @@ void PrerenderManager::ProcessMergeResult(
if (result != content::SessionStorageNamespace::MERGE_RESULT_MERGEABLE && if (result != content::SessionStorageNamespace::MERGE_RESULT_MERGEABLE &&
result != result !=
content::SessionStorageNamespace::MERGE_RESULT_NO_TRANSACTIONS) { content::SessionStorageNamespace::MERGE_RESULT_NO_TRANSACTIONS) {
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_MERGE_FAILED); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_MERGE_FAILED);
prerender_data->ClearPendingSwap(); prerender_data->ClearPendingSwap();
return; return;
} }
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_SWAPPING_IN); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_RESULT_SWAPPING_IN);
// Notice that SwapInInternal, on success, will delete |prerender_data| // Notice that SwapInInternal, on success, will delete |prerender_data|
// and |pending_swap|. Therefore, we have to pass a new GURL object rather // and |pending_swap|. Therefore, we have to pass a new GURL object rather
// than a reference to the one in |pending_swap|. // than a reference to the one in |pending_swap|.
...@@ -509,10 +523,9 @@ void PrerenderManager::ProcessMergeResult( ...@@ -509,10 +523,9 @@ void PrerenderManager::ProcessMergeResult(
SwapInternal(GURL(pending_swap->url()), SwapInternal(GURL(pending_swap->url()),
pending_swap->target_contents(), pending_swap->target_contents(),
prerender_data); prerender_data);
if (new_web_contents) { if (!new_web_contents) {
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_SWAPIN_SUCCESSFUL); RecordEvent(prerender_data->contents(),
} else { PRERENDER_EVENT_MERGE_RESULT_SWAPIN_FAILED);
RecordEvent(PRERENDER_EVENT_MERGE_RESULT_SWAPIN_FAILED);
prerender_data->ClearPendingSwap(); prerender_data->ClearPendingSwap();
} }
} }
...@@ -553,7 +566,7 @@ content::WebContents* PrerenderManager::SwapInternal( ...@@ -553,7 +566,7 @@ content::WebContents* PrerenderManager::SwapInternal(
// We check this by examining whether its CoreTabHelper has a delegate. // We check this by examining whether its CoreTabHelper has a delegate.
CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(web_contents); CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(web_contents);
if (!core_tab_helper || !core_tab_helper->delegate()) { if (!core_tab_helper || !core_tab_helper->delegate()) {
RecordEvent(PRERENDER_EVENT_SWAPIN_NO_DELEGATE); RecordEvent(NULL, PRERENDER_EVENT_SWAPIN_NO_DELEGATE);
return NULL; return NULL;
} }
...@@ -569,12 +582,13 @@ content::WebContents* PrerenderManager::SwapInternal( ...@@ -569,12 +582,13 @@ content::WebContents* PrerenderManager::SwapInternal(
if (!prerender_data) { if (!prerender_data) {
prerender_data = FindPrerenderData(url, NULL); prerender_data = FindPrerenderData(url, NULL);
} else { } else {
RecordEvent(PRERENDER_EVENT_SWAPIN_CANDIDATE_NAMESPACE_MATCHES); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_SWAPIN_CANDIDATE_NAMESPACE_MATCHES);
} }
if (!prerender_data) if (!prerender_data)
return NULL; return NULL;
RecordEvent(PRERENDER_EVENT_SWAPIN_CANDIDATE); RecordEvent(prerender_data->contents(), PRERENDER_EVENT_SWAPIN_CANDIDATE);
DCHECK(prerender_data->contents()); DCHECK(prerender_data->contents());
// If there is currently a merge pending for this prerender data, // If there is currently a merge pending for this prerender data,
...@@ -584,7 +598,8 @@ content::WebContents* PrerenderManager::SwapInternal( ...@@ -584,7 +598,8 @@ content::WebContents* PrerenderManager::SwapInternal(
return NULL; return NULL;
} }
RecordEvent(PRERENDER_EVENT_SWAPIN_NO_MERGE_PENDING); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_SWAPIN_NO_MERGE_PENDING);
SessionStorageNamespace* target_namespace = SessionStorageNamespace* target_namespace =
web_contents->GetController().GetDefaultSessionStorageNamespace(); web_contents->GetController().GetDefaultSessionStorageNamespace();
SessionStorageNamespace* prerender_namespace = SessionStorageNamespace* prerender_namespace =
...@@ -594,10 +609,12 @@ content::WebContents* PrerenderManager::SwapInternal( ...@@ -594,10 +609,12 @@ content::WebContents* PrerenderManager::SwapInternal(
if (prerender_namespace && prerender_namespace != target_namespace && if (prerender_namespace && prerender_namespace != target_namespace &&
!prerender_namespace->IsAliasOf(target_namespace)) { !prerender_namespace->IsAliasOf(target_namespace)) {
if (!ShouldMergeSessionStorageNamespaces()) { if (!ShouldMergeSessionStorageNamespaces()) {
RecordEvent(PRERENDER_EVENT_SWAPIN_MERGING_DISABLED); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_SWAPIN_MERGING_DISABLED);
return NULL; return NULL;
} }
RecordEvent(PRERENDER_EVENT_SWAPIN_ISSUING_MERGE); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_SWAPIN_ISSUING_MERGE);
// There should never be a |pending_swap| if we get to here: // There should never be a |pending_swap| if we get to here:
// Per check above, |pending_swap| may only be != NULL when // Per check above, |pending_swap| may only be != NULL when
// processing a successful merge, as indicated by |swap_candidate| // processing a successful merge, as indicated by |swap_candidate|
...@@ -605,7 +622,8 @@ content::WebContents* PrerenderManager::SwapInternal( ...@@ -605,7 +622,8 @@ content::WebContents* PrerenderManager::SwapInternal(
DCHECK(!prerender_data->pending_swap()); DCHECK(!prerender_data->pending_swap());
if (prerender_data->pending_swap()) { if (prerender_data->pending_swap()) {
// In retail builds, log this error and bail. // In retail builds, log this error and bail.
RecordEvent(PRERENDER_EVENT_MERGE_FOR_SWAPIN_CANDIDATE); RecordEvent(prerender_data->contents(),
PRERENDER_EVENT_MERGE_FOR_SWAPIN_CANDIDATE);
return NULL; return NULL;
} }
PendingSwap* pending_swap = new PendingSwap( PendingSwap* pending_swap = new PendingSwap(
...@@ -1923,8 +1941,13 @@ void PrerenderManager::LoggedInPredictorDataReceived( ...@@ -1923,8 +1941,13 @@ void PrerenderManager::LoggedInPredictorDataReceived(
logged_in_state_.swap(new_map); logged_in_state_.swap(new_map);
} }
void PrerenderManager::RecordEvent(PrerenderEvent event) const { void PrerenderManager::RecordEvent(PrerenderContents* contents,
histograms_->RecordEvent(event); PrerenderEvent event) const {
if (!contents)
histograms_->RecordEvent(ORIGIN_NONE, kNoExperiment, event);
else
histograms_->RecordEvent(contents->origin(), contents->experiment_id(),
event);
} }
} // namespace prerender } // namespace prerender
...@@ -660,7 +660,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, ...@@ -660,7 +660,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
bool timed_out, bool timed_out,
content::SessionStorageNamespace::MergeResult result); content::SessionStorageNamespace::MergeResult result);
void RecordEvent(PrerenderEvent event) const; void RecordEvent(PrerenderContents* contents, PrerenderEvent event) const;
// Swaps a prerender for |url| into the tab, replacing |web_contents|. // Swaps a prerender for |url| into the tab, replacing |web_contents|.
// Returns the new WebContents that was swapped in, or NULL if a swap-in // Returns the new WebContents that was swapped in, or NULL if a swap-in
......
...@@ -32055,6 +32055,7 @@ other types of suffix sets. ...@@ -32055,6 +32055,7 @@ other types of suffix sets.
<group name="web" label="Link triggered prerender."/> <group name="web" label="Link triggered prerender."/>
<group name="webcross" label="Link triggered prerender, cross domain."/> <group name="webcross" label="Link triggered prerender, cross domain."/>
<group name="websame" label="Link triggered prerender, same domain."/> <group name="websame" label="Link triggered prerender, same domain."/>
<affected-histogram name="Prerender.Event"/>
<affected-histogram name="Prerender.FinalStatus"/> <affected-histogram name="Prerender.FinalStatus"/>
<affected-histogram name="Prerender.FinalStatus_Prerender5minTTL"/> <affected-histogram name="Prerender.FinalStatus_Prerender5minTTL"/>
<affected-histogram name="Prerender.FinalStatus_PrerenderControl"/> <affected-histogram name="Prerender.FinalStatus_PrerenderControl"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment