Slice History.Embeddings.Embedder.CpuUsage2 on embedder running state

Low-Coverage-Reason: EXPERIMENTAL_CODE
Bug: 390245144
Change-Id: I7e985aea5219c8e0ca06d87b934f338fa8d71a14
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6192581
Reviewed-by: Orin Jaworski <orinj@chromium.org>
Commit-Queue: Orin Jaworski <orinj@chromium.org>
Reviewed-by: Sophie Chang <sophiechang@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1410465}
diff --git a/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc b/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc
index b1c95c4..26f07ede 100644
--- a/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc
+++ b/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc
@@ -86,7 +86,10 @@
     const content::ChildProcessData& data = iter.GetData();
     if (data.name == u"Passage Embeddings Service") {
       cpu_logger_.StartLogging(
-          content::BrowserChildProcessHost::FromID(data.id));
+          content::BrowserChildProcessHost::FromID(data.id),
+          base::BindRepeating(
+              &PassageEmbeddingsServiceController::EmbedderRunning,
+              base::Unretained(this)));
       return;
     }
     ++iter;
diff --git a/chrome/browser/passage_embeddings/cpu_histogram_logger.cc b/chrome/browser/passage_embeddings/cpu_histogram_logger.cc
index c30da0615..4d952b2 100644
--- a/chrome/browser/passage_embeddings/cpu_histogram_logger.cc
+++ b/chrome/browser/passage_embeddings/cpu_histogram_logger.cc
@@ -32,7 +32,8 @@
 class CpuHistogramLogger::CpuObserver
     : public resource_attribution::QueryResultObserver {
  public:
-  explicit CpuObserver(const resource_attribution::ProcessContext& context);
+  CpuObserver(const resource_attribution::ProcessContext& context,
+              base::RepeatingCallback<bool()> poll_embedder_running);
   ~CpuObserver() override;
 
   CpuObserver(const CpuObserver&) = delete;
@@ -50,16 +51,21 @@
   resource_attribution::CPUProportionTracker proportion_tracker_;
   bool proportion_tracker_started_ = false;
 
+  base::RepeatingCallback<bool()> poll_embedder_running_;
+  bool embedder_was_running_ = false;
+
   std::unique_ptr<CpuObserver> self_;
 };
 
 CpuHistogramLogger::CpuObserver::CpuObserver(
-    const resource_attribution::ProcessContext& context)
+    const resource_attribution::ProcessContext& context,
+    base::RepeatingCallback<bool()> poll_embedder_running)
     : scoped_query_(
           resource_attribution::QueryBuilder()
               .AddResourceType(resource_attribution::ResourceType::kCPUTime)
               .AddResourceContext(context)
-              .CreateScopedQuery()) {
+              .CreateScopedQuery()),
+      poll_embedder_running_(poll_embedder_running) {
   query_observation_.Observe(&scoped_query_);
   scoped_query_.Start(kSampleInterval);
   // Take an immediate baseline measurement for proportion tracker.
@@ -99,10 +105,28 @@
       return;
     }
     CHECK_EQ(cpu_proportion.size(), 1ul, base::NotFatalUntil::M134);
-    base::UmaHistogramCustomCounts(
-        "History.Embeddings.Embedder.CpuUsage2",
-        cpu_proportion.begin()->second * kCpuUsageFactor, kCpuUsageMin,
-        kCpuUsageMax, kBucketCount);
+    int sample = cpu_proportion.begin()->second * kCpuUsageFactor;
+    base::UmaHistogramCustomCounts("History.Embeddings.Embedder.CpuUsage2",
+                                   sample, kCpuUsageMin, kCpuUsageMax,
+                                   kBucketCount);
+
+    if (!to_delete) {
+      const bool embedder_is_running = poll_embedder_running_.Run();
+      if (!embedder_was_running_ && !embedder_is_running) {
+        base::UmaHistogramCustomCounts(
+            "History.Embeddings.Embedder.CpuUsage2.NotRunning", sample,
+            kCpuUsageMin, kCpuUsageMax, kBucketCount);
+      } else if (embedder_was_running_ && embedder_is_running) {
+        base::UmaHistogramCustomCounts(
+            "History.Embeddings.Embedder.CpuUsage2.Running", sample,
+            kCpuUsageMin, kCpuUsageMax, kBucketCount);
+      } else {
+        base::UmaHistogramCustomCounts(
+            "History.Embeddings.Embedder.CpuUsage2.RunningPartial", sample,
+            kCpuUsageMin, kCpuUsageMax, kBucketCount);
+      }
+      embedder_was_running_ = embedder_is_running;
+    }
   }
 }
 
