[Files Ranking] Add metrics for files ranking.
Adds 2 metrics for file ranking:
1. Number of clicks according to different search result's display type
in zero-state.
2. Number of file opens according to different open types.
Bug: 959679
Change-Id: I57e531162c5fdbb826a5e6cb4b0e266694c1e25e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1616926
Reviewed-by: Steven Holte <holte@chromium.org>
Reviewed-by: calamity <calamity@chromium.org>
Reviewed-by: Jia Meng <jiameng@chromium.org>
Commit-Queue: Thanh Nguyen <thanhdng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#663367}
diff --git a/chrome/browser/ui/app_list/search/search_controller.cc b/chrome/browser/ui/app_list/search/search_controller.cc
index 0b3cca4c..c873594 100644
--- a/chrome/browser/ui/app_list/search/search_controller.cc
+++ b/chrome/browser/ui/app_list/search/search_controller.cc
@@ -12,6 +12,7 @@
#include "ash/public/cpp/app_list/app_list_config.h"
#include "ash/public/cpp/app_list/app_list_features.h"
#include "base/bind.h"
+#include "base/metrics/histogram_macros.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -34,6 +35,9 @@
namespace {
+constexpr char kLogDisplayTypeClickedResultZeroState[] =
+ "Apps.LogDisplayTypeClickedResultZeroState";
+
// Normalizes training targets by removing any scheme prefix and trailing slash:
// "arc://[id]/" to "[id]". This is necessary because apps launched from
// different parts of the launcher have differently formatted IDs.
@@ -87,6 +91,13 @@
if (!result)
return;
+ // Log the display type of the clicked result in zero-state
+ if (query_for_recommendation_) {
+ UMA_HISTOGRAM_ENUMERATION(kLogDisplayTypeClickedResultZeroState,
+ result->display_type(),
+ ash::SearchResultDisplayType::kLast);
+ }
+
result->Open(event_flags);
// Launching apps can take some time. It looks nicer to dismiss the app list.
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
index 6d497db..a89f71d 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
@@ -10,6 +10,7 @@
#include "ash/public/cpp/app_list/app_list_types.h"
#include "base/macros.h"
#include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/chromeos/file_manager/file_tasks_notifier.h"
#include "chrome/browser/chromeos/file_manager/file_tasks_notifier_factory.h"
@@ -24,10 +25,13 @@
using base::Time;
using base::TimeDelta;
+using file_manager::file_tasks::FileTasksObserver;
// Limits how frequently models are queried for ranking results.
constexpr TimeDelta kMinSecondsBetweenFetches = TimeDelta::FromSeconds(1);
+constexpr char kLogFileOpenType[] = "RecurrenceRanker.LogFileOpenType";
+
// Represents each model used within the SearchResultRanker.
enum class Model { NONE, RESULTS_LIST_GROUP_RANKER };
@@ -47,6 +51,33 @@
}
}
+// Represents various open types of file open events. These values persist to
+// logs. Entries should not be renumbered and numeric values should never
+// be reused.
+enum class FileOpenType {
+ kUnknown = 0,
+ kLaunch = 1,
+ kOpen = 2,
+ kSaveAs = 3,
+ kDownload = 4,
+ kMaxValue = kDownload,
+};
+
+FileOpenType GetTypeFromFileTaskNotifier(FileTasksObserver::OpenType type) {
+ switch (type) {
+ case FileTasksObserver::OpenType::kLaunch:
+ return FileOpenType::kLaunch;
+ case FileTasksObserver::OpenType::kOpen:
+ return FileOpenType::kOpen;
+ case FileTasksObserver::OpenType::kSaveAs:
+ return FileOpenType::kSaveAs;
+ case FileTasksObserver::OpenType::kDownload:
+ return FileOpenType::kDownload;
+ default:
+ return FileOpenType::kUnknown;
+ }
+}
+
} // namespace
SearchResultRanker::SearchResultRanker(Profile* profile)
@@ -75,15 +106,14 @@
app_list_features::kEnableQueryBasedMixedTypesRanker,
"boost_coefficient", 0.1);
}
-
profile_ = profile;
- if (enable_zero_state_mixed_types_) {
- if (auto* notifier =
- file_manager::file_tasks::FileTasksNotifier::GetForProfile(
- profile_)) {
- notifier->AddObserver(this);
- }
+ if (auto* notifier =
+ file_manager::file_tasks::FileTasksNotifier::GetForProfile(
+ profile_)) {
+ notifier->AddObserver(this);
+ }
+ if (enable_zero_state_mixed_types_) {
RecurrenceRankerConfigProto config;
config.set_min_seconds_between_saves(240u);
config.set_condition_limit(0u);
@@ -107,12 +137,10 @@
}
SearchResultRanker::~SearchResultRanker() {
- if (enable_zero_state_mixed_types_) {
- if (auto* notifier =
- file_manager::file_tasks::FileTasksNotifier::GetForProfile(
- profile_)) {
- notifier->RemoveObserver(this);
- }
+ if (auto* notifier =
+ file_manager::file_tasks::FileTasksNotifier::GetForProfile(
+ profile_)) {
+ notifier->RemoveObserver(this);
}
}
@@ -175,6 +203,10 @@
for (const auto& file_open : file_opens)
zero_state_mixed_types_ranker_->Record(file_open.path.value());
}
+ // Log the open type of file open events
+ for (const auto& file_open : file_opens)
+ UMA_HISTOGRAM_ENUMERATION(kLogFileOpenType,
+ GetTypeFromFileTaskNotifier(file_open.open_type));
}
RecurrenceRanker* SearchResultRanker::get_zero_state_mixed_types_ranker() {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 2606424..512f295 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -2192,6 +2192,7 @@
<int value="1" label="LIST"/>
<int value="2" label="TILE"/>
<int value="3" label="RECOMMENDATION"/>
+ <int value="4" label="CARD"/>
</enum>
<enum name="ApplistSearchResultOpenedSource">
@@ -24484,6 +24485,14 @@
<int value="14" label="Async DeleteFile Failed"/>
</enum>
+<enum name="FileOpenType">
+ <int value="0" label="Unknown"/>
+ <int value="1" label="Launch"/>
+ <int value="2" label="Open"/>
+ <int value="3" label="SaveAs"/>
+ <int value="4" label="Download"/>
+</enum>
+
<enum name="FileReaderLoaderFailureType">
<int value="0" label="Mojo pipe creation failed"/>
<int value="1" label="Data incomplete after synchronous reading"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 143baeb..0308867 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4803,6 +4803,17 @@
</summary>
</histogram>
+<histogram name="Apps.LogDisplayTypeClickedResultZeroState"
+ enum="AppListSearchResultDisplayType" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>thanhdng@chromium.org</owner>
+ <owner>tby@chromium.org</owner>
+ <summary>
+ Records number of clicks on search result for different display types in
+ zero-state.
+ </summary>
+</histogram>
+
<histogram name="Apps.NoteTakingApp.DefaultLaunchResult"
enum="NoteTakingAppLaunchResult">
<owner>derat@chromium.org</owner>
@@ -102243,6 +102254,16 @@
<summary>Log each stage of a recovery component event.</summary>
</histogram>
+<histogram name="RecurrenceRanker.LogFileOpenType" enum="FileOpenType"
+ expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>thanhdng@chromium.org</owner>
+ <owner>tby@chromium.org</owner>
+ <summary>
+ Records number of file opens for each file open type events.
+ </summary>
+</histogram>
+
<histogram name="Referrer.HeaderLength" units="bytes">
<owner>mkwst@chromium.org</owner>
<summary>