treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 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_tiles/metrics.h" |
| 6 | |
| 7 | #include <string> |
| 8 | |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 9 | #include "base/metrics/histogram_functions.h" |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 10 | #include "base/metrics/histogram_macros.h" |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 11 | #include "base/strings/stringprintf.h" |
Kristi Park | 01ca125 | 2019-05-10 22:39:05 | [diff] [blame] | 12 | #include "components/ntp_tiles/constants.h" |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 13 | |
| 14 | namespace ntp_tiles { |
| 15 | namespace metrics { |
| 16 | |
| 17 | namespace { |
| 18 | |
Friedrich Horschig | efec081 | 2017-09-28 18:50:17 | [diff] [blame] | 19 | const int kLastTitleSource = static_cast<int>(TileTitleSource::LAST); |
| 20 | |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 21 | // Identifiers for the various tile sources. |
| 22 | const char kHistogramClientName[] = "client"; |
| 23 | const char kHistogramServerName[] = "server"; |
Friedrich Horschig | 7706ef6 | 2017-08-25 08:20:00 | [diff] [blame] | 24 | const char kHistogramPopularName[] = "popular_fetched"; |
| 25 | const char kHistogramBakedInName[] = "popular_baked_in"; |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 26 | const char kHistogramWhitelistName[] = "whitelist"; |
Yafei Duan | 3797cf4 | 2018-07-14 01:03:58 | [diff] [blame] | 27 | const char kHistogramHomepageName[] = "homepage"; |
kristipark | c019977 | 2018-07-18 05:25:42 | [diff] [blame] | 28 | const char kHistogramCustomLinksName[] = "custom_links"; |
Cathy Li | 4892ee0 | 2019-05-22 22:58:15 | [diff] [blame] | 29 | const char kHistogramExploreName[] = "explore"; |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 30 | |
mastiz | 8619a46 | 2017-02-09 16:46:13 | [diff] [blame] | 31 | // Suffixes for the various icon types. |
treib | 80f5122 | 2017-04-07 07:59:36 | [diff] [blame] | 32 | const char kTileTypeSuffixIconColor[] = "IconsColor"; |
| 33 | const char kTileTypeSuffixIconGray[] = "IconsGray"; |
| 34 | const char kTileTypeSuffixIconReal[] = "IconsReal"; |
mastiz | 8619a46 | 2017-02-09 16:46:13 | [diff] [blame] | 35 | |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 36 | void LogUmaHistogramAge(const std::string& name, const base::TimeDelta& value) { |
| 37 | // Log the value in number of seconds. |
| 38 | base::UmaHistogramCustomCounts(name, value.InSeconds(), 5, |
| 39 | base::TimeDelta::FromDays(14).InSeconds(), 20); |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 40 | } |
| 41 | |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 42 | std::string GetSourceHistogramName(TileSource source) { |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 43 | switch (source) { |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 44 | case TileSource::TOP_SITES: |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 45 | return kHistogramClientName; |
Friedrich Horschig | 7706ef6 | 2017-08-25 08:20:00 | [diff] [blame] | 46 | case TileSource::POPULAR_BAKED_IN: |
| 47 | return kHistogramBakedInName; |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 48 | case TileSource::POPULAR: |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 49 | return kHistogramPopularName; |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 50 | case TileSource::WHITELIST: |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 51 | return kHistogramWhitelistName; |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 52 | case TileSource::SUGGESTIONS_SERVICE: |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 53 | return kHistogramServerName; |
Yafei Duan | 3797cf4 | 2018-07-14 01:03:58 | [diff] [blame] | 54 | case TileSource::HOMEPAGE: |
| 55 | return kHistogramHomepageName; |
kristipark | c019977 | 2018-07-18 05:25:42 | [diff] [blame] | 56 | case TileSource::CUSTOM_LINKS: |
| 57 | return kHistogramCustomLinksName; |
Cathy Li | 4892ee0 | 2019-05-22 22:58:15 | [diff] [blame] | 58 | case TileSource::EXPLORE: |
| 59 | return kHistogramExploreName; |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 60 | } |
| 61 | NOTREACHED(); |
| 62 | return std::string(); |
| 63 | } |
| 64 | |
treib | 80f5122 | 2017-04-07 07:59:36 | [diff] [blame] | 65 | const char* GetTileTypeSuffix(TileVisualType type) { |
mastiz | 8619a46 | 2017-02-09 16:46:13 | [diff] [blame] | 66 | switch (type) { |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 67 | case TileVisualType::ICON_COLOR: |
treib | 80f5122 | 2017-04-07 07:59:36 | [diff] [blame] | 68 | return kTileTypeSuffixIconColor; |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 69 | case TileVisualType::ICON_DEFAULT: |
treib | 80f5122 | 2017-04-07 07:59:36 | [diff] [blame] | 70 | return kTileTypeSuffixIconGray; |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 71 | case TileVisualType::ICON_REAL: |
treib | 80f5122 | 2017-04-07 07:59:36 | [diff] [blame] | 72 | return kTileTypeSuffixIconReal; |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 73 | case TileVisualType::NONE: // Fall through. |
treib | 231212e | 2017-04-04 17:09:22 | [diff] [blame] | 74 | case TileVisualType::UNKNOWN_TILE_TYPE: |
mastiz | 8619a46 | 2017-02-09 16:46:13 | [diff] [blame] | 75 | break; |
| 76 | } |
| 77 | return nullptr; |
| 78 | } |
| 79 | |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 80 | } // namespace |
| 81 | |
Jan Krcal | 437702b | 2017-06-23 07:22:38 | [diff] [blame] | 82 | void RecordPageImpression(int number_of_tiles) { |
Ilya Sherman | 1edb6f18 | 2017-12-12 04:00:42 | [diff] [blame] | 83 | base::UmaHistogramSparse("NewTabPage.NumberOfTiles", number_of_tiles); |
Jan Krcal | 437702b | 2017-06-23 07:22:38 | [diff] [blame] | 84 | } |
| 85 | |
Justin DeWitt | 7aca2b1 | 2019-11-06 17:12:01 | [diff] [blame] | 86 | void RecordTileImpression(const NTPTileImpression& impression) { |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 87 | UMA_HISTOGRAM_ENUMERATION("NewTabPage.SuggestionsImpression", |
| 88 | impression.index, kMaxNumTiles); |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 89 | |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 90 | std::string source_name = GetSourceHistogramName(impression.source); |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 91 | base::UmaHistogramExactLinear( |
| 92 | base::StringPrintf("NewTabPage.SuggestionsImpression.%s", |
| 93 | source_name.c_str()), |
| 94 | impression.index, kMaxNumTiles); |
| 95 | |
| 96 | if (!impression.data_generation_time.is_null()) { |
| 97 | const base::TimeDelta age = |
| 98 | base::Time::Now() - impression.data_generation_time; |
| 99 | LogUmaHistogramAge("NewTabPage.SuggestionsImpressionAge", age); |
| 100 | LogUmaHistogramAge( |
| 101 | base::StringPrintf("NewTabPage.SuggestionsImpressionAge.%s", |
| 102 | source_name.c_str()), |
| 103 | age); |
| 104 | } |
treib | e3ca5da | 2016-11-24 17:26:55 | [diff] [blame] | 105 | |
Friedrich Horschig | efec081 | 2017-09-28 18:50:17 | [diff] [blame] | 106 | UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileTitle", |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 107 | static_cast<int>(impression.title_source), |
Friedrich Horschig | efec081 | 2017-09-28 18:50:17 | [diff] [blame] | 108 | kLastTitleSource + 1); |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 109 | base::UmaHistogramExactLinear( |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 110 | base::StringPrintf("NewTabPage.TileTitle.%s", |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 111 | GetSourceHistogramName(impression.source).c_str()), |
| 112 | static_cast<int>(impression.title_source), kLastTitleSource + 1); |
Friedrich Horschig | efec081 | 2017-09-28 18:50:17 | [diff] [blame] | 113 | |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 114 | if (impression.visual_type > LAST_RECORDED_TILE_TYPE) { |
Jan Krcal | 437702b | 2017-06-23 07:22:38 | [diff] [blame] | 115 | return; |
| 116 | } |
treib | e3ca5da | 2016-11-24 17:26:55 | [diff] [blame] | 117 | |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 118 | UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileType", impression.visual_type, |
Jan Krcal | 437702b | 2017-06-23 07:22:38 | [diff] [blame] | 119 | LAST_RECORDED_TILE_TYPE + 1); |
treib | e3ca5da | 2016-11-24 17:26:55 | [diff] [blame] | 120 | |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 121 | base::UmaHistogramExactLinear( |
| 122 | base::StringPrintf("NewTabPage.TileType.%s", source_name.c_str()), |
| 123 | impression.visual_type, LAST_RECORDED_TILE_TYPE + 1); |
treib | 09787d83 | 2016-11-23 16:12:46 | [diff] [blame] | 124 | |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 125 | const char* tile_type_suffix = GetTileTypeSuffix(impression.visual_type); |
Jan Krcal | 437702b | 2017-06-23 07:22:38 | [diff] [blame] | 126 | if (tile_type_suffix) { |
Justin DeWitt | 7aca2b1 | 2019-11-06 17:12:01 | [diff] [blame] | 127 | // TODO(http://crbug.com/1021598): Add UKM here. |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 128 | base::UmaHistogramExactLinear( |
| 129 | base::StringPrintf("NewTabPage.SuggestionsImpression.%s", |
| 130 | tile_type_suffix), |
| 131 | impression.index, kMaxNumTiles); |
Mikel Astiz | 5774c18 | 2017-10-26 10:59:51 | [diff] [blame] | 132 | |
Mikel Astiz | a5ea255f | 2017-11-06 22:50:15 | [diff] [blame] | 133 | if (impression.icon_type != favicon_base::IconType::kInvalid) { |
Mikel Astiz | 26855ed | 2017-11-15 21:59:49 | [diff] [blame] | 134 | base::UmaHistogramEnumeration( |
Mikel Astiz | 5774c18 | 2017-10-26 10:59:51 | [diff] [blame] | 135 | base::StringPrintf("NewTabPage.TileFaviconType.%s", tile_type_suffix), |
Mikel Astiz | 26855ed | 2017-11-15 21:59:49 | [diff] [blame] | 136 | impression.icon_type, favicon_base::IconType::kCount); |
Mikel Astiz | 5774c18 | 2017-10-26 10:59:51 | [diff] [blame] | 137 | } |
| 138 | } |
| 139 | |
Mikel Astiz | a5ea255f | 2017-11-06 22:50:15 | [diff] [blame] | 140 | if (impression.icon_type != favicon_base::IconType::kInvalid) { |
Mikel Astiz | 26855ed | 2017-11-15 21:59:49 | [diff] [blame] | 141 | base::UmaHistogramEnumeration("NewTabPage.TileFaviconType", |
| 142 | impression.icon_type, |
| 143 | favicon_base::IconType::kCount); |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 144 | } |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 145 | } |
| 146 | |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 147 | void RecordTileClick(const NTPTileImpression& impression) { |
| 148 | UMA_HISTOGRAM_ENUMERATION("NewTabPage.MostVisited", impression.index, |
| 149 | kMaxNumTiles); |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 150 | |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 151 | std::string source_name = GetSourceHistogramName(impression.source); |
| 152 | base::UmaHistogramExactLinear( |
| 153 | base::StringPrintf("NewTabPage.MostVisited.%s", source_name.c_str()), |
| 154 | impression.index, kMaxNumTiles); |
| 155 | |
| 156 | if (!impression.data_generation_time.is_null()) { |
| 157 | const base::TimeDelta age = |
| 158 | base::Time::Now() - impression.data_generation_time; |
| 159 | LogUmaHistogramAge("NewTabPage.MostVisitedAge", age); |
| 160 | LogUmaHistogramAge( |
| 161 | base::StringPrintf("NewTabPage.MostVisitedAge.%s", source_name.c_str()), |
| 162 | age); |
| 163 | } |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 164 | |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 165 | const char* tile_type_suffix = GetTileTypeSuffix(impression.visual_type); |
treib | 80f5122 | 2017-04-07 07:59:36 | [diff] [blame] | 166 | if (tile_type_suffix) { |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 167 | base::UmaHistogramExactLinear( |
| 168 | base::StringPrintf("NewTabPage.MostVisited.%s", tile_type_suffix), |
| 169 | impression.index, kMaxNumTiles); |
Mikel Astiz | 5774c18 | 2017-10-26 10:59:51 | [diff] [blame] | 170 | |
Mikel Astiz | a5ea255f | 2017-11-06 22:50:15 | [diff] [blame] | 171 | if (impression.icon_type != favicon_base::IconType::kInvalid) { |
Mikel Astiz | 26855ed | 2017-11-15 21:59:49 | [diff] [blame] | 172 | base::UmaHistogramEnumeration( |
Mikel Astiz | 5774c18 | 2017-10-26 10:59:51 | [diff] [blame] | 173 | base::StringPrintf("NewTabPage.TileFaviconTypeClicked.%s", |
| 174 | tile_type_suffix), |
Mikel Astiz | 26855ed | 2017-11-15 21:59:49 | [diff] [blame] | 175 | impression.icon_type, favicon_base::IconType::kCount); |
Mikel Astiz | 5774c18 | 2017-10-26 10:59:51 | [diff] [blame] | 176 | } |
| 177 | } |
| 178 | |
Mikel Astiz | a5ea255f | 2017-11-06 22:50:15 | [diff] [blame] | 179 | if (impression.icon_type != favicon_base::IconType::kInvalid) { |
Mikel Astiz | 26855ed | 2017-11-15 21:59:49 | [diff] [blame] | 180 | base::UmaHistogramEnumeration("NewTabPage.TileFaviconTypeClicked", |
| 181 | impression.icon_type, |
| 182 | favicon_base::IconType::kCount); |
mastiz | 8619a46 | 2017-02-09 16:46:13 | [diff] [blame] | 183 | } |
| 184 | |
Friedrich Horschig | efec081 | 2017-09-28 18:50:17 | [diff] [blame] | 185 | UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileTitleClicked", |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 186 | static_cast<int>(impression.title_source), |
Friedrich Horschig | efec081 | 2017-09-28 18:50:17 | [diff] [blame] | 187 | kLastTitleSource + 1); |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 188 | base::UmaHistogramExactLinear( |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 189 | base::StringPrintf("NewTabPage.TileTitleClicked.%s", |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 190 | GetSourceHistogramName(impression.source).c_str()), |
| 191 | static_cast<int>(impression.title_source), kLastTitleSource + 1); |
Friedrich Horschig | efec081 | 2017-09-28 18:50:17 | [diff] [blame] | 192 | |
Mikel Astiz | bc131d8 | 2017-10-09 06:16:41 | [diff] [blame] | 193 | if (impression.visual_type <= LAST_RECORDED_TILE_TYPE) { |
| 194 | UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileTypeClicked", |
| 195 | impression.visual_type, |
treib | 80f5122 | 2017-04-07 07:59:36 | [diff] [blame] | 196 | LAST_RECORDED_TILE_TYPE + 1); |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 197 | |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 198 | base::UmaHistogramExactLinear( |
treib | 6e3618a | 2016-10-25 14:07:28 | [diff] [blame] | 199 | base::StringPrintf("NewTabPage.TileTypeClicked.%s", |
Mikel Astiz | a0f98cc | 2017-10-12 19:48:48 | [diff] [blame] | 200 | GetSourceHistogramName(impression.source).c_str()), |
| 201 | impression.visual_type, LAST_RECORDED_TILE_TYPE + 1); |
treib | 6e3618a | 2016-10-25 14:07:28 | [diff] [blame] | 202 | } |
treib | b5f7233d | 2016-10-18 09:14:32 | [diff] [blame] | 203 | } |
| 204 | |
| 205 | } // namespace metrics |
| 206 | } // namespace ntp_tiles |