@@ -114,13 +138,15 @@
 }
 
 void CpuHistogramLogger::StartLogging(
-    content::BrowserChildProcessHost* utility_process_host) {
+    content::BrowserChildProcessHost* utility_process_host,
+    base::RepeatingCallback<bool()> poll_embedder_running) {
   CHECK(!cpu_observer_);
   auto process_context =
       resource_attribution::ProcessContext::FromBrowserChildProcessHost(
           utility_process_host);
   if (process_context.has_value()) {
-    cpu_observer_ = std::make_unique<CpuObserver>(process_context.value());
+    cpu_observer_ = std::make_unique<CpuObserver>(process_context.value(),
+                                                  poll_embedder_running);
   }
 }
 
diff --git a/chrome/browser/passage_embeddings/cpu_histogram_logger.h b/chrome/browser/passage_embeddings/cpu_histogram_logger.h
index 58b55d5d..bc3a13c 100644
--- a/chrome/browser/passage_embeddings/cpu_histogram_logger.h
+++ b/chrome/browser/passage_embeddings/cpu_histogram_logger.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_PASSAGE_EMBEDDINGS_CPU_HISTOGRAM_LOGGER_H_
 #define CHROME_BROWSER_PASSAGE_EMBEDDINGS_CPU_HISTOGRAM_LOGGER_H_
 
+#include <base/functional/callback.h>
+
 #include <memory>
 
 namespace content {
@@ -26,7 +28,8 @@
 
   // Start logging the histogram usage of the child process hosted in
   // `utility_process_host`.
-  void StartLogging(content::BrowserChildProcessHost* utility_process_host);
+  void StartLogging(content::BrowserChildProcessHost* utility_process_host,
+                    base::RepeatingCallback<bool()> poll_embedder_running);
 
   // Stop logging histogram usage after the next update. Note that if the child
   // process exits, 0 CPU usage will be recorded for the rest of the interval.
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index e9368e4..06e5a59 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -1977,6 +1977,45 @@
   </summary>
 </histogram>
 
+<histogram name="History.Embeddings.Embedder.CpuUsage2.NotRunning"
+    units="1/100 %" expires_after="2025-07-31">
+  <owner>sophiechang@chromium.org</owner>
+  <owner>zekunjiang@google.com</owner>
+  <owner>orinj@chromium.org</owner>
+  <owner>src/components/history_embeddings/OWNERS</owner>
+  <summary>
+    History.Embeddings.Embedder.CpuUsage2, sliced by embedder running state.
+    This histogram is recorded only if the embedder is not running at both the
+    beginning and end of the sample period.
+  </summary>
+</histogram>
+
+<histogram name="History.Embeddings.Embedder.CpuUsage2.Running" units="1/100 %"
+    expires_after="2025-07-31">
+  <owner>sophiechang@chromium.org</owner>
+  <owner>zekunjiang@google.com</owner>
+  <owner>orinj@chromium.org</owner>
+  <owner>src/components/history_embeddings/OWNERS</owner>
+  <summary>
+    History.Embeddings.Embedder.CpuUsage2, sliced by embedder running state.
+    This histogram is recorded only if the embedder is running at both the
+    beginning and the end of the sample period.
+  </summary>
+</histogram>
+
+<histogram name="History.Embeddings.Embedder.CpuUsage2.RunningPartial"
+    units="1/100 %" expires_after="2025-07-31">
+  <owner>sophiechang@chromium.org</owner>
+  <owner>zekunjiang@google.com</owner>
+  <owner>orinj@chromium.org</owner>
+  <owner>src/components/history_embeddings/OWNERS</owner>
+  <summary>
+    History.Embeddings.Embedder.CpuUsage2, sliced by embedder running state.
+    This histogram is recorded only if the embedder is running at either the
+    beginning or the end of the sample period, but not both.
+  </summary>
+</histogram>
+
 <histogram name="History.Embeddings.Embedder.EmbeddingsGenerationSucceeded"
     enum="Boolean" expires_after="2025-07-31">
   <owner>sophiechang@chromium.org</owner>