Add contextual cueing nudge decision event
Privacy doc here: https://docs.google.com/document/d/1LhnQ-2KDDdJMZ6eLieNr2EVlW1SP0ArhBfDFjUcCT0A/edit?resourcekey=0-bopXA880-mmI41RWLdrFtQ&tab=t.0#heading=h.k5jx6iluw4yt
Bug: 393434401
Change-Id: I1fa4af0456e71c42ee78d78b1f8c3361285b8d43
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6231553
Reviewed-by: Raj T <rajendrant@chromium.org>
Reviewed-by: Robert Kaplow <rkaplow@chromium.org>
Commit-Queue: Sophie Chang <sophiechang@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1416288}
diff --git a/chrome/browser/contextual_cueing/BUILD.gn b/chrome/browser/contextual_cueing/BUILD.gn
index ae1a71c..9b024cc 100644
--- a/chrome/browser/contextual_cueing/BUILD.gn
+++ b/chrome/browser/contextual_cueing/BUILD.gn
@@ -42,6 +42,8 @@
"//components/optimization_guide/proto:optimization_guide_proto",
"//components/pdf/common:constants",
"//pdf:buildflags",
+ "//services/metrics/public/cpp:metrics_cpp",
+ "//services/metrics/public/cpp:ukm_builders",
"//url",
]
if (enable_glic) {
diff --git a/chrome/browser/contextual_cueing/DEPS b/chrome/browser/contextual_cueing/DEPS
index 48c19d8..30faf7f 100644
--- a/chrome/browser/contextual_cueing/DEPS
+++ b/chrome/browser/contextual_cueing/DEPS
@@ -1,4 +1,5 @@
include_rules = [
"+components/keyed_service/core",
"+pdf/mojom/pdf.mojom.h",
+ "+services/metrics/public/cpp"
]
diff --git a/chrome/browser/contextual_cueing/contextual_cueing_helper.cc b/chrome/browser/contextual_cueing/contextual_cueing_helper.cc
index dbf1a243..950d73b 100644
--- a/chrome/browser/contextual_cueing/contextual_cueing_helper.cc
+++ b/chrome/browser/contextual_cueing/contextual_cueing_helper.cc
@@ -25,6 +25,8 @@
#include "components/optimization_guide/proto/contextual_cueing_metadata.pb.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
#include "url/gurl.h"
#include "url/origin.h"
@@ -36,9 +38,10 @@
class ScopedNudgeDecisionRecorder {
public:
- explicit ScopedNudgeDecisionRecorder(
- optimization_guide::proto::OptimizationType optimization_type)
- : optimization_type_(optimization_type) {}
+ ScopedNudgeDecisionRecorder(
+ optimization_guide::proto::OptimizationType optimization_type,
+ ukm::SourceId source_id)
+ : optimization_type_(optimization_type), source_id_(source_id) {}
~ScopedNudgeDecisionRecorder() {
CHECK_NE(nudge_decision_, NudgeDecision::kUnknown);
base::UmaHistogramEnumeration(
@@ -46,6 +49,12 @@
optimization_guide::GetStringNameForOptimizationType(
optimization_type_),
nudge_decision_);
+
+ auto* ukm_recorder = ukm::UkmRecorder::Get();
+ ukm::builders::ContextualCueing_NudgeDecision(source_id_)
+ .SetNudgeDecision(static_cast<int64_t>(nudge_decision_))
+ .SetOptimizationType(optimization_type_)
+ .Record(ukm_recorder->Get());
}
void set_nudge_decision(NudgeDecision nudge_decision) {
@@ -56,6 +65,7 @@
private:
optimization_guide::proto::OptimizationType optimization_type_;
+ ukm::SourceId source_id_;
NudgeDecision nudge_decision_ = NudgeDecision::kUnknown;
};
@@ -108,7 +118,8 @@
std::unique_ptr<ScopedNudgeDecisionRecorder> recorder =
std::make_unique<ScopedNudgeDecisionRecorder>(
- optimization_guide::proto::GLIC_CONTEXTUAL_CUEING);
+ optimization_guide::proto::GLIC_CONTEXTUAL_CUEING,
+ web_contents()->GetPrimaryMainFrame()->GetPageUkmSourceId());
optimization_guide::OptimizationMetadata metadata;
auto decision = optimization_guide_keyed_service_->CanApplyOptimization(
web_contents()->GetLastCommittedURL(),
diff --git a/chrome/browser/contextual_cueing/contextual_cueing_helper_interactive_uitest.cc b/chrome/browser/contextual_cueing/contextual_cueing_helper_interactive_uitest.cc
index ceb3724..8049eca 100644
--- a/chrome/browser/contextual_cueing/contextual_cueing_helper_interactive_uitest.cc
+++ b/chrome/browser/contextual_cueing/contextual_cueing_helper_interactive_uitest.cc
@@ -25,9 +25,11 @@
#include "components/optimization_guide/proto/contextual_cueing_metadata.pb.h"
#include "components/optimization_guide/proto/icon_view_metadata.pb.h"
#include "components/signin/public/identity_manager/account_capabilities_test_mutator.h"
+#include "components/ukm/test_ukm_recorder.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
#if BUILDFLAG(ENABLE_GLIC)
@@ -119,6 +121,7 @@
IN_PROC_BROWSER_TEST_F(ContextualCueingHelperBrowserTest,
TestCueLabelDisplayed) {
base::HistogramTester histogram_tester;
+ ukm::TestAutoSetUkmRecorder ukm_recorder;
EnableSignIn();
SetUpEnabledHints();
@@ -135,10 +138,23 @@
histogram_tester.ExpectUniqueSample(
"ContextualCueing.NudgeDecision.GlicContextualCueing",
contextual_cueing::NudgeDecision::kSuccess, 1);
+
+ auto entries = ukm_recorder.GetEntriesByName(
+ ukm::builders::ContextualCueing_NudgeDecision::kEntryName);
+ EXPECT_EQ(1u, entries.size());
+ auto* entry = entries[0].get();
+ ukm_recorder.ExpectEntryMetric(
+ entry,
+ ukm::builders::ContextualCueing_NudgeDecision::kOptimizationTypeName,
+ static_cast<int64_t>(optimization_guide::proto::GLIC_CONTEXTUAL_CUEING));
+ ukm_recorder.ExpectEntryMetric(
+ entry, ukm::builders::ContextualCueing_NudgeDecision::kNudgeDecisionName,
+ static_cast<int64_t>(contextual_cueing::NudgeDecision::kSuccess));
}
IN_PROC_BROWSER_TEST_F(ContextualCueingHelperBrowserTest, TestCueNotAvailable) {
base::HistogramTester histogram_tester;
+ ukm::TestAutoSetUkmRecorder ukm_recorder;
EnableSignIn();
@@ -154,11 +170,25 @@
histogram_tester.ExpectUniqueSample(
"ContextualCueing.NudgeDecision.GlicContextualCueing",
contextual_cueing::NudgeDecision::kServerDataUnavailable, 1);
+
+ auto entries = ukm_recorder.GetEntriesByName(
+ ukm::builders::ContextualCueing_NudgeDecision::kEntryName);
+ EXPECT_EQ(1u, entries.size());
+ auto* entry = entries[0].get();
+ ukm_recorder.ExpectEntryMetric(
+ entry,
+ ukm::builders::ContextualCueing_NudgeDecision::kOptimizationTypeName,
+ static_cast<int64_t>(optimization_guide::proto::GLIC_CONTEXTUAL_CUEING));
+ ukm_recorder.ExpectEntryMetric(
+ entry, ukm::builders::ContextualCueing_NudgeDecision::kNudgeDecisionName,
+ static_cast<int64_t>(
+ contextual_cueing::NudgeDecision::kServerDataUnavailable));
}
IN_PROC_BROWSER_TEST_F(ContextualCueingHelperBrowserTest,
TestServerDataMalformed) {
base::HistogramTester histogram_tester;
+ ukm::TestAutoSetUkmRecorder ukm_recorder;
EnableSignIn();
optimization_guide::OptimizationMetadata metadata;
@@ -180,11 +210,25 @@
histogram_tester.ExpectUniqueSample(
"ContextualCueing.NudgeDecision.GlicContextualCueing",
contextual_cueing::NudgeDecision::kServerDataMalformed, 1);
+
+ auto entries = ukm_recorder.GetEntriesByName(
+ ukm::builders::ContextualCueing_NudgeDecision::kEntryName);
+ EXPECT_EQ(1u, entries.size());
+ auto* entry = entries[0].get();
+ ukm_recorder.ExpectEntryMetric(
+ entry,
+ ukm::builders::ContextualCueing_NudgeDecision::kOptimizationTypeName,
+ static_cast<int64_t>(optimization_guide::proto::GLIC_CONTEXTUAL_CUEING));
+ ukm_recorder.ExpectEntryMetric(
+ entry, ukm::builders::ContextualCueing_NudgeDecision::kNudgeDecisionName,
+ static_cast<int64_t>(
+ contextual_cueing::NudgeDecision::kServerDataMalformed));
}
IN_PROC_BROWSER_TEST_F(ContextualCueingHelperBrowserTest,
TestServerDataNoCueLabel) {
base::HistogramTester histogram_tester;
+ ukm::TestAutoSetUkmRecorder ukm_recorder;
EnableSignIn();
optimization_guide::proto::GlicContextualCueingMetadata cueing_metadata;
@@ -211,6 +255,19 @@
histogram_tester.ExpectUniqueSample(
"ContextualCueing.NudgeDecision.GlicContextualCueing",
contextual_cueing::NudgeDecision::kClientConditionsUnmet, 1);
+
+ auto entries = ukm_recorder.GetEntriesByName(
+ ukm::builders::ContextualCueing_NudgeDecision::kEntryName);
+ EXPECT_EQ(1u, entries.size());
+ auto* entry = entries[0].get();
+ ukm_recorder.ExpectEntryMetric(
+ entry,
+ ukm::builders::ContextualCueing_NudgeDecision::kOptimizationTypeName,
+ static_cast<int64_t>(optimization_guide::proto::GLIC_CONTEXTUAL_CUEING));
+ ukm_recorder.ExpectEntryMetric(
+ entry, ukm::builders::ContextualCueing_NudgeDecision::kNudgeDecisionName,
+ static_cast<int64_t>(
+ contextual_cueing::NudgeDecision::kClientConditionsUnmet));
}
IN_PROC_BROWSER_TEST_F(ContextualCueingHelperBrowserTest,
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 7b9e9e1..d17ecb15 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -7101,6 +7101,25 @@
</metric>
</event>
+<event name="ContextualCueing.NudgeDecision">
+ <owner>sophiechang@chromium.org</owner>
+ <owner>rajendrant@chromium.org</owner>
+ <summary>
+ Recorded when a decision to nudge an optimization type was made for the page
+ load.
+ </summary>
+ <metric name="NudgeDecision" enum="ContextualCueingNudgeDecision">
+ <summary>
+ The nudge decision made for optimization type for the page load.
+ </summary>
+ </metric>
+ <metric name="OptimizationType" enum="OptimizationType">
+ <summary>
+ The optimization type a nudge decision was made for.
+ </summary>
+ </metric>
+</event>
+
<event name="Conversions.ClientBounce">
<owner>linnan@google.com</owner>
<owner>measurement-api-dev+metrics@google.com</owner>