Add "did not navigate" answer to daily query metrics (#35519)

This commit is contained in:
Darnell Andries
2026-04-17 12:34:13 -07:00
committed by GitHub
parent 8e700c22b8
commit c02522f222
4 changed files with 73 additions and 31 deletions
@@ -16,6 +16,7 @@
#include "build/build_config.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
@@ -23,8 +24,12 @@ namespace misc_metrics {
namespace {
constexpr int kDailyQueriesBuckets[] = {0, 3, 7};
// Buckets for DailyQueries. Answers 0 and 1 are reserved for the zero-query
// cases (no navigation and had navigation respectively), so two dummy leading
// values push real query counts to indices 2 and above.
constexpr int kDailyQueriesBuckets[] = {0, 0, 3, 7};
constexpr char kQueriesCountKey[] = "queries";
constexpr char kAnyNavigationKey[] = "any_navigation";
constexpr char kPrimaryQueriesCountKey[] = "primary";
constexpr char kOmniboxTypedCountKey[] = "omnibox_typed";
constexpr char kOmniboxSuggestionCountKey[] = "omnibox_suggestion";
@@ -71,6 +76,9 @@ void BraveSearchMetrics::RegisterPrefs(PrefRegistrySimple* registry) {
void BraveSearchMetrics::MaybeRecordBraveQuery(const GURL& previous_url,
const GURL& current_url) {
ScopedDictPrefUpdate(local_state_, kMiscMetricsBraveSearchQueryCounts)
->Set(kAnyNavigationKey, true);
if (!IsBraveSearchURL(current_url)) {
return;
}
@@ -148,6 +156,7 @@ void BraveSearchMetrics::ReportAllMetrics() {
const base::DictValue& counts =
local_state_->GetDict(kMiscMetricsBraveSearchQueryCounts);
int sum = counts.FindInt(kQueriesCountKey).value_or(0);
bool any_navigation = counts.FindBool(kAnyNavigationKey).value_or(false);
auto* histogram_name_ptr =
base::FindOrNull(kDailyQueriesHistogramMap, engine_type);
@@ -155,7 +164,13 @@ void BraveSearchMetrics::ReportAllMetrics() {
? *histogram_name_ptr
: kSearchDailyQueriesOtherDefaultHistogramName;
p3a_utils::RecordToHistogramBucket(histogram_name, kDailyQueriesBuckets, sum);
if (sum == 0) {
base::UmaHistogramExactLinear(histogram_name, any_navigation ? 1 : 0,
std::size(kDailyQueriesBuckets) + 1);
} else {
p3a_utils::RecordToHistogramBucket(histogram_name, kDailyQueriesBuckets,
sum);
}
int primary_queries = counts.FindInt(kPrimaryQueriesCountKey).value_or(0);
if (primary_queries > 0) {
@@ -22,15 +22,15 @@ class TemplateURLService;
namespace misc_metrics {
inline constexpr char kSearchDailyQueriesBraveDefaultHistogramName[] =
"Brave.Search.DailyQueries.BraveDefault";
"Brave.Search.DailyQueries.BraveDefault.2";
inline constexpr char kSearchDailyQueriesGoogleDefaultHistogramName[] =
"Brave.Search.DailyQueries.GoogleDefault";
"Brave.Search.DailyQueries.GoogleDefault.2";
inline constexpr char kSearchDailyQueriesDDGDefaultHistogramName[] =
"Brave.Search.DailyQueries.DDGDefault";
"Brave.Search.DailyQueries.DDGDefault.2";
inline constexpr char kSearchDailyQueriesYahooDefaultHistogramName[] =
"Brave.Search.DailyQueries.YahooDefault";
"Brave.Search.DailyQueries.YahooDefault.2";
inline constexpr char kSearchDailyQueriesOtherDefaultHistogramName[] =
"Brave.Search.DailyQueries.OtherDefault";
"Brave.Search.DailyQueries.OtherDefault.2";
inline constexpr char kSearchOmniboxTypedPercentHistogramName[] =
"Brave.Search.OmniboxTypedPercent";
inline constexpr char kSearchOmniboxSuggestionPercentHistogramName[] =
@@ -80,9 +80,11 @@ TEST_F(BraveSearchMetricsUnitTest, DailyQueriesBuckets) {
// Advance 24 hours then report.
FastForwardAndReport(base::Days(1));
// Should report bucket 1 (3 queries -> 1-3 range).
// Buckets 0 and 1 are reserved for zero-query cases (no navigation / had
// navigation). Real query counts start at index 2.
// Should report bucket 2 (3 queries -> 1-3 range).
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesBraveDefaultHistogramName, 1, 1);
kSearchDailyQueriesBraveDefaultHistogramName, 2, 1);
histogram_tester_.ExpectTotalCount(
kSearchDailyQueriesGoogleDefaultHistogramName, 0);
histogram_tester_.ExpectTotalCount(
@@ -95,9 +97,9 @@ TEST_F(BraveSearchMetricsUnitTest, DailyQueriesBuckets) {
FastForwardAndReport(base::Days(1));
// Should report bucket 2 (7 queries -> 4-7 range).
// Should report bucket 3 (7 queries -> 4-7 range).
histogram_tester_.ExpectBucketCount(
kSearchDailyQueriesBraveDefaultHistogramName, 2, 1);
kSearchDailyQueriesBraveDefaultHistogramName, 3, 1);
// Record 8 queries in the new window.
for (int i = 0; i < 8; i++) {
@@ -106,9 +108,9 @@ TEST_F(BraveSearchMetricsUnitTest, DailyQueriesBuckets) {
FastForwardAndReport(base::Days(1));
// Should report bucket 3 (8 queries -> 8+ range).
// Should report bucket 4 (8 queries -> 8+ range).
histogram_tester_.ExpectBucketCount(
kSearchDailyQueriesBraveDefaultHistogramName, 3, 1);
kSearchDailyQueriesBraveDefaultHistogramName, 4, 1);
histogram_tester_.ExpectTotalCount(
kSearchDailyQueriesBraveDefaultHistogramName, 3);
@@ -130,9 +132,9 @@ TEST_F(BraveSearchMetricsUnitTest, DailyQueriesEngineSwitch) {
// Advance past 24 hours then report.
FastForwardAndReport(base::Days(1));
// Should report under Google (3 queries -> bucket 1).
// Should report under Google (3 queries -> bucket 2, 1-3 range).
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesGoogleDefaultHistogramName, 1, 1);
kSearchDailyQueriesGoogleDefaultHistogramName, 2, 1);
histogram_tester_.ExpectTotalCount(
kSearchDailyQueriesBraveDefaultHistogramName, 0);
histogram_tester_.ExpectTotalCount(kSearchDailyQueriesDDGDefaultHistogramName,
@@ -153,13 +155,13 @@ TEST_F(BraveSearchMetricsUnitTest, DailyQueriesEngineSwitch) {
// Advance past 24 hours then report.
FastForwardAndReport(base::Days(1));
// Should report under OtherDefault (5 queries -> bucket 2).
// Should report under OtherDefault (5 queries -> bucket 3, 4-7 range).
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesOtherDefaultHistogramName, 2, 1);
kSearchDailyQueriesOtherDefaultHistogramName, 3, 1);
histogram_tester_.ExpectTotalCount(
kSearchDailyQueriesBraveDefaultHistogramName, 0);
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesGoogleDefaultHistogramName, 1, 1);
kSearchDailyQueriesGoogleDefaultHistogramName, 2, 1);
histogram_tester_.ExpectTotalCount(kSearchDailyQueriesDDGDefaultHistogramName,
0);
histogram_tester_.ExpectTotalCount(
@@ -176,13 +178,13 @@ TEST_F(BraveSearchMetricsUnitTest, DailyQueriesEngineSwitch) {
// Advance past 24 hours then report.
FastForwardAndReport(base::Days(1));
// Should report under BraveDefault (8 queries -> bucket 3).
// Should report under BraveDefault (8 queries -> bucket 4, 8+ range).
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesBraveDefaultHistogramName, 3, 1);
kSearchDailyQueriesBraveDefaultHistogramName, 4, 1);
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesOtherDefaultHistogramName, 2, 1);
kSearchDailyQueriesOtherDefaultHistogramName, 3, 1);
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesGoogleDefaultHistogramName, 1, 1);
kSearchDailyQueriesGoogleDefaultHistogramName, 2, 1);
histogram_tester_.ExpectTotalCount(kSearchDailyQueriesDDGDefaultHistogramName,
0);
histogram_tester_.ExpectTotalCount(
@@ -195,9 +197,9 @@ TEST_F(BraveSearchMetricsUnitTest, CountsClearedAfterReport) {
// Advance past 24 hours then report.
FastForwardAndReport(base::Days(1));
// Previous window reported 1 query -> bucket 1.
// Previous window reported 1 query -> bucket 2 (1-3 range).
histogram_tester_.ExpectBucketCount(
kSearchDailyQueriesBraveDefaultHistogramName, 1, 1);
kSearchDailyQueriesBraveDefaultHistogramName, 2, 1);
// Record 1 query in the new window.
brave_search_metrics_->MaybeRecordBraveQuery(empty_url_, brave_search_url_);
@@ -207,7 +209,7 @@ TEST_F(BraveSearchMetricsUnitTest, CountsClearedAfterReport) {
// Should report 1 query again for the new window.
histogram_tester_.ExpectBucketCount(
kSearchDailyQueriesBraveDefaultHistogramName, 1, 2);
kSearchDailyQueriesBraveDefaultHistogramName, 2, 2);
}
TEST_F(BraveSearchMetricsUnitTest, ClearQueryCounts) {
@@ -224,11 +226,36 @@ TEST_F(BraveSearchMetricsUnitTest, ClearQueryCounts) {
// Advance past 24 hours and report.
FastForwardAndReport(base::Days(1));
// Should report bucket 0 (0 queries) since counts were cleared.
// Counts cleared means sum=0 and any_navigation=false -> bucket 0.
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesBraveDefaultHistogramName, 0, 1);
}
TEST_F(BraveSearchMetricsUnitTest, DailyQueriesNoNavigationReportsZero) {
// No queries and no navigation in this window -> bucket 0.
FastForwardAndReport(base::Days(1));
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesBraveDefaultHistogramName, 0, 1);
// After reset, another empty window also reports bucket 0.
FastForwardAndReport(base::Days(1));
histogram_tester_.ExpectBucketCount(
kSearchDailyQueriesBraveDefaultHistogramName, 0, 2);
}
TEST_F(BraveSearchMetricsUnitTest,
DailyQueriesNavigationButNoSearchReportsOne) {
// Navigate to a non-search URL: sets any_navigation=true but sum stays 0.
const GURL non_search_url{"https://example.com"};
brave_search_metrics_->MaybeRecordBraveQuery(empty_url_, non_search_url);
FastForwardAndReport(base::Days(1));
// any_navigation=true, sum=0 -> bucket 1.
histogram_tester_.ExpectUniqueSample(
kSearchDailyQueriesBraveDefaultHistogramName, 1, 1);
}
TEST_F(BraveSearchMetricsUnitTest, NoReportBeforeFrameExpires) {
// Record queries within the 24-hour window.
for (int i = 0; i < 5; i++) {
+5 -5
View File
@@ -274,27 +274,27 @@ inline constexpr auto kCollectedExpressHistograms =
.ephemeral = true,
.attributes = MetricAttributes{MetricAttribute::kAnswerIndex, MetricAttribute::kVersion, MetricAttribute::kChannel, MetricAttribute::kPlatform, MetricAttribute::kCountryCode},
}},
{"Brave.Search.DailyQueries.BraveDefault", MetricConfig{
{"Brave.Search.DailyQueries.BraveDefault.2", MetricConfig{
.ephemeral = true,
.attributes = MetricAttributes{MetricAttribute::kIsBrowserDefault, MetricAttribute::kAnswerIndex, MetricAttribute::kCustomAttribute, MetricAttribute::kCountryCode, MetricAttribute::kPlatform, MetricAttribute::kYoi},
.custom_attributes = {"media_session_usage"},
}},
{"Brave.Search.DailyQueries.DDGDefault", MetricConfig{
{"Brave.Search.DailyQueries.DDGDefault.2", MetricConfig{
.ephemeral = true,
.attributes = MetricAttributes{MetricAttribute::kIsBrowserDefault, MetricAttribute::kAnswerIndex, MetricAttribute::kCustomAttribute, MetricAttribute::kCountryCode, MetricAttribute::kPlatform, MetricAttribute::kYoi},
.custom_attributes = {"media_session_usage"},
}},
{"Brave.Search.DailyQueries.GoogleDefault", MetricConfig{
{"Brave.Search.DailyQueries.GoogleDefault.2", MetricConfig{
.ephemeral = true,
.attributes = MetricAttributes{MetricAttribute::kIsBrowserDefault, MetricAttribute::kAnswerIndex, MetricAttribute::kCustomAttribute, MetricAttribute::kCountryCode, MetricAttribute::kPlatform, MetricAttribute::kYoi},
.custom_attributes = {"media_session_usage"},
}},
{"Brave.Search.DailyQueries.OtherDefault", MetricConfig{
{"Brave.Search.DailyQueries.OtherDefault.2", MetricConfig{
.ephemeral = true,
.attributes = MetricAttributes{MetricAttribute::kIsBrowserDefault, MetricAttribute::kAnswerIndex, MetricAttribute::kCustomAttribute, MetricAttribute::kCountryCode, MetricAttribute::kPlatform, MetricAttribute::kYoi},
.custom_attributes = {"media_session_usage"},
}},
{"Brave.Search.DailyQueries.YahooDefault", MetricConfig{
{"Brave.Search.DailyQueries.YahooDefault.2", MetricConfig{
.ephemeral = true,
.attributes = MetricAttributes{MetricAttribute::kIsBrowserDefault, MetricAttribute::kAnswerIndex, MetricAttribute::kCustomAttribute, MetricAttribute::kCountryCode, MetricAttribute::kPlatform, MetricAttribute::kYoi},
.custom_attributes = {"media_session_usage"},