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

Side by Side Diff: components/ntp_snippets/user_classifier.cc

Issue 2315273002: Measure usage metrics to prepare for adaptive fetching rates in M55 (Closed)
Patch Set: Created 4 years, 3 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
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/ntp_snippets/user_classifier.h"
6
7 #include <algorithm>
8 #include <string>
9
10 #include "base/metrics/histogram_macros.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "components/ntp_snippets/pref_names.h"
13 #include "components/prefs/pref_registry_simple.h"
14 #include "components/prefs/pref_service.h"
15
16 namespace {
17
18 // TODO(jkrcal): Make all of this Finch configurable.
rkaplow 2016/09/07 13:33:10 nit, variations_service is the external chromium n
jkrcal 2016/09/07 14:19:08 Done.
19 // Default values to start the discounted-average metrics with.
20 const double kDefaultAverageHoursToOpenNTP = 24;
21 const double kDefaultAverageHoursToShowSuggestions = 48;
22 const double kDefaultAverageHoursToUseSuggestions = 96;
23 // The discount factor for computing the discounted-average metrics.
24 const double kDiscountFactor = 0.25;
25 // Never consider any larger interval than this (so that extreme situations such
26 // as loosing your phone or going for a long offline vacation do not skew the
Marc Treib 2016/09/07 13:23:48 nit: s/loosing/losing/
Bernhard Bauer 2016/09/07 13:46:45 Nit: "losing"
jkrcal 2016/09/07 14:19:08 Done.
27 // avg too much).
28 const double kMaxHours = 14*24;
29
30 const char kHistogramAverageHoursToOpenNTP[] =
31 "NewTabPage.UserClassifier.AverageHoursToOpenNTP";
32 const char kHistogramAverageHoursToShowSuggestions[] =
33 "NewTabPage.UserClassifier.AverageHoursToShowSuggestions";
34 const char kHistogramAverageHoursToUseSuggestions[] =
35 "NewTabPage.UserClassifier.AverageHoursToUseSuggestions";
36
37 } // namespace
38
39 namespace ntp_snippets {
40
41 UserClassifier::UserClassifier(PrefService* pref_service)
42 : pref_service_(pref_service) {}
43
44 UserClassifier::~UserClassifier() {}
45
46 // static
47 void UserClassifier::RegisterProfilePrefs(PrefRegistrySimple* registry) {
48 registry->RegisterDoublePref(prefs::kUserClassifierAverageHoursToOpenNTP,
49 kDefaultAverageHoursToOpenNTP);
50 registry->RegisterDoublePref(
51 prefs::kUserClassifierAverageHoursToShowSuggestions,
52 kDefaultAverageHoursToShowSuggestions);
53 registry->RegisterDoublePref(
54 prefs::kUserClassifierAverageHoursToUseSuggestions,
55 kDefaultAverageHoursToUseSuggestions);
56
57 registry->RegisterInt64Pref(prefs::kUserClassifierLastTimeToOpenNTP, 0);
58 registry->RegisterInt64Pref(prefs::kUserClassifierLastTimeToShowSuggestions,
59 0);
60 registry->RegisterInt64Pref(prefs::kUserClassifierLastTimeToUseSuggestions,
61 0);
62 }
63
64 void UserClassifier::OnNTPOpened() {
65 double avg = UpdateMetric(prefs::kUserClassifierAverageHoursToOpenNTP,
66 prefs::kUserClassifierLastTimeToOpenNTP,
67 kDefaultAverageHoursToOpenNTP);
68 UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToOpenNTP, avg, 1,
69 kMaxHours, 50);
70 }
71
72 void UserClassifier::OnSuggestionsShown() {
73 double avg = UpdateMetric(prefs::kUserClassifierAverageHoursToShowSuggestions,
74 prefs::kUserClassifierLastTimeToShowSuggestions,
75 kDefaultAverageHoursToShowSuggestions);
76 UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToShowSuggestions, avg, 1,
77 kMaxHours, 50);
78 }
79
80 void UserClassifier::OnSuggestionsUsed() {
81 double avg = UpdateMetric(prefs::kUserClassifierAverageHoursToUseSuggestions,
82 prefs::kUserClassifierLastTimeToUseSuggestions,
83 kDefaultAverageHoursToUseSuggestions);
84 UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToUseSuggestions, avg, 1,
85 kMaxHours, 50);
86 }
87
88 double UserClassifier::UpdateMetric(const char* metric_pref_name,
89 const char* last_time_pref_name,
Bernhard Bauer 2016/09/07 13:46:45 Nit: Align arguments.
jkrcal 2016/09/07 14:19:08 Done.
90 double default_metric_value) {
rkaplow 2016/09/07 13:33:10 align
jkrcal 2016/09/07 14:19:08 Done.
91 if (!pref_service_)
92 return default_metric_value;
93
94 double hours_since_last_time = std::min(
95 kMaxHours,
96 GetHoursSinceLastTime(last_time_pref_name, default_metric_value));
97 SetLastTimeToNow(last_time_pref_name);
98
99 double avg = pref_service_->GetDouble(metric_pref_name);
100 // Compute and store the new discounted average.
101 avg = hours_since_last_time * kDiscountFactor + avg * (1 - kDiscountFactor);
rkaplow 2016/09/07 13:33:10 is it best to discount after rounding down to the
jkrcal 2016/09/07 14:19:08 I do not understand. I treat the number always as
102 pref_service_->SetDouble(metric_pref_name, avg);
103 return avg;
104 }
105
106 double UserClassifier::GetHoursSinceLastTime(
107 const char* last_time_pref_name,
108 double default_hours_since_last_time) {
109 if (!pref_service_->HasPrefPath(last_time_pref_name))
110 return default_hours_since_last_time;
111
112 base::TimeDelta since_last_time =
113 base::Time::Now() - base::Time::FromInternalValue(
114 pref_service_->GetInt64(last_time_pref_name));
115 return since_last_time.InSecondsF() / 3600;
116 }
117
118 void UserClassifier::SetLastTimeToNow(const char* last_time_pref_name) {
119 pref_service_->SetInt64(last_time_pref_name,
120 base::Time::Now().ToInternalValue());
121 }
122
123 } // namespace ntp_snippets
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698