Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: chrome/browser/prerender/prerender_histograms.cc

Issue 11028037: Fix prerender histograms for multiple prerender case. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix windows build Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "base/stringprintf.h" 12 #include "base/stringprintf.h"
13 #include "chrome/browser/predictors/autocomplete_action_predictor.h" 13 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
14 #include "chrome/browser/prerender/prerender_field_trial.h" 14 #include "chrome/browser/prerender/prerender_field_trial.h"
15 #include "chrome/browser/prerender/prerender_manager.h" 15 #include "chrome/browser/prerender/prerender_manager.h"
16 #include "chrome/browser/prerender/prerender_util.h" 16 #include "chrome/browser/prerender/prerender_util.h"
17 17
18 using predictors::AutocompleteActionPredictor; 18 using predictors::AutocompleteActionPredictor;
19 19
20 namespace prerender { 20 namespace prerender {
21 21
22 namespace { 22 namespace {
23 23
24 // Time window for which we will record windowed PLT's from the last
25 // observed link rel=prefetch tag.
26 const int kWindowDurationSeconds = 30;
27
28 std::string ComposeHistogramName(const std::string& prefix_type, 24 std::string ComposeHistogramName(const std::string& prefix_type,
29 const std::string& name) { 25 const std::string& name) {
30 if (prefix_type.empty()) 26 if (prefix_type.empty())
31 return std::string("Prerender.") + name; 27 return std::string("Prerender.") + name;
32 return std::string("Prerender.") + prefix_type + std::string("_") + name; 28 return std::string("Prerender.") + prefix_type + std::string("_") + name;
33 } 29 }
34 30
35 std::string GetHistogramName(Origin origin, uint8 experiment_id, 31 std::string GetHistogramName(Origin origin, uint8 experiment_id,
36 bool is_wash, const std::string& name) { 32 bool is_wash, const std::string& name) {
37 if (is_wash) 33 if (is_wash)
38 return ComposeHistogramName("wash", name); 34 return ComposeHistogramName("wash", name);
39 35
40 if (origin == ORIGIN_GWS_PRERENDER) { 36 if (origin == ORIGIN_GWS_PRERENDER) {
41 if (experiment_id == kNoExperiment) 37 if (experiment_id == kNoExperiment)
42 return ComposeHistogramName("gws", name); 38 return ComposeHistogramName("gws", name);
43 return ComposeHistogramName("exp" + std::string(1, experiment_id + '0'), 39 return ComposeHistogramName("exp" + std::string(1, experiment_id + '0'),
44 name); 40 name);
45 } 41 }
46 42
47 if (experiment_id != kNoExperiment) 43 if (experiment_id != kNoExperiment)
48 return ComposeHistogramName("wash", name); 44 return ComposeHistogramName("wash", name);
49 45
50 switch (origin) { 46 switch (origin) {
51 case ORIGIN_OMNIBOX: 47 case ORIGIN_OMNIBOX:
52 return ComposeHistogramName("omnibox", name); 48 return ComposeHistogramName("omnibox", name);
53 case ORIGIN_LINK_REL_PRERENDER: 49 case ORIGIN_LINK_REL_PRERENDER:
54 return ComposeHistogramName("web", name); 50 return ComposeHistogramName("web", name);
51 case ORIGIN_NONE:
52 return ComposeHistogramName("none", name);
55 case ORIGIN_GWS_PRERENDER: // Handled above. 53 case ORIGIN_GWS_PRERENDER: // Handled above.
56 default: 54 default:
57 NOTREACHED(); 55 NOTREACHED();
58 break; 56 break;
59 }; 57 };
60 58
61 // Dummy return value to make the compiler happy. 59 // Dummy return value to make the compiler happy.
62 NOTREACHED(); 60 NOTREACHED();
63 return ComposeHistogramName("wash", name); 61 return ComposeHistogramName("wash", name);
64 } 62 }
65 63
66 bool OriginIsOmnibox(Origin origin) { 64 bool OriginIsOmnibox(Origin origin) {
67 return origin == ORIGIN_OMNIBOX; 65 return origin == ORIGIN_OMNIBOX;
68 } 66 }
69 67
70 } // namespace 68 } // namespace
71 69
72 // Helper macros for experiment-based and origin-based histogram reporting. 70 // Helper macros for experiment-based and origin-based histogram reporting.
73 // All HISTOGRAM arguments must be UMA_HISTOGRAM... macros that contain an 71 // All HISTOGRAM arguments must be UMA_HISTOGRAM... macros that contain an
74 // argument "name" which these macros will eventually substitute for the 72 // argument "name" which these macros will eventually substitute for the
75 // actual name used. 73 // actual name used.
76 #define PREFIXED_HISTOGRAM(histogram_name, HISTOGRAM) \ 74 #define PREFIXED_HISTOGRAM(histogram_name, origin, HISTOGRAM) \
77 PREFIXED_HISTOGRAM_INTERNAL(GetCurrentOrigin(), GetCurrentExperimentId(), \ 75 PREFIXED_HISTOGRAM_INTERNAL(origin, GetCurrentExperimentId(), \
78 IsOriginExperimentWash(), HISTOGRAM, \ 76 IsOriginExperimentWash(), HISTOGRAM, \
79 histogram_name) 77 histogram_name)
80 78
81 #define PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(histogram_name, origin, \ 79 #define PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(histogram_name, origin, \
82 experiment, HISTOGRAM) \ 80 experiment, HISTOGRAM) \
83 PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, false, HISTOGRAM, \ 81 PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, false, HISTOGRAM, \
84 histogram_name) 82 histogram_name)
85 83
86 #define PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, wash, HISTOGRAM, \ 84 #define PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, wash, HISTOGRAM, \
87 histogram_name) { \ 85 histogram_name) { \
(...skipping 17 matching lines...) Expand all
105 HISTOGRAM; \ 103 HISTOGRAM; \
106 } else if (origin == ORIGIN_OMNIBOX) { \ 104 } else if (origin == ORIGIN_OMNIBOX) { \
107 HISTOGRAM; \ 105 HISTOGRAM; \
108 } else if (experiment != kNoExperiment) { \ 106 } else if (experiment != kNoExperiment) { \
109 HISTOGRAM; \ 107 HISTOGRAM; \
110 } else { \ 108 } else { \
111 HISTOGRAM; \ 109 HISTOGRAM; \
112 } \ 110 } \
113 } 111 }
114 112
115 PrerenderHistograms::PrerenderHistograms() 113 PrerenderHistograms::PrerenderHistograms(base::TimeDelta prerender_ttl)
116 : last_experiment_id_(kNoExperiment), 114 : last_experiment_id_(kNoExperiment),
117 last_origin_(ORIGIN_LINK_REL_PRERENDER), 115 last_origin_(ORIGIN_LINK_REL_PRERENDER),
118 origin_experiment_wash_(false), 116 origin_experiment_wash_(false),
117 prerender_ttl_(prerender_ttl),
119 seen_any_pageload_(true), 118 seen_any_pageload_(true),
120 seen_pageload_started_after_prerender_(true) { 119 seen_pageload_started_after_prerender_(true) {
121 } 120 }
122 121
123 void PrerenderHistograms::RecordPrerender(Origin origin, const GURL& url) { 122 void PrerenderHistograms::RecordPrerender(Origin origin, const GURL& url) {
124 // Check if we are doing an experiment. 123 // Check if we are doing an experiment.
125 uint8 experiment = GetQueryStringBasedExperiment(url); 124 uint8 experiment = GetQueryStringBasedExperiment(url);
126 125
127 // We need to update last_experiment_id_, last_origin_, and 126 // We need to update last_experiment_id_, last_origin_, and
128 // origin_experiment_wash_. 127 // origin_experiment_wash_.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 170
172 void PrerenderHistograms::RecordUsedPrerender(Origin origin) const { 171 void PrerenderHistograms::RecordUsedPrerender(Origin origin) const {
173 if (OriginIsOmnibox(origin)) { 172 if (OriginIsOmnibox(origin)) {
174 UMA_HISTOGRAM_ENUMERATION( 173 UMA_HISTOGRAM_ENUMERATION(
175 StringPrintf("Prerender.OmniboxNavigationsUsedPrerenderCount%s", 174 StringPrintf("Prerender.OmniboxNavigationsUsedPrerenderCount%s",
176 PrerenderManager::GetModeString()), 1, 2); 175 PrerenderManager::GetModeString()), 1, 2);
177 } 176 }
178 } 177 }
179 178
180 void PrerenderHistograms::RecordTimeSinceLastRecentVisit( 179 void PrerenderHistograms::RecordTimeSinceLastRecentVisit(
180 Origin origin,
181 base::TimeDelta delta) const { 181 base::TimeDelta delta) const {
182 PREFIXED_HISTOGRAM( 182 PREFIXED_HISTOGRAM(
183 "TimeSinceLastRecentVisit", 183 "TimeSinceLastRecentVisit", origin,
184 UMA_HISTOGRAM_TIMES(name, delta)); 184 UMA_HISTOGRAM_TIMES(name, delta));
185 } 185 }
186 186
187 void PrerenderHistograms::RecordFractionPixelsFinalAtSwapin( 187 void PrerenderHistograms::RecordFractionPixelsFinalAtSwapin(
188 Origin origin,
188 double fraction) const { 189 double fraction) const {
189 if (fraction < 0.0 || fraction > 1.0) 190 if (fraction < 0.0 || fraction > 1.0)
190 return; 191 return;
191 int percentage = static_cast<int>(fraction * 100); 192 int percentage = static_cast<int>(fraction * 100);
192 if (percentage < 0 || percentage > 100) 193 if (percentage < 0 || percentage > 100)
193 return; 194 return;
194 PREFIXED_HISTOGRAM( 195 PREFIXED_HISTOGRAM(
195 base::FieldTrial::MakeName("FractionPixelsFinalAtSwapin", "Prerender"), 196 base::FieldTrial::MakeName("FractionPixelsFinalAtSwapin", "Prerender"),
196 UMA_HISTOGRAM_PERCENTAGE(name, percentage)); 197 origin, UMA_HISTOGRAM_PERCENTAGE(name, percentage));
197 } 198 }
198 199
199 base::TimeTicks PrerenderHistograms::GetCurrentTimeTicks() const { 200 base::TimeTicks PrerenderHistograms::GetCurrentTimeTicks() const {
200 return base::TimeTicks::Now(); 201 return base::TimeTicks::Now();
201 } 202 }
202 203
203 // Helper macro for histograms. 204 // Helper macro for histograms.
204 #define RECORD_PLT(tag, perceived_page_load_time) { \ 205 #define RECORD_PLT(tag, perceived_page_load_time) { \
205 PREFIXED_HISTOGRAM( \ 206 PREFIXED_HISTOGRAM( \
206 base::FieldTrial::MakeName(tag, "Prerender"), \ 207 base::FieldTrial::MakeName(tag, "Prerender"), origin, \
207 UMA_HISTOGRAM_CUSTOM_TIMES( \ 208 UMA_HISTOGRAM_CUSTOM_TIMES( \
208 name, \ 209 name, \
209 perceived_page_load_time, \ 210 perceived_page_load_time, \
210 base::TimeDelta::FromMilliseconds(10), \ 211 base::TimeDelta::FromMilliseconds(10), \
211 base::TimeDelta::FromSeconds(60), \ 212 base::TimeDelta::FromSeconds(60), \
212 100)); \ 213 100)); \
213 } 214 }
214 215
215 // Summary of all histograms Perceived PLT histograms: 216 // Summary of all histograms Perceived PLT histograms:
216 // (all prefixed PerceivedPLT) 217 // (all prefixed PerceivedPLT)
(...skipping 12 matching lines...) Expand all
229 // triggering for the first page to finish after the prerender that also started 230 // triggering for the first page to finish after the prerender that also started
230 // after the prerender started. 231 // after the prerender started.
231 // ...FirstAfterMissBoth -- pages meeting 232 // ...FirstAfterMissBoth -- pages meeting
232 // FirstAfterMiss AND FirstAfterMissNonOverlapping 233 // FirstAfterMiss AND FirstAfterMissNonOverlapping
233 // ...FirstAfterMissAnyOnly -- pages meeting 234 // ...FirstAfterMissAnyOnly -- pages meeting
234 // FirstAfterMiss but NOT FirstAfterMissNonOverlapping 235 // FirstAfterMiss but NOT FirstAfterMissNonOverlapping
235 // ..FirstAfterMissNonOverlappingOnly -- pages meeting 236 // ..FirstAfterMissNonOverlappingOnly -- pages meeting
236 // FirstAfterMissNonOverlapping but NOT FirstAfterMiss 237 // FirstAfterMissNonOverlapping but NOT FirstAfterMiss
237 238
238 void PrerenderHistograms::RecordPerceivedPageLoadTime( 239 void PrerenderHistograms::RecordPerceivedPageLoadTime(
239 base::TimeDelta perceived_page_load_time, bool was_prerender, 240 Origin origin,
241 base::TimeDelta perceived_page_load_time,
242 bool was_prerender,
240 bool was_complete_prerender, const GURL& url) { 243 bool was_complete_prerender, const GURL& url) {
241 if (!IsWebURL(url)) 244 if (!IsWebURL(url))
242 return; 245 return;
243 bool within_window = WithinWindow(); 246 bool within_window = WithinWindow();
244 bool is_google_url = IsGoogleDomain(url); 247 bool is_google_url = IsGoogleDomain(url);
245 RECORD_PLT("PerceivedPLT", perceived_page_load_time); 248 RECORD_PLT("PerceivedPLT", perceived_page_load_time);
246 if (within_window) 249 if (within_window)
247 RECORD_PLT("PerceivedPLTWindowed", perceived_page_load_time); 250 RECORD_PLT("PerceivedPLTWindowed", perceived_page_load_time);
248 if (was_prerender || was_complete_prerender) { 251 if (was_prerender || was_complete_prerender) {
249 if (was_prerender) 252 if (was_prerender)
(...skipping 29 matching lines...) Expand all
279 } else if (recorded_non_overlapping) { 282 } else if (recorded_non_overlapping) {
280 RECORD_PLT("PerceivedPLTFirstAfterMissNonOverlappingOnly", 283 RECORD_PLT("PerceivedPLTFirstAfterMissNonOverlappingOnly",
281 perceived_page_load_time); 284 perceived_page_load_time);
282 } 285 }
283 } 286 }
284 } 287 }
285 } 288 }
286 } 289 }
287 290
288 void PrerenderHistograms::RecordPageLoadTimeNotSwappedIn( 291 void PrerenderHistograms::RecordPageLoadTimeNotSwappedIn(
289 base::TimeDelta page_load_time, const GURL& url) const { 292 Origin origin,
293 base::TimeDelta page_load_time,
294 const GURL& url) const {
290 // If the URL to be prerendered is not a http[s] URL, or is a Google URL, 295 // If the URL to be prerendered is not a http[s] URL, or is a Google URL,
291 // do not record. 296 // do not record.
292 if (!IsWebURL(url) || IsGoogleDomain(url)) 297 if (!IsWebURL(url) || IsGoogleDomain(url))
293 return; 298 return;
294 RECORD_PLT("PrerenderNotSwappedInPLT", page_load_time); 299 RECORD_PLT("PrerenderNotSwappedInPLT", page_load_time);
295 } 300 }
296 301
297 void PrerenderHistograms::RecordSimulatedLocalBrowsingBaselinePLT( 302 void PrerenderHistograms::RecordPercentLoadDoneAtSwapin(Origin origin,
298 base::TimeDelta page_load_time, const GURL& url) const { 303 double fraction) const {
299 // If the URL to be prerendered is not a http[s] URL do not record.
300 if (!IsWebURL(url))
301 return;
302 RECORD_PLT("SimulatedLocalBrowsingBaselinePLT", page_load_time);
303 }
304
305 void PrerenderHistograms::RecordSimulatedLocalBrowsingPLT(
306 base::TimeDelta page_load_time, const GURL& url) const {
307 // If the URL to be prerendered is not a http[s] URL do not record.
308 if (!IsWebURL(url))
309 return;
310 RECORD_PLT("SimulatedLocalBrowsingPLT", page_load_time);
311 }
312
313 void PrerenderHistograms::RecordPercentLoadDoneAtSwapin(double fraction)
314 const {
315 if (fraction < 0.0 || fraction > 1.0) 304 if (fraction < 0.0 || fraction > 1.0)
316 return; 305 return;
317 int percentage = static_cast<int>(fraction * 100); 306 int percentage = static_cast<int>(fraction * 100);
318 if (percentage < 0 || percentage > 100) 307 if (percentage < 0 || percentage > 100)
319 return; 308 return;
320 PREFIXED_HISTOGRAM( 309 PREFIXED_HISTOGRAM(
321 base::FieldTrial::MakeName("PercentLoadDoneAtSwapin", "Prerender"), 310 base::FieldTrial::MakeName("PercentLoadDoneAtSwapin", "Prerender"),
322 UMA_HISTOGRAM_PERCENTAGE(name, percentage)); 311 origin, UMA_HISTOGRAM_PERCENTAGE(name, percentage));
323 } 312 }
324 313
325 base::TimeDelta PrerenderHistograms::GetTimeSinceLastPrerender() const { 314 base::TimeDelta PrerenderHistograms::GetTimeSinceLastPrerender() const {
326 return base::TimeTicks::Now() - last_prerender_seen_time_; 315 return base::TimeTicks::Now() - last_prerender_seen_time_;
327 } 316 }
328 317
329 bool PrerenderHistograms::WithinWindow() const { 318 bool PrerenderHistograms::WithinWindow() const {
330 if (last_prerender_seen_time_.is_null()) 319 if (last_prerender_seen_time_.is_null())
331 return false; 320 return false;
332 return GetTimeSinceLastPrerender() <= 321 return GetTimeSinceLastPrerender() <= prerender_ttl_;
333 base::TimeDelta::FromSeconds(kWindowDurationSeconds);
334 } 322 }
335 323
336 void PrerenderHistograms::RecordTimeUntilUsed( 324 void PrerenderHistograms::RecordTimeUntilUsed(
325 Origin origin,
337 base::TimeDelta time_until_used, 326 base::TimeDelta time_until_used,
338 base::TimeDelta time_to_live) const { 327 base::TimeDelta time_to_live) const {
339 PREFIXED_HISTOGRAM( 328 PREFIXED_HISTOGRAM(
340 "TimeUntilUsed", 329 "TimeUntilUsed", origin,
341 UMA_HISTOGRAM_CUSTOM_TIMES( 330 UMA_HISTOGRAM_CUSTOM_TIMES(
342 name, 331 name,
343 time_until_used, 332 time_until_used,
344 base::TimeDelta::FromMilliseconds(10), 333 base::TimeDelta::FromMilliseconds(10),
345 time_to_live, 334 time_to_live,
346 50)); 335 50));
347 } 336 }
348 337
349 void PrerenderHistograms::RecordPerSessionCount(int count) const { 338 void PrerenderHistograms::RecordPerSessionCount(Origin origin,
339 int count) const {
350 PREFIXED_HISTOGRAM( 340 PREFIXED_HISTOGRAM(
351 "PrerendersPerSessionCount", 341 "PrerendersPerSessionCount", origin,
352 UMA_HISTOGRAM_COUNTS(name, count)); 342 UMA_HISTOGRAM_COUNTS(name, count));
353 } 343 }
354 344
355 void PrerenderHistograms::RecordTimeBetweenPrerenderRequests( 345 void PrerenderHistograms::RecordTimeBetweenPrerenderRequests(
356 base::TimeDelta time) const { 346 Origin origin, base::TimeDelta time) const {
357 PREFIXED_HISTOGRAM( 347 PREFIXED_HISTOGRAM(
358 "TimeBetweenPrerenderRequests", 348 "TimeBetweenPrerenderRequests", origin,
359 UMA_HISTOGRAM_TIMES(name, time)); 349 UMA_HISTOGRAM_TIMES(name, time));
360 } 350 }
361 351
362 void PrerenderHistograms::RecordFinalStatus( 352 void PrerenderHistograms::RecordFinalStatus(
363 Origin origin, 353 Origin origin,
364 uint8 experiment_id, 354 uint8 experiment_id,
365 PrerenderContents::MatchCompleteStatus mc_status, 355 PrerenderContents::MatchCompleteStatus mc_status,
366 FinalStatus final_status) const { 356 FinalStatus final_status) const {
367 DCHECK(final_status != FINAL_STATUS_MAX); 357 DCHECK(final_status != FINAL_STATUS_MAX);
368 358
(...skipping 13 matching lines...) Expand all
382 UMA_HISTOGRAM_ENUMERATION(name, final_status, FINAL_STATUS_MAX)); 372 UMA_HISTOGRAM_ENUMERATION(name, final_status, FINAL_STATUS_MAX));
383 } 373 }
384 } 374 }
385 375
386 uint8 PrerenderHistograms::GetCurrentExperimentId() const { 376 uint8 PrerenderHistograms::GetCurrentExperimentId() const {
387 if (!WithinWindow()) 377 if (!WithinWindow())
388 return kNoExperiment; 378 return kNoExperiment;
389 return last_experiment_id_; 379 return last_experiment_id_;
390 } 380 }
391 381
392 Origin PrerenderHistograms::GetCurrentOrigin() const {
393 if (!WithinWindow())
394 return ORIGIN_LINK_REL_PRERENDER;
395 return last_origin_;
396 }
397
398 bool PrerenderHistograms::IsOriginExperimentWash() const { 382 bool PrerenderHistograms::IsOriginExperimentWash() const {
399 if (!WithinWindow()) 383 if (!WithinWindow())
400 return false; 384 return false;
401 return origin_experiment_wash_; 385 return origin_experiment_wash_;
402 } 386 }
403 387
404 void PrerenderHistograms::RecordLocalPredictorEvent(
405 PrerenderLocalPredictor::Event event) const {
406 UMA_HISTOGRAM_ENUMERATION(
407 ComposeHistogramName("", base::FieldTrial::MakeName(
408 "LocalPredictorEvent", "Prerender")),
409 event,
410 PrerenderLocalPredictor::EVENT_MAX_VALUE);
411 }
412
413 void PrerenderHistograms::RecordLocalPredictorTimeUntilUsed(
414 base::TimeDelta time_until_used, base::TimeDelta max_age) const {
415 PREFIXED_HISTOGRAM(
416 "LocalPredictorTimeUntilUsed",
417 UMA_HISTOGRAM_CUSTOM_TIMES(
418 name,
419 time_until_used,
420 base::TimeDelta::FromMilliseconds(10),
421 max_age,
422 50));
423 }
424
425 } // namespace prerender 388 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698