metrics.cc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. #include "components/ntp_tiles/metrics.h"
  5. #include <string>
  6. #include "base/metrics/histogram_functions.h"
  7. #include "base/metrics/histogram_macros.h"
  8. #include "base/metrics/user_metrics.h"
  9. #include "base/notreached.h"
  10. #include "base/strings/stringprintf.h"
  11. #include "components/ntp_tiles/constants.h"
  12. namespace ntp_tiles {
  13. namespace metrics {
  14. namespace {
  15. const int kLastTitleSource = static_cast<int>(TileTitleSource::LAST);
  16. // Identifiers for the various tile sources. Should sync with
  17. // NewTabPageProviders in histogram_suffixes_list.xml.
  18. const char kHistogramClientName[] = "client";
  19. const char kHistogramPopularName[] = "popular_fetched";
  20. const char kHistogramBakedInName[] = "popular_baked_in";
  21. const char kHistogramAllowlistName[] = "allowlist";
  22. const char kHistogramHomepageName[] = "homepage";
  23. const char kHistogramCustomLinksName[] = "custom_links";
  24. const char kHistogramExploreName[] = "explore";
  25. // Suffixes for the various icon types.
  26. const char kTileTypeSuffixIconColor[] = "IconsColor";
  27. const char kTileTypeSuffixIconGray[] = "IconsGray";
  28. const char kTileTypeSuffixIconReal[] = "IconsReal";
  29. std::string GetSourceHistogramName(TileSource source) {
  30. switch (source) {
  31. case TileSource::TOP_SITES:
  32. return kHistogramClientName;
  33. case TileSource::POPULAR_BAKED_IN:
  34. return kHistogramBakedInName;
  35. case TileSource::POPULAR:
  36. return kHistogramPopularName;
  37. case TileSource::ALLOWLIST:
  38. return kHistogramAllowlistName;
  39. case TileSource::HOMEPAGE:
  40. return kHistogramHomepageName;
  41. case TileSource::CUSTOM_LINKS:
  42. return kHistogramCustomLinksName;
  43. case TileSource::EXPLORE:
  44. return kHistogramExploreName;
  45. }
  46. NOTREACHED();
  47. return std::string();
  48. }
  49. const char* GetTileTypeSuffix(TileVisualType type) {
  50. switch (type) {
  51. case TileVisualType::ICON_COLOR:
  52. return kTileTypeSuffixIconColor;
  53. case TileVisualType::ICON_DEFAULT:
  54. return kTileTypeSuffixIconGray;
  55. case TileVisualType::ICON_REAL:
  56. return kTileTypeSuffixIconReal;
  57. case TileVisualType::NONE: // Fall through.
  58. case TileVisualType::UNKNOWN_TILE_TYPE:
  59. break;
  60. }
  61. return nullptr;
  62. }
  63. } // namespace
  64. void RecordPageImpression(int number_of_tiles) {
  65. base::UmaHistogramSparse("NewTabPage.NumberOfTiles", number_of_tiles);
  66. }
  67. void RecordTileImpression(const NTPTileImpression& impression) {
  68. UMA_HISTOGRAM_ENUMERATION("NewTabPage.SuggestionsImpression",
  69. impression.index, kMaxNumTiles);
  70. std::string source_name = GetSourceHistogramName(impression.source);
  71. base::UmaHistogramExactLinear(
  72. base::StringPrintf("NewTabPage.SuggestionsImpression.%s",
  73. source_name.c_str()),
  74. impression.index, kMaxNumTiles);
  75. UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileTitle",
  76. static_cast<int>(impression.title_source),
  77. kLastTitleSource + 1);
  78. base::UmaHistogramExactLinear(
  79. base::StringPrintf("NewTabPage.TileTitle.%s",
  80. GetSourceHistogramName(impression.source).c_str()),
  81. static_cast<int>(impression.title_source), kLastTitleSource + 1);
  82. if (impression.visual_type > LAST_RECORDED_TILE_TYPE) {
  83. return;
  84. }
  85. UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileType", impression.visual_type,
  86. LAST_RECORDED_TILE_TYPE + 1);
  87. base::UmaHistogramExactLinear(
  88. base::StringPrintf("NewTabPage.TileType.%s", source_name.c_str()),
  89. impression.visual_type, LAST_RECORDED_TILE_TYPE + 1);
  90. const char* tile_type_suffix = GetTileTypeSuffix(impression.visual_type);
  91. if (tile_type_suffix) {
  92. // TODO(http://crbug.com/1021598): Add UKM here.
  93. base::UmaHistogramExactLinear(
  94. base::StringPrintf("NewTabPage.SuggestionsImpression.%s",
  95. tile_type_suffix),
  96. impression.index, kMaxNumTiles);
  97. if (impression.icon_type != favicon_base::IconType::kInvalid) {
  98. base::UmaHistogramEnumeration(
  99. base::StringPrintf("NewTabPage.TileFaviconType.%s", tile_type_suffix),
  100. impression.icon_type, favicon_base::IconType::kCount);
  101. }
  102. }
  103. if (impression.icon_type != favicon_base::IconType::kInvalid) {
  104. base::UmaHistogramEnumeration("NewTabPage.TileFaviconType",
  105. impression.icon_type,
  106. favicon_base::IconType::kCount);
  107. }
  108. }
  109. void RecordTileClick(const NTPTileImpression& impression) {
  110. UMA_HISTOGRAM_ENUMERATION("NewTabPage.MostVisited", impression.index,
  111. kMaxNumTiles);
  112. base::RecordAction(base::UserMetricsAction("NewTabPage.MostVisited.Clicked"));
  113. std::string source_name = GetSourceHistogramName(impression.source);
  114. base::UmaHistogramExactLinear(
  115. base::StringPrintf("NewTabPage.MostVisited.%s", source_name.c_str()),
  116. impression.index, kMaxNumTiles);
  117. const char* tile_type_suffix = GetTileTypeSuffix(impression.visual_type);
  118. if (tile_type_suffix) {
  119. base::UmaHistogramExactLinear(
  120. base::StringPrintf("NewTabPage.MostVisited.%s", tile_type_suffix),
  121. impression.index, kMaxNumTiles);
  122. if (impression.icon_type != favicon_base::IconType::kInvalid) {
  123. base::UmaHistogramEnumeration(
  124. base::StringPrintf("NewTabPage.TileFaviconTypeClicked.%s",
  125. tile_type_suffix),
  126. impression.icon_type, favicon_base::IconType::kCount);
  127. }
  128. }
  129. if (impression.icon_type != favicon_base::IconType::kInvalid) {
  130. base::UmaHistogramEnumeration("NewTabPage.TileFaviconTypeClicked",
  131. impression.icon_type,
  132. favicon_base::IconType::kCount);
  133. }
  134. UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileTitleClicked",
  135. static_cast<int>(impression.title_source),
  136. kLastTitleSource + 1);
  137. base::UmaHistogramExactLinear(
  138. base::StringPrintf("NewTabPage.TileTitleClicked.%s",
  139. GetSourceHistogramName(impression.source).c_str()),
  140. static_cast<int>(impression.title_source), kLastTitleSource + 1);
  141. if (impression.visual_type <= LAST_RECORDED_TILE_TYPE) {
  142. UMA_HISTOGRAM_ENUMERATION("NewTabPage.TileTypeClicked",
  143. impression.visual_type,
  144. LAST_RECORDED_TILE_TYPE + 1);
  145. base::UmaHistogramExactLinear(
  146. base::StringPrintf("NewTabPage.TileTypeClicked.%s",
  147. GetSourceHistogramName(impression.source).c_str()),
  148. impression.visual_type, LAST_RECORDED_TILE_TYPE + 1);
  149. }
  150. }
  151. void RecordsMigratedDefaultAppDeleted(
  152. const DeletedTileType& most_visited_app_type) {
  153. base::UmaHistogramEnumeration("NewTabPage.MostVisitedMigratedDefaultAppType",
  154. most_visited_app_type);
  155. }
  156. } // namespace metrics
  157. } // namespace ntp_tiles