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>