Commit e66354ff authored by Max Curran's avatar Max Curran Committed by Chromium LUCI CQ

Added UMA histogram to track whether the initial source language of a

page load was in the user's content languages.

The user's content languages loosely match the languages the user has
translated to before or has blocked for translation. This new UMA
histogram will therefore give us an idea of how often page loads are in
languages that the user doesn't understand.

Full design doc: https://docs.google.com/document/d/1dyWh1Xw5VgUA00VA-5PTgKQ6ItziPBnSyeDR8saJ9vM/edit?usp=sharing

Bug: 1114868
Change-Id: I170e33a4c36ac5c52bdf4cff2098c1bab94ed0d9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2559227
Commit-Queue: Max Curran <curranmax@chromium.org>
Reviewed-by: default avatarJesse Doherty <jwd@chromium.org>
Reviewed-by: default avatarScott Little <sclittle@chromium.org>
Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#832641}
parent 1ede1db7
...@@ -75,6 +75,12 @@ class MockTranslateMetricsLoggerContainer ...@@ -75,6 +75,12 @@ class MockTranslateMetricsLoggerContainer
mock_translate_metrics_logger_->LogOmniboxIconChange(is_omnibox_icon_shown); mock_translate_metrics_logger_->LogOmniboxIconChange(is_omnibox_icon_shown);
} }
void LogInitialSourceLanguage(const std::string& source_language_code,
bool is_in_users_content_languages) override {
mock_translate_metrics_logger_->LogInitialSourceLanguage(
source_language_code, is_in_users_content_languages);
}
void LogSourceLanguage(const std::string& source_language_code) override { void LogSourceLanguage(const std::string& source_language_code) override {
mock_translate_metrics_logger_->LogSourceLanguage(source_language_code); mock_translate_metrics_logger_->LogSourceLanguage(source_language_code);
} }
......
...@@ -39,6 +39,7 @@ class MockTranslateMetricsLogger : public TranslateMetricsLogger { ...@@ -39,6 +39,7 @@ class MockTranslateMetricsLogger : public TranslateMetricsLogger {
MOCK_METHOD0(LogReversion, void()); MOCK_METHOD0(LogReversion, void());
MOCK_METHOD1(LogUIChange, void(bool)); MOCK_METHOD1(LogUIChange, void(bool));
MOCK_METHOD1(LogOmniboxIconChange, void(bool)); MOCK_METHOD1(LogOmniboxIconChange, void(bool));
MOCK_METHOD2(LogInitialSourceLanguage, void(const std::string&, bool));
MOCK_METHOD1(LogSourceLanguage, void(const std::string&)); MOCK_METHOD1(LogSourceLanguage, void(const std::string&));
MOCK_METHOD1(LogTargetLanguage, void(const std::string&)); MOCK_METHOD1(LogTargetLanguage, void(const std::string&));
......
...@@ -161,7 +161,12 @@ void TranslateManager::InitiateTranslation(const std::string& page_lang) { ...@@ -161,7 +161,12 @@ void TranslateManager::InitiateTranslation(const std::string& page_lang) {
// TODO(crbug.com/924980): The ranker event shouldn't be a global on this // TODO(crbug.com/924980): The ranker event shouldn't be a global on this
// object. It should instead be passed around to code that uses it. // object. It should instead be passed around to code that uses it.
InitTranslateEvent(page_language_code, target_lang, *translate_prefs); InitTranslateEvent(page_language_code, target_lang, *translate_prefs);
GetActiveTranslateMetricsLogger()->LogSourceLanguage(page_language_code);
// Logs the initial source and target langauges, as well as whether the
// initial source language is in the user's content language.
GetActiveTranslateMetricsLogger()->LogInitialSourceLanguage(
page_language_code,
translate_prefs->IsBlockedLanguage(page_language_code));
GetActiveTranslateMetricsLogger()->LogTargetLanguage(target_lang); GetActiveTranslateMetricsLogger()->LogTargetLanguage(target_lang);
const TranslateTriggerDecision& decision = ComputePossibleOutcomes( const TranslateTriggerDecision& decision = ComputePossibleOutcomes(
......
...@@ -94,6 +94,8 @@ class TranslateMetricsLogger { ...@@ -94,6 +94,8 @@ class TranslateMetricsLogger {
// Used to record the source language and target language both initially and // Used to record the source language and target language both initially and
// if the user changes these values. // if the user changes these values.
virtual void LogInitialSourceLanguage(const std::string& source_language_code,
bool is_in_users_content_language) = 0;
virtual void LogSourceLanguage(const std::string& source_language_code) = 0; virtual void LogSourceLanguage(const std::string& source_language_code) = 0;
virtual void LogTargetLanguage(const std::string& target_language_code) = 0; virtual void LogTargetLanguage(const std::string& target_language_code) = 0;
}; };
......
...@@ -23,6 +23,8 @@ const char kTranslatePageLoadInitialSourceLanguage[] = ...@@ -23,6 +23,8 @@ const char kTranslatePageLoadInitialSourceLanguage[] =
const char kTranslatePageLoadInitialState[] = "Translate.PageLoad.InitialState"; const char kTranslatePageLoadInitialState[] = "Translate.PageLoad.InitialState";
const char kTranslatePageLoadInitialTargetLanguage[] = const char kTranslatePageLoadInitialTargetLanguage[] =
"Translate.PageLoad.InitialTargetLanguage"; "Translate.PageLoad.InitialTargetLanguage";
const char kTranslatePageLoadIsInitialSourceLanguageInUsersContentLanguages[] =
"Translate.PageLoad.IsInitialSourceLanguageInUsersContentLanguages";
const char kTranslatePageLoadNumTargetLanguageChanges[] = const char kTranslatePageLoadNumTargetLanguageChanges[] =
"Translate.PageLoad.NumTargetLanguageChanges"; "Translate.PageLoad.NumTargetLanguageChanges";
const char kTranslatePageLoadNumTranslations[] = const char kTranslatePageLoadNumTranslations[] =
...@@ -111,6 +113,9 @@ void TranslateMetricsLoggerImpl::RecordPageLoadUmaMetrics() { ...@@ -111,6 +113,9 @@ void TranslateMetricsLoggerImpl::RecordPageLoadUmaMetrics() {
base::HashMetricName(initial_source_language_)); base::HashMetricName(initial_source_language_));
base::UmaHistogramSparse(kTranslatePageLoadFinalSourceLanguage, base::UmaHistogramSparse(kTranslatePageLoadFinalSourceLanguage,
base::HashMetricName(current_source_language_)); base::HashMetricName(current_source_language_));
base::UmaHistogramBoolean(
kTranslatePageLoadIsInitialSourceLanguageInUsersContentLanguages,
is_initial_source_language_in_users_content_languages_);
base::UmaHistogramSparse(kTranslatePageLoadInitialTargetLanguage, base::UmaHistogramSparse(kTranslatePageLoadInitialTargetLanguage,
base::HashMetricName(initial_target_language_)); base::HashMetricName(initial_target_language_));
base::UmaHistogramSparse(kTranslatePageLoadFinalTargetLanguage, base::UmaHistogramSparse(kTranslatePageLoadFinalTargetLanguage,
...@@ -201,11 +206,18 @@ void TranslateMetricsLoggerImpl::LogOmniboxIconChange( ...@@ -201,11 +206,18 @@ void TranslateMetricsLoggerImpl::LogOmniboxIconChange(
current_state_is_omnibox_icon_shown_ = is_omnibox_icon_shown; current_state_is_omnibox_icon_shown_ = is_omnibox_icon_shown;
} }
void TranslateMetricsLoggerImpl::LogSourceLanguage( void TranslateMetricsLoggerImpl::LogInitialSourceLanguage(
const std::string& source_language_code) { const std::string& source_language_code,
if (initial_source_language_ == "") bool is_in_users_content_languages) {
initial_source_language_ = source_language_code; initial_source_language_ = source_language_code;
is_initial_source_language_in_users_content_languages_ =
is_in_users_content_languages;
current_source_language_ = source_language_code;
}
void TranslateMetricsLoggerImpl::LogSourceLanguage(
const std::string& source_language_code) {
current_source_language_ = source_language_code; current_source_language_ = source_language_code;
} }
......
...@@ -24,6 +24,8 @@ extern const char kTranslatePageLoadFinalTargetLanguage[]; ...@@ -24,6 +24,8 @@ extern const char kTranslatePageLoadFinalTargetLanguage[];
extern const char kTranslatePageLoadInitialSourceLanguage[]; extern const char kTranslatePageLoadInitialSourceLanguage[];
extern const char kTranslatePageLoadInitialState[]; extern const char kTranslatePageLoadInitialState[];
extern const char kTranslatePageLoadInitialTargetLanguage[]; extern const char kTranslatePageLoadInitialTargetLanguage[];
extern const char
kTranslatePageLoadIsInitialSourceLanguageInUsersContentLanguages[];
extern const char kTranslatePageLoadNumTargetLanguageChanges[]; extern const char kTranslatePageLoadNumTargetLanguageChanges[];
extern const char kTranslatePageLoadNumTranslations[]; extern const char kTranslatePageLoadNumTranslations[];
extern const char kTranslatePageLoadNumReversions[]; extern const char kTranslatePageLoadNumReversions[];
...@@ -49,6 +51,8 @@ class NullTranslateMetricsLogger : public TranslateMetricsLogger { ...@@ -49,6 +51,8 @@ class NullTranslateMetricsLogger : public TranslateMetricsLogger {
void LogReversion() override {} void LogReversion() override {}
void LogUIChange(bool is_ui_shown) override {} void LogUIChange(bool is_ui_shown) override {}
void LogOmniboxIconChange(bool is_omnibox_icon_shown) override {} void LogOmniboxIconChange(bool is_omnibox_icon_shown) override {}
void LogInitialSourceLanguage(const std::string& source_language_code,
bool is_in_users_content_languages) override {}
void LogSourceLanguage(const std::string& source_language_code) override {} void LogSourceLanguage(const std::string& source_language_code) override {}
void LogTargetLanguage(const std::string& target_language_code) override {} void LogTargetLanguage(const std::string& target_language_code) override {}
}; };
...@@ -89,6 +93,8 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger { ...@@ -89,6 +93,8 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger {
void LogReversion() override; void LogReversion() override;
void LogUIChange(bool is_ui_shown) override; void LogUIChange(bool is_ui_shown) override;
void LogOmniboxIconChange(bool is_omnibox_icon_shown) override; void LogOmniboxIconChange(bool is_omnibox_icon_shown) override;
void LogInitialSourceLanguage(const std::string& source_language_code,
bool is_in_users_content_languages) override;
void LogSourceLanguage(const std::string& source_language_code) override; void LogSourceLanguage(const std::string& source_language_code) override;
void LogTargetLanguage(const std::string& target_language_code) override; void LogTargetLanguage(const std::string& target_language_code) override;
...@@ -162,6 +168,7 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger { ...@@ -162,6 +168,7 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger {
// Tracks the source and target language over the course of the page load. // Tracks the source and target language over the course of the page load.
std::string initial_source_language_; std::string initial_source_language_;
std::string current_source_language_; std::string current_source_language_;
bool is_initial_source_language_in_users_content_languages_ = false;
std::string initial_target_language_; std::string initial_target_language_;
std::string current_target_language_; std::string current_target_language_;
......
...@@ -413,9 +413,14 @@ TEST_F(TranslateMetricsLoggerImplTest, ...@@ -413,9 +413,14 @@ TEST_F(TranslateMetricsLoggerImplTest,
TEST_F(TranslateMetricsLoggerImplTest, LogSourceLanguage) { TEST_F(TranslateMetricsLoggerImplTest, LogSourceLanguage) {
// Set constants for the test. // Set constants for the test.
std::string initial_source_language = "ru";
bool is_initial_source_language_in_users_content_languages = true;
std::vector<std::string> source_languages = {"en", "es", "fr", "it", "de"}; std::vector<std::string> source_languages = {"en", "es", "fr", "it", "de"};
// Log the source languages. // Log the source languages.
translate_metrics_logger()->LogInitialSourceLanguage(
initial_source_language,
is_initial_source_language_in_users_content_languages);
for (auto source_language : source_languages) for (auto source_language : source_languages)
translate_metrics_logger()->LogSourceLanguage(source_language); translate_metrics_logger()->LogSourceLanguage(source_language);
...@@ -425,7 +430,10 @@ TEST_F(TranslateMetricsLoggerImplTest, LogSourceLanguage) { ...@@ -425,7 +430,10 @@ TEST_F(TranslateMetricsLoggerImplTest, LogSourceLanguage) {
// Check that the histograms match expectations. // Check that the histograms match expectations.
histogram_tester()->ExpectUniqueSample( histogram_tester()->ExpectUniqueSample(
kTranslatePageLoadInitialSourceLanguage, kTranslatePageLoadInitialSourceLanguage,
base::HashMetricName(source_languages[0]), 1); base::HashMetricName(initial_source_language), 1);
histogram_tester()->ExpectUniqueSample(
kTranslatePageLoadIsInitialSourceLanguageInUsersContentLanguages,
is_initial_source_language_in_users_content_languages, 1);
histogram_tester()->ExpectUniqueSample( histogram_tester()->ExpectUniqueSample(
kTranslatePageLoadFinalSourceLanguage, kTranslatePageLoadFinalSourceLanguage,
base::HashMetricName(source_languages[source_languages.size() - 1]), 1); base::HashMetricName(source_languages[source_languages.size() - 1]), 1);
......
...@@ -555,6 +555,22 @@ reviews. Googlers can read more about this at go/gwsq-gerrit. ...@@ -555,6 +555,22 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
</summary> </summary>
</histogram> </histogram>
<histogram
name="Translate.PageLoad.IsInitialSourceLanguageInUsersContentLanguages"
enum="Boolean" expires_after="2021-04-04">
<owner>curranmax@google.com</owner>
<owner>megjablon@google.com</owner>
<owner>chrome-language@google.com</owner>
<summary>
Whether or not the initial source language of this page load is in the
user's content language. The user's content languages loosely match the
languages that the user has translated to before or blocked for translation.
This value is logged once the page load is completed or the first time
Chrome is backgrounded during the course of the page load, whichever comes
first.
</summary>
</histogram>
<histogram name="Translate.PageLoad.NumReversions" units="reversions" <histogram name="Translate.PageLoad.NumReversions" units="reversions"
expires_after="2021-04-04"> expires_after="2021-04-04">
<owner>curranmax@google.com</owner> <owner>curranmax@google.com</owner>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment