0

[omnibox] Adds a histogram to record different types of remote requests

Also cleans up enum names for provider-specific histograms around
remote requests.

OBSOLETE_HISTOGRAMS=Replaces Omnibox.SuggestRequests with Omnibox.SearchSuggest.Requests

Bug: 1516795
Change-Id: I560ac5de3dd608067a8af78dde712648a11c50c7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5254505
Commit-Queue: Moe Ahmadi <mahmadi@chromium.org>
Reviewed-by: Sophie Chang <sophiechang@chromium.org>
Reviewed-by: Tomasz Wiszkowski <ender@google.com>
Cr-Commit-Position: refs/heads/main@{#1255844}
This commit is contained in:
Mohamad Ahmadi
2024-02-03 00:24:41 +00:00
committed by Chromium LUCI CQ
parent 54d9d79f0b
commit 6417198592
13 changed files with 212 additions and 172 deletions

@ -43,7 +43,7 @@
#include "components/omnibox/browser/omnibox_field_trial.h"
#include "components/omnibox/browser/omnibox_prefs.h"
#include "components/omnibox/browser/remote_suggestions_service.h"
#include "components/omnibox/browser/search_provider.h"
#include "components/omnibox/browser/search_suggestion_parser.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
@ -87,10 +87,9 @@ enum class DocumentProviderAllowedReason : int {
kMaxValue = kInputLooksLikeUrl
};
void LogOmniboxDocumentRequest(RemoteRequestHistogramValue request_value) {
void LogOmniboxDocumentRequest(RemoteRequestEvent request_event) {
base::UmaHistogramEnumeration("Omnibox.DocumentSuggest.Requests",
request_value,
RemoteRequestHistogramValue::kMaxValue);
request_event);
}
void LogTotalTime(base::TimeTicks start_time, bool interrupted) {
@ -514,7 +513,7 @@ void DocumentProvider::Stop(bool clear_cached_results,
loader_.reset();
LogRequestTime(time_request_sent_, true);
time_request_sent_ = base::TimeTicks();
LogOmniboxDocumentRequest(RemoteRequestHistogramValue::kRequestInvalidated);
LogOmniboxDocumentRequest(RemoteRequestEvent::kRequestInvalidated);
}
// If `Run()` has been invoked, log its duration. It's possible `Stop()` is
@ -565,8 +564,7 @@ void DocumentProvider::OnURLLoadComplete(
DCHECK_EQ(loader_.get(), source);
LogRequestTime(time_request_sent_, false);
LogOmniboxDocumentRequest(
RemoteRequestHistogramValue::kRemoteResponseReceived);
LogOmniboxDocumentRequest(RemoteRequestEvent::kResponseReceived);
base::UmaHistogramSparse("Omnibox.DocumentSuggest.HttpResponseCode",
response_code);
@ -621,7 +619,7 @@ void DocumentProvider::OnDocumentSuggestionsLoaderAvailable(
std::unique_ptr<network::SimpleURLLoader> loader) {
time_request_sent_ = base::TimeTicks::Now();
loader_ = std::move(loader);
LogOmniboxDocumentRequest(RemoteRequestHistogramValue::kRequestSent);
LogOmniboxDocumentRequest(RemoteRequestEvent::kRequestSent);
}
// static

@ -21,7 +21,6 @@
#include "components/history/core/browser/history_types.h"
#include "components/omnibox/browser/autocomplete_provider.h"
#include "components/omnibox/browser/autocomplete_provider_debouncer.h"
#include "components/omnibox/browser/search_provider.h"
#include "third_party/metrics_proto/omnibox_event.pb.h"
class AutocompleteProviderListener;

@ -8,6 +8,7 @@
#include <utility>
#include "base/functional/bind.h"
#include "base/metrics/histogram_functions.h"
#include "components/omnibox/browser/base_search_provider.h"
#include "components/omnibox/browser/document_suggestions_service.h"
#include "components/search_engines/template_url_service.h"
@ -21,6 +22,10 @@
namespace {
void LogSuggestRequestSent(RemoteRequestType request_type) {
base::UmaHistogramEnumeration("Omnibox.SuggestRequestsSent", request_type);
}
void AddVariationHeaders(network::ResourceRequest* request) {
// Note: It's OK to pass InIncognito::kNo since we are expected to be in
// non-incognito state here (i.e. remote suggestions are not served in
@ -59,6 +64,7 @@ GURL RemoteSuggestionsService::EndpointUrl(
std::unique_ptr<network::SimpleURLLoader>
RemoteSuggestionsService::StartSuggestionsRequest(
RemoteRequestType request_type,
const TemplateURL* template_url,
TemplateURLRef::SearchTermsArgs search_terms_args,
const SearchTermsData& search_terms_data,
@ -129,12 +135,13 @@ RemoteSuggestionsService::StartSuggestionsRequest(
observer.OnSuggestRequestStarted(request_id, loader.get(),
/*request_body*/ "");
}
LogSuggestRequestSent(request_type);
return loader;
}
std::unique_ptr<network::SimpleURLLoader>
RemoteSuggestionsService::StartZeroPrefixSuggestionsRequest(
RemoteRequestType request_type,
const TemplateURL* template_url,
TemplateURLRef::SearchTermsArgs search_terms_args,
const SearchTermsData& search_terms_data,
@ -210,7 +217,7 @@ RemoteSuggestionsService::StartZeroPrefixSuggestionsRequest(
observer.OnSuggestRequestStarted(request_id, loader.get(),
/*request_body*/ "");
}
LogSuggestRequestSent(request_type);
return loader;
}
@ -311,7 +318,7 @@ RemoteSuggestionsService::StartDeletionRequest(
observer.OnSuggestRequestStarted(request_id, loader.get(),
/*request_body*/ "");
}
LogSuggestRequestSent(RemoteRequestType::kDeletion);
return loader;
}
@ -346,7 +353,7 @@ void RemoteSuggestionsService::OnDocumentSuggestionsLoaderAvailable(
for (Observer& observer : observers_) {
observer.OnSuggestRequestStarted(request_id, loader.get(), request_body);
}
LogSuggestRequestSent(RemoteRequestType::kDocumentSuggest);
std::move(start_callback).Run(std::move(loader));
}

@ -28,8 +28,54 @@ class SimpleURLLoader;
struct ResourceRequest;
} // namespace network
// The types of requests for remote suggestions.
// These values are written to logs. New enum values can be added, but existing
// enums must never be renumbered or deleted and reused.
enum class RemoteRequestType {
// Search suggestion requests.
kSearch = 0,
// Search suggestion warm-up requests.
kSearchWarmup = 1,
// Search suggestion requests to obtain images.
kImages = 2,
// Zero-prefix suggestion requests.
kZeroSuggest = 3,
// Zero-prefix suggestion prefetching requests.
kZeroSuggestPrefetch = 4,
// Document suggestion requests.
kDocumentSuggest = 5,
// Suggestion deletion requests.
kDeletion = 6,
kMaxValue = kDeletion,
};
// The event types recorded by the providers for remote suggestions. Each event
// must be logged at most once from when the provider is started until it is
// stopped.
// These values are written to logs. New enum values can be added, but existing
// enums must never be renumbered or deleted and reused.
enum class RemoteRequestEvent {
// Cached response was synchronously converted to displayed matches.
// Recorded for non-prefetch requests only.
kCachedResponseConvertedToMatches = 0,
// Request was sent.
kRequestSent = 1,
// Request was invalidated.
kRequestInvalidated = 2,
// Response was received asynchronously.
kResponseReceived = 3,
// Response was cached.
kResponseCached = 4,
// Response ended up being converted to displayed matches. This may happen due
// to an empty displayed result set or an empty remote result set.
// Recorded for non-prefetch requests only.
kResponseConvertedToMatches = 5,
kMaxValue = kResponseConvertedToMatches,
};
// A service to fetch suggestions from a search provider's suggest endpoint.
// Used by the ZeroSuggestProvider, the SearchProvider, and the ImageService.
// Used by ZeroSuggestProvider, SearchProvider, DocumentProvider, and
// ImageService.
//
// This service is always sent the user's authentication state, so the
// suggestions always can be personalized. This service is also sometimes sent
@ -93,6 +139,7 @@ class RemoteSuggestionsService : public KeyedService {
// `search_terms_data` is used to build the endpoint URL.
// `completion_callback` will be invoked when the transfer is done.
std::unique_ptr<network::SimpleURLLoader> StartSuggestionsRequest(
RemoteRequestType request_type,
const TemplateURL* template_url,
TemplateURLRef::SearchTermsArgs search_terms_args,
const SearchTermsData& search_terms_data,
@ -107,6 +154,7 @@ class RemoteSuggestionsService : public KeyedService {
// `search_terms_data` is used to build the endpoint URL.
// `completion_callback` will be invoked when the transfer is done.
std::unique_ptr<network::SimpleURLLoader> StartZeroPrefixSuggestionsRequest(
RemoteRequestType request_type,
const TemplateURL* template_url,
TemplateURLRef::SearchTermsArgs search_terms_args,
const SearchTermsData& search_terms_data,

@ -10,6 +10,7 @@
#include "base/functional/bind.h"
#include "base/memory/scoped_refptr.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "components/search_engines/template_url_service.h"
#include "components/variations/scoped_variations_ids_provider.h"
@ -102,7 +103,8 @@ TEST_F(RemoteSuggestionsServiceTest, EnsureAttachCookies_ZeroPrefixSuggest) {
/*prefs=*/nullptr, /*search_engine_choice_service=*/nullptr);
TemplateURLRef::SearchTermsArgs search_terms_args;
search_terms_args.current_page_url = "https://www.google.com/";
service.StartZeroPrefixSuggestionsRequest(
auto loader = service.StartZeroPrefixSuggestionsRequest(
RemoteRequestType::kZeroSuggest,
template_url_service.GetDefaultSearchProvider(), search_terms_args,
template_url_service.search_terms_data(),
base::BindOnce(&RemoteSuggestionsServiceTest::OnRequestComplete,
@ -132,7 +134,8 @@ TEST_F(RemoteSuggestionsServiceTest, EnsureAttachCookies_Suggest) {
/*prefs=*/nullptr, /*search_engine_choice_service=*/nullptr);
TemplateURLRef::SearchTermsArgs search_terms_args;
search_terms_args.current_page_url = "https://www.google.com/";
service.StartSuggestionsRequest(
auto loader = service.StartSuggestionsRequest(
RemoteRequestType::kSearch,
template_url_service.GetDefaultSearchProvider(), search_terms_args,
template_url_service.search_terms_data(),
base::BindOnce(&RemoteSuggestionsServiceTest::OnRequestComplete,
@ -157,7 +160,7 @@ TEST_F(RemoteSuggestionsServiceTest, EnsureAttachCookies_DeleteSuggest) {
RemoteSuggestionsService service(/*document_suggestions_service_=*/nullptr,
GetUrlLoaderFactory());
service.StartDeletionRequest(
auto loader = service.StartDeletionRequest(
"https://google.com/complete/delete",
base::BindOnce(&RemoteSuggestionsServiceTest::OnRequestComplete,
base::Unretained(this)));
@ -183,7 +186,8 @@ TEST_F(RemoteSuggestionsServiceTest, EnsureBypassCache) {
TemplateURLRef::SearchTermsArgs search_terms_args;
search_terms_args.current_page_url = "https://www.google.com/";
search_terms_args.bypass_cache = true;
service.StartZeroPrefixSuggestionsRequest(
auto loader = service.StartZeroPrefixSuggestionsRequest(
RemoteRequestType::kZeroSuggest,
template_url_service.GetDefaultSearchProvider(), search_terms_args,
template_url_service.search_terms_data(),
base::BindOnce(&RemoteSuggestionsServiceTest::OnRequestComplete,
@ -202,6 +206,8 @@ TEST_F(RemoteSuggestionsServiceTest, EnsureBypassCache) {
}
TEST_F(RemoteSuggestionsServiceTest, EnsureObservers) {
base::HistogramTester histogram_tester;
TemplateURLService template_url_service(
/*prefs=*/nullptr, /*search_engine_choice_service=*/nullptr);
TemplateURLData template_url_data;
@ -212,10 +218,9 @@ TEST_F(RemoteSuggestionsServiceTest, EnsureObservers) {
RemoteSuggestionsService service(/*document_suggestions_service_=*/nullptr,
GetUrlLoaderFactory());
TestObserver observer(&service);
auto loader = service.StartZeroPrefixSuggestionsRequest(
RemoteRequestType::kZeroSuggest,
template_url_service.GetDefaultSearchProvider(),
TemplateURLRef::SearchTermsArgs(),
template_url_service.search_terms_data(),
@ -236,6 +241,10 @@ TEST_F(RemoteSuggestionsServiceTest, EnsureObservers) {
base::RunLoop().RunUntilIdle();
// Verify histogram was recorded.
histogram_tester.ExpectTotalCount("Omnibox.SuggestRequestsSent", 1);
histogram_tester.ExpectBucketCount("Omnibox.SuggestRequestsSent", 3, 1);
// Verify the observer got notified of request completion.
ASSERT_EQ(observer.url().spec(), kRequestUrl);
ASSERT_TRUE(observer.response_received());

@ -69,10 +69,10 @@ using metrics::OmniboxEventProto;
namespace {
// Increments the appropriate value in the histogram by one.
void LogOmniboxSuggestRequest(RemoteRequestHistogramValue request_value) {
base::UmaHistogramEnumeration("Omnibox.SuggestRequests", request_value,
RemoteRequestHistogramValue::kMaxValue);
// Increments the appropriate event in the histogram by one.
void LogOmniboxSuggestRequest(RemoteRequestEvent request_event) {
base::UmaHistogramEnumeration("Omnibox.SearchSuggest.Requests",
request_event);
}
bool HasMultipleWords(const std::u16string& text) {
@ -514,8 +514,7 @@ void SearchProvider::SortResults(bool is_keyword,
}
void SearchProvider::LogLoadComplete(bool success, bool is_keyword) {
LogOmniboxSuggestRequest(
RemoteRequestHistogramValue::kRemoteResponseReceived);
LogOmniboxSuggestRequest(RemoteRequestEvent::kResponseReceived);
// Record response time for suggest requests sent to Google. We care
// only about the common case: the Google default provider used in
// non-keyword mode.
@ -762,7 +761,7 @@ void SearchProvider::StartOrStopSuggestQuery(bool minimal_changes) {
void SearchProvider::CancelLoader(
std::unique_ptr<network::SimpleURLLoader>* loader) {
if (*loader) {
LogOmniboxSuggestRequest(RemoteRequestHistogramValue::kRequestInvalidated);
LogOmniboxSuggestRequest(RemoteRequestEvent::kRequestInvalidated);
loader->reset();
}
}
@ -924,7 +923,7 @@ std::unique_ptr<network::SimpleURLLoader> SearchProvider::CreateSuggestLoader(
search_term_args.current_page_url = input.current_url().spec();
}
LogOmniboxSuggestRequest(RemoteRequestHistogramValue::kRequestSent);
LogOmniboxSuggestRequest(RemoteRequestEvent::kRequestSent);
// If the request is from omnibox focus, send empty search term args. The
// purpose of such a request is to signal the server to warm up; no info
@ -932,6 +931,8 @@ std::unique_ptr<network::SimpleURLLoader> SearchProvider::CreateSuggestLoader(
return client()
->GetRemoteSuggestionsService(/*create_if_necessary=*/true)
->StartSuggestionsRequest(
input.IsZeroSuggest() ? RemoteRequestType::kSearchWarmup
: RemoteRequestType::kSearch,
template_url,
input.IsZeroSuggest() ? TemplateURLRef::SearchTermsArgs()
: search_term_args,

@ -41,31 +41,6 @@ namespace network {
class SimpleURLLoader;
}
// The provider event types recorded as a result of prefetch and non-prefetch
// requests for zero-prefix suggestions. Each event must be logged at most once
// from when the provider is started until it is stopped.
// These values are written to logs. New enum values can be added, but existing
// enums must never be renumbered or deleted and reused.
enum class RemoteRequestHistogramValue {
// Cached response was synchronously converted to displayed matches.
// Recorded for non-prefetch requests only.
kCachedResponseConvertedToMatches = 0,
// Remote request was sent.
kRequestSent = 1,
// Remote request was invalidated.
kRequestInvalidated = 2,
// Remote response was received asynchronously.
kRemoteResponseReceived = 3,
// Remote response was cached.
kRemoteResponseCached = 4,
// Remote response ended up being converted to displayed matches. This may
// happen due to an empty displayed result set or an empty remote result set.
// Recorded for non-prefetch requests only.
kRemoteResponseConvertedToMatches = 5,
kMaxValue = kRemoteResponseConvertedToMatches,
};
// Autocomplete provider for searches and suggestions from a search engine.
//
// After construction, the autocomplete controller repeatedly calls Start()

@ -30,7 +30,6 @@
#include "components/omnibox/browser/omnibox_triggered_feature_service.h"
#include "components/omnibox/browser/page_classification_functions.h"
#include "components/omnibox/browser/remote_suggestions_service.h"
#include "components/omnibox/browser/search_provider.h"
#include "components/omnibox/browser/search_suggestion_parser.h"
#include "components/omnibox/browser/zero_suggest_cache_service.h"
#include "components/omnibox/common/omnibox_features.h"
@ -77,10 +76,9 @@ enum class Eligibility {
kMaxValue = kGenerallyIneligible,
};
void LogOmniboxZeroSuggestRequest(
const RemoteRequestHistogramValue request_value,
const ResultType result_type,
const bool is_prefetch) {
void LogOmniboxZeroSuggestRequest(const RemoteRequestEvent request_event,
const ResultType result_type,
const bool is_prefetch) {
DCHECK_NE(ResultType::kNone, result_type);
const std::string result_type_string =
@ -89,7 +87,7 @@ void LogOmniboxZeroSuggestRequest(
is_prefetch ? ".Prefetch" : ".NonPrefetch";
base::UmaHistogramEnumeration(
"Omnibox.ZeroSuggestProvider" + result_type_string + request_type_string,
request_value);
request_event);
}
// Relevance value to use if it was not set explicitly by the server.
@ -211,9 +209,8 @@ bool StoreRemoteResponse(const std::string& response_json,
: std::string();
client->GetZeroSuggestCacheService()->StoreZeroSuggestResponse(page_url,
response_json);
LogOmniboxZeroSuggestRequest(
RemoteRequestHistogramValue::kRemoteResponseCached, result_type,
is_prefetch);
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kResponseCached, result_type,
is_prefetch);
return true;
}
@ -404,9 +401,9 @@ void ZeroSuggestProvider::StartPrefetch(const AutocompleteInput& input) {
}
if (*prefetch_loader) {
LogOmniboxZeroSuggestRequest(
RemoteRequestHistogramValue::kRequestInvalidated, result_type,
/*is_prefetch=*/true);
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kRequestInvalidated,
result_type,
/*is_prefetch=*/true);
}
// Create a loader for the appropriate page context and take ownership of it.
@ -414,14 +411,13 @@ void ZeroSuggestProvider::StartPrefetch(const AutocompleteInput& input) {
client()
->GetRemoteSuggestionsService(/*create_if_necessary=*/true)
->StartZeroPrefixSuggestionsRequest(
template_url, search_terms_args,
template_url_service->search_terms_data(),
RemoteRequestType::kZeroSuggestPrefetch, template_url,
search_terms_args, template_url_service->search_terms_data(),
base::BindOnce(&ZeroSuggestProvider::OnPrefetchURLLoadComplete,
weak_ptr_factory_.GetWeakPtr(), input,
result_type));
LogOmniboxZeroSuggestRequest(RemoteRequestHistogramValue::kRequestSent,
result_type,
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kRequestSent, result_type,
/*is_prefetch=*/true);
}
@ -444,7 +440,7 @@ void ZeroSuggestProvider::Start(const AutocompleteInput& input,
if (ReadStoredResponse(client(), input, result_type_running_, &results)) {
ConvertSuggestResultsToAutocompleteMatches(results, input);
LogOmniboxZeroSuggestRequest(
RemoteRequestHistogramValue::kCachedResponseConvertedToMatches,
RemoteRequestEvent::kCachedResponseConvertedToMatches,
result_type_running_,
/*is_prefetch=*/false);
}
@ -471,16 +467,17 @@ void ZeroSuggestProvider::Start(const AutocompleteInput& input,
: std::string();
// Create a loader for the request and take ownership of it.
loader_ = client()
->GetRemoteSuggestionsService(/*create_if_necessary=*/true)
->StartZeroPrefixSuggestionsRequest(
template_url, search_terms_args,
template_url_service->search_terms_data(),
base::BindOnce(&ZeroSuggestProvider::OnURLLoadComplete,
weak_ptr_factory_.GetWeakPtr(), input,
result_type_running_));
loader_ =
client()
->GetRemoteSuggestionsService(/*create_if_necessary=*/true)
->StartZeroPrefixSuggestionsRequest(
RemoteRequestType::kZeroSuggest, template_url, search_terms_args,
template_url_service->search_terms_data(),
base::BindOnce(&ZeroSuggestProvider::OnURLLoadComplete,
weak_ptr_factory_.GetWeakPtr(), input,
result_type_running_));
LogOmniboxZeroSuggestRequest(RemoteRequestHistogramValue::kRequestSent,
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kRequestSent,
result_type_running_,
/*is_prefetch=*/false);
}
@ -490,9 +487,9 @@ void ZeroSuggestProvider::Stop(bool clear_cached_results,
AutocompleteProvider::Stop(clear_cached_results, due_to_user_inactivity);
if (loader_) {
LogOmniboxZeroSuggestRequest(
RemoteRequestHistogramValue::kRequestInvalidated, result_type_running_,
/*is_prefetch=*/false);
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kRequestInvalidated,
result_type_running_,
/*is_prefetch=*/false);
loader_.reset();
}
result_type_running_ = ResultType::kNone;
@ -558,9 +555,9 @@ void ZeroSuggestProvider::OnURLLoadComplete(
return;
}
LogOmniboxZeroSuggestRequest(
RemoteRequestHistogramValue::kRemoteResponseReceived, result_type,
/*is_prefetch=*/false);
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kResponseReceived,
result_type,
/*is_prefetch=*/false);
SearchSuggestionParser::Results results;
const bool response_parsed = StoreRemoteResponse(
@ -588,10 +585,9 @@ void ZeroSuggestProvider::OnURLLoadComplete(
// Convert the response to |matches_| and notify the listeners.
ConvertSuggestResultsToAutocompleteMatches(results, input);
LogOmniboxZeroSuggestRequest(
RemoteRequestHistogramValue::kRemoteResponseConvertedToMatches,
result_type,
/*is_prefetch=*/false);
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kResponseConvertedToMatches,
result_type,
/*is_prefetch=*/false);
NotifyListeners(/*updated_matches=*/true);
}
@ -615,9 +611,9 @@ void ZeroSuggestProvider::OnPrefetchURLLoadComplete(
DCHECK_EQ(prefetch_loader->get(), source);
if (response_code == 200) {
LogOmniboxZeroSuggestRequest(
RemoteRequestHistogramValue::kRemoteResponseReceived, result_type,
/*is_prefetch=*/true);
LogOmniboxZeroSuggestRequest(RemoteRequestEvent::kResponseReceived,
result_type,
/*is_prefetch=*/true);
SearchSuggestionParser::Results unused_results;
StoreRemoteResponse(SearchSuggestionParser::ExtractJsonData(

@ -14,7 +14,6 @@
#include "base/gtest_prod_util.h"
#include "components/omnibox/browser/base_search_provider.h"
#include "components/omnibox/browser/search_provider.h"
class AutocompleteProviderListener;
class PrefRegistrySimple;

@ -1249,7 +1249,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestCachingFirstRunNTP) {
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1315,7 +1315,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestCachingFirstRunSRP) {
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1382,7 +1382,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestCachingFirstRunWeb) {
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1579,7 +1579,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestHasCachedResultsNTP) {
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1657,7 +1657,7 @@ TEST_F(ZeroSuggestProviderTest, TestZeroSuggestHasInMemoryCachedResultsNTP) {
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1741,7 +1741,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestHasCachedResultsSRP) {
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1827,7 +1827,7 @@ TEST_F(ZeroSuggestProviderTest, TestZeroSuggestHasInMemoryCachedResultsSRP) {
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1912,7 +1912,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestHasCachedResultsWeb) {
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -1998,7 +1998,7 @@ TEST_F(ZeroSuggestProviderTest, TestZeroSuggestHasInMemoryCachedResultsWeb) {
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2073,7 +2073,7 @@ TEST_F(ZeroSuggestProviderTest,
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2154,7 +2154,7 @@ TEST_F(ZeroSuggestProviderTest,
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2236,7 +2236,7 @@ TEST_F(ZeroSuggestProviderTest,
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2310,7 +2310,7 @@ TEST_F(ZeroSuggestProviderTest, TestZeroSuggestReceivedInvalidResults) {
invalid_responses.size());
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseReceived*/ 3, invalid_responses.size());
/*kResponseReceived*/ 3, invalid_responses.size());
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseCached*/ 4, 0);
@ -2369,7 +2369,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestPrefetchThenNTPOnFocus) {
"Omnibox.ZeroSuggestProvider.NoURL.Prefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.Prefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.Prefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2430,7 +2430,7 @@ TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestPrefetchThenNTPOnFocus) {
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2519,7 +2519,7 @@ TEST_F(ZeroSuggestProviderTest, TestMultipleZeroSuggestPrefetchesInFlight) {
/*kRequestInvalidated*/ 2, 0);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.Prefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.Prefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2531,7 +2531,7 @@ TEST_F(ZeroSuggestProviderTest, TestMultipleZeroSuggestPrefetchesInFlight) {
0);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.Prefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.Prefetch",
/*kRemoteResponseCached*/ 4, 1);
@ -2613,7 +2613,7 @@ TEST_F(ZeroSuggestProviderTest,
"Omnibox.ZeroSuggestProvider.URLBased.Prefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.Prefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
// Expect the provider to not have notified the provider listener since the
// matches were not updated.
@ -2669,7 +2669,7 @@ TEST_F(ZeroSuggestProviderTest,
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseConvertedToMatches*/ 5, 1);
@ -2749,7 +2749,7 @@ TEST_F(ZeroSuggestProviderTest,
"Omnibox.ZeroSuggestProvider.URLBased.Prefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.Prefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
// Expect the provider to not have notified the provider listener since the
// matches were not updated.
@ -2804,7 +2804,7 @@ TEST_F(ZeroSuggestProviderTest,
1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.URLBased.NonPrefetch",
/*kRemoteResponseConvertedToMatches*/ 5, 1);
@ -2889,7 +2889,7 @@ TEST_F(ZeroSuggestProviderTest, TestNoURLResultTypeWithNonEmptyURLInput) {
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch", /*kRequestSent*/ 1, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseReceived*/ 3, 1);
/*kResponseReceived*/ 3, 1);
histogram_tester.ExpectBucketCount(
"Omnibox.ZeroSuggestProvider.NoURL.NonPrefetch",
/*kRemoteResponseCached*/ 4, 1);

@ -76,7 +76,8 @@ class ImageService::SuggestEntityImageURLFetcher {
search_terms_args.search_terms = search_query_;
loader_ = remote_suggestions_service->StartSuggestionsRequest(
template_url, search_terms_args, search_terms_data,
RemoteRequestType::kImages, template_url, search_terms_args,
search_terms_data,
base::BindOnce(&SuggestEntityImageURLFetcher::OnURLLoadComplete,
weak_factory_.GetWeakPtr()));
}

@ -75,6 +75,17 @@ chromium-metrics-reviews@google.com.
<int value="12" label="Not allowed because the input looks like a URL"/>
</enum>
<enum name="DocumentSuggestRequestEvent">
<int value="1" label="requests sent">Request was sent.</int>
<int value="2" label="requests invalidated">
Request was invalidated (cancelled because URLLoader was deleted before the
callback was invoked).
</int>
<int value="3" label="responses received">
Response was received asynchronously.
</int>
</enum>
<enum name="GroupId">
<summary>
Suggestion group IDs toggled visible or hidden in the omnibox result list.
@ -107,12 +118,6 @@ chromium-metrics-reviews@google.com.
<int value="4" label="@tabs starter pack engine"/>
</enum>
<enum name="OmniboxDocumentSuggestRequests">
<int value="1" label="requests sent"/>
<int value="2" label="requests invalidated"/>
<int value="3" label="(non-invalidated) replies received"/>
</enum>
<enum name="OmniboxEnteredKeywordMode2">
<int value="0" label="invalid"/>
<int value="1" label="via tab"/>
@ -159,37 +164,6 @@ chromium-metrics-reviews@google.com.
<int value="4" label="Shortcut text prefix"/>
</enum>
<enum name="OmniboxSuggestRequests">
<int value="1" label="requests sent"/>
<int value="2" label="requests invalidated"/>
<int value="3" label="(non-invalidated) replies received"/>
</enum>
<enum name="OmniboxZeroSuggestRequests">
<obsolete>
Obsolete as of M105.
</obsolete>
<int value="1" label="requests sent">Suggest requests that were sent.</int>
<int value="2" label="requests invalidated">
Suggest requests that were invalidated, e.g., due to user starting to type.
</int>
<int value="3" label="responses received">
Suggest responses that were received. Includes both those received directly
from the server and those loaded from the HTTP cache.
</int>
<int value="4" label="responses loaded from HTTP cache">
Subset of Suggest responses that were loaded from the HTTP cache.
</int>
<int value="5"
label="out-of-date responses loaded from HTTP cache (deprecated)">
Subset of Suggest responses that were loaded from the HTTP cache and were
out-of-date.
</int>
<int value="6" label="responses updated displayed results">
Subset of Suggest responses that ended up updating the displayed results.
</int>
</enum>
<enum name="SearchPrefetchEligibilityReason">
<int value="0" label="Prefetch started"/>
<int value="1" label="User disabled prefetch/preconnect"/>
@ -250,6 +224,17 @@ chromium-metrics-reviews@google.com.
<int value="3" label="kCompleted"/>
</enum>
<enum name="SearchSuggestRequestEvent">
<int value="1" label="requests sent">Request was sent.</int>
<int value="2" label="requests invalidated">
Request was invalidated (cancelled because URLLoader was deleted before the
callback was invoked).
</int>
<int value="3" label="responses received">
Response was received asynchronously.
</int>
</enum>
<enum name="SuggestionAnswerOptionalType">
<summary>
Type of Answer in omnibox suggestion list or No Answer, if not an answer.
@ -343,6 +328,16 @@ chromium-metrics-reviews@google.com.
<int value="40" label="Set Chrome as default browser"/>
</enum>
<enum name="SuggestRequestType">
<int value="0" label="search suggestion"/>
<int value="1" label="search suggestion warm-up"/>
<int value="2" label="search suggestion for images"/>
<int value="3" label="zero-prefix suggestion"/>
<int value="4" label="zero-prefix suggestion prefetching"/>
<int value="5" label="document suggestion"/>
<int value="6" label="suggestion deletion"/>
</enum>
<enum name="ZeroSuggestEligibility">
<int value="0" label="Eligible for current context and external conditions">
Zero-prefix suggestions are eligible.
@ -381,22 +376,23 @@ chromium-metrics-reviews@google.com.
</int>
</enum>
<enum name="ZeroSuggestProviderEvent">
<enum name="ZeroSuggestRequestEvent">
<int value="0" label="cached response converted to results">
Cached response was synchronously converted to displayed matches.
</int>
<int value="1" label="request sent">Remote request was sent.</int>
<int value="1" label="request sent">Request was sent.</int>
<int value="2" label="request invalidated">
Remote request was invalidated (due to user starting to type or another
zero-suggest request).
Request was invalidated (cancelled because URLLoader was deleted before the
callback was invoked).
</int>
<int value="3" label="response received">
Remote response was received asynchronously.
Response was received asynchronously.
</int>
<int value="4" label="response cached">Remote response was cached.</int>
<int value="4" label="response cached">Response was cached.</int>
<int value="5" label="response converted to results">
Remote response ended up being converted to displayed matches. This may
happen due to an empty displayed result set or an empty remote result set.
Response was converted to displayed matches. This can happen if the
displayed result set is empty and the response result set is non-empty; or
vice versa.
</int>
</enum>

@ -638,12 +638,12 @@ chromium-metrics-reviews@google.com.
</histogram>
<histogram name="Omnibox.DocumentSuggest.Requests"
enum="OmniboxDocumentSuggestRequests" expires_after="2024-06-30">
enum="DocumentSuggestRequestEvent" expires_after="2024-06-30">
<owner>manukh@chromium.org</owner>
<owner>jdonnelly@chromium.org</owner>
<summary>
Counts the number of document suggest requests the omnibox sent, were
invalidated, and were completed successfully.
Counts the number of requests DocumentProvider sent, were invalidated, and
were completed successfully.
</summary>
</histogram>
@ -1602,6 +1602,17 @@ chromium-metrics-reviews@google.com.
</summary>
</histogram>
<histogram name="Omnibox.SearchSuggest.Requests"
enum="SearchSuggestRequestEvent" expires_after="2024-06-30">
<owner>mpearson@chromium.org</owner>
<owner>jdonnelly@chromium.org</owner>
<owner>cch@chromium.org</owner>
<summary>
Counts the number of requests SearchProvider sent, were invalidated, and
were completed successfully.
</summary>
</histogram>
<histogram name="Omnibox.SetText.Duration" units="ms"
expires_after="2024-06-01">
<owner>peilinwang@google.com</owner>
@ -2173,14 +2184,14 @@ chromium-metrics-reviews@google.com.
</summary>
</histogram>
<histogram name="Omnibox.SuggestRequests" enum="OmniboxSuggestRequests"
expires_after="2024-06-30">
<owner>mpearson@chromium.org</owner>
<owner>jdonnelly@chromium.org</owner>
<owner>cch@chromium.org</owner>
<histogram name="Omnibox.SuggestRequestsSent" enum="SuggestRequestType"
expires_after="2025-01-31">
<owner>mahmadi@chromium.org</owner>
<owner>chrome-omnibox-team@google.com</owner>
<summary>
Counts about the number of suggest requests the omnibox sent, invalidated,
and replies received.
Counts the number and type of requests sent by the omnibox to the Suggest
backends. These requests are emitted as the user types or in zero-suggest
context (user has focused or cleared the omnibox but has not typed in yet).
</summary>
</histogram>
@ -2473,7 +2484,7 @@ chromium-metrics-reviews@google.com.
</histogram>
<histogram name="Omnibox.ZeroSuggestProvider.{ResultType}.{RequestType}"
enum="ZeroSuggestProviderEvent" expires_after="2024-06-30">
enum="ZeroSuggestRequestEvent" expires_after="2024-06-30">
<owner>mahmadi@chromium.org</owner>
<owner>chrome-omnibox-team@google.com</owner>
<summary>