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>