| Index: components/ukm/ukm_service.cc
|
| diff --git a/components/ukm/ukm_service.cc b/components/ukm/ukm_service.cc
|
| index 1981f8a4fb019463622dd306f406e104dfd2f7ff..312ba041dd18ea114b72374cde4e0d4ff8781afe 100644
|
| --- a/components/ukm/ukm_service.cc
|
| +++ b/components/ukm/ukm_service.cc
|
| @@ -8,33 +8,23 @@
|
| #include <string>
|
| #include <utility>
|
|
|
| -#include "base/atomic_sequence_num.h"
|
| #include "base/bind.h"
|
| #include "base/feature_list.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/metrics/field_trial.h"
|
| #include "base/metrics/field_trial_params.h"
|
| #include "base/metrics/histogram_macros.h"
|
| -#include "base/metrics/metrics_hashes.h"
|
| #include "base/rand_util.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_split.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| #include "base/time/time.h"
|
| #include "components/metrics/metrics_log.h"
|
| -#include "components/metrics/metrics_log_uploader.h"
|
| #include "components/metrics/metrics_service_client.h"
|
| -#include "components/metrics/proto/ukm/entry.pb.h"
|
| #include "components/metrics/proto/ukm/report.pb.h"
|
| -#include "components/metrics/proto/ukm/source.pb.h"
|
| #include "components/prefs/pref_registry_simple.h"
|
| #include "components/prefs/pref_service.h"
|
| #include "components/ukm/persisted_logs_metrics_impl.h"
|
| -#include "components/ukm/ukm_entry.h"
|
| -#include "components/ukm/ukm_entry_builder.h"
|
| #include "components/ukm/ukm_pref_names.h"
|
| #include "components/ukm/ukm_rotation_scheduler.h"
|
| -#include "components/ukm/ukm_source.h"
|
|
|
| namespace ukm {
|
|
|
| @@ -44,35 +34,6 @@ namespace {
|
| // initialization work.
|
| constexpr int kInitializationDelaySeconds = 5;
|
|
|
| -// Gets the list of whitelisted Entries as string. Format is a comma seperated
|
| -// list of Entry names (as strings).
|
| -std::string GetWhitelistEntries() {
|
| - return base::GetFieldTrialParamValueByFeature(kUkmFeature,
|
| - "WhitelistEntries");
|
| -}
|
| -
|
| -// Gets the maximum number of Sources we'll keep in memory before discarding any
|
| -// new ones being added.
|
| -size_t GetMaxSources() {
|
| - constexpr size_t kDefaultMaxSources = 500;
|
| - return static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt(
|
| - kUkmFeature, "MaxSources", kDefaultMaxSources));
|
| -}
|
| -
|
| -// Gets the maximum number of Entries we'll keep in memory before discarding any
|
| -// new ones being added.
|
| -size_t GetMaxEntries() {
|
| - constexpr size_t kDefaultMaxEntries = 5000;
|
| - return static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt(
|
| - kUkmFeature, "MaxEntries", kDefaultMaxEntries));
|
| -}
|
| -
|
| -// True if we should record the initial_url field of the UKM Source proto.
|
| -bool ShouldRecordInitialUrl() {
|
| - return base::GetFieldTrialParamByFeatureAsBool(kUkmFeature,
|
| - "RecordInitialUrl", false);
|
| -}
|
| -
|
| // True if we should record session ids in the UKM Report proto.
|
| bool ShouldRecordSessionId() {
|
| return base::GetFieldTrialParamByFeatureAsBool(kUkmFeature, "RecordSessionId",
|
| @@ -105,34 +66,11 @@ int32_t LoadSessionId(PrefService* pref_service) {
|
| return session_id;
|
| }
|
|
|
| -enum class DroppedDataReason {
|
| - NOT_DROPPED = 0,
|
| - RECORDING_DISABLED = 1,
|
| - MAX_HIT = 2,
|
| - NOT_WHITELISTED = 3,
|
| - NUM_DROPPED_DATA_REASONS
|
| -};
|
| -
|
| -void RecordDroppedSource(DroppedDataReason reason) {
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "UKM.Sources.Dropped", static_cast<int>(reason),
|
| - static_cast<int>(DroppedDataReason::NUM_DROPPED_DATA_REASONS));
|
| -}
|
| -
|
| -void RecordDroppedEntry(DroppedDataReason reason) {
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "UKM.Entries.Dropped", static_cast<int>(reason),
|
| - static_cast<int>(DroppedDataReason::NUM_DROPPED_DATA_REASONS));
|
| -}
|
| -
|
| } // namespace
|
|
|
| -const base::Feature kUkmFeature = {"Ukm", base::FEATURE_DISABLED_BY_DEFAULT};
|
| -
|
| UkmService::UkmService(PrefService* pref_service,
|
| metrics::MetricsServiceClient* client)
|
| : pref_service_(pref_service),
|
| - recording_enabled_(false),
|
| client_id_(0),
|
| session_id_(0),
|
| client_(client),
|
| @@ -178,14 +116,6 @@ void UkmService::Initialize() {
|
| base::TimeDelta::FromSeconds(kInitializationDelaySeconds));
|
| }
|
|
|
| -void UkmService::EnableRecording() {
|
| - recording_enabled_ = true;
|
| -}
|
| -
|
| -void UkmService::DisableRecording() {
|
| - recording_enabled_ = false;
|
| -}
|
| -
|
| void UkmService::EnableReporting() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DVLOG(1) << "UkmService::EnableReporting";
|
| @@ -255,8 +185,7 @@ void UkmService::Purge() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DVLOG(1) << "UkmService::Purge";
|
| reporting_service_.ukm_log_store()->Purge();
|
| - sources_.clear();
|
| - entries_.clear();
|
| + UkmRecorderImpl::Purge();
|
| }
|
|
|
| // TODO(bmcquade): rename this to something more generic, like
|
| @@ -308,7 +237,7 @@ void UkmService::BuildAndStoreLog() {
|
|
|
| // Suppress generating a log if we have no new data to include.
|
| // TODO(zhenw): add a histogram here to debug if this case is hitting a lot.
|
| - if (sources_.empty() && entries_.empty())
|
| + if (sources().empty() && entries().empty())
|
| return;
|
|
|
| Report report;
|
| @@ -316,21 +245,7 @@ void UkmService::BuildAndStoreLog() {
|
| if (ShouldRecordSessionId())
|
| report.set_session_id(session_id_);
|
|
|
| - for (const auto& kv : sources_) {
|
| - Source* proto_source = report.add_sources();
|
| - kv.second->PopulateProto(proto_source);
|
| - if (!ShouldRecordInitialUrl())
|
| - proto_source->clear_initial_url();
|
| - }
|
| - for (const auto& entry : entries_) {
|
| - Entry* proto_entry = report.add_entries();
|
| - entry->PopulateProto(proto_entry);
|
| - }
|
| -
|
| - UMA_HISTOGRAM_COUNTS_1000("UKM.Sources.SerializedCount", sources_.size());
|
| - UMA_HISTOGRAM_COUNTS_1000("UKM.Entries.SerializedCount", entries_.size());
|
| - sources_.clear();
|
| - entries_.clear();
|
| + StoreRecordingsInReport(&report);
|
|
|
| metrics::MetricsLog::RecordCoreSystemProfile(client_,
|
| report.mutable_system_profile());
|
| @@ -344,74 +259,4 @@ void UkmService::BuildAndStoreLog() {
|
| reporting_service_.ukm_log_store()->StoreLog(serialized_log);
|
| }
|
|
|
| -// static
|
| -int32_t UkmService::GetNewSourceID() {
|
| - static base::StaticAtomicSequenceNumber seq;
|
| - return seq.GetNext();
|
| -}
|
| -
|
| -std::unique_ptr<UkmEntryBuilder> UkmService::GetEntryBuilder(
|
| - int32_t source_id,
|
| - const char* event_name) {
|
| - return std::unique_ptr<UkmEntryBuilder>(new UkmEntryBuilder(
|
| - base::Bind(&UkmService::AddEntry, base::Unretained(this)), source_id,
|
| - event_name));
|
| -}
|
| -
|
| -void UkmService::UpdateSourceURL(int32_t source_id, const GURL& url) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (!recording_enabled_) {
|
| - RecordDroppedSource(DroppedDataReason::RECORDING_DISABLED);
|
| - return;
|
| - }
|
| -
|
| - // Update the pre-existing source if there is any. This happens when the
|
| - // initial URL is different from the committed URL for the same source, e.g.,
|
| - // when there is redirection.
|
| - if (base::ContainsKey(sources_, source_id)) {
|
| - sources_[source_id]->UpdateUrl(url);
|
| - return;
|
| - }
|
| -
|
| - if (sources_.size() >= GetMaxSources()) {
|
| - RecordDroppedSource(DroppedDataReason::MAX_HIT);
|
| - return;
|
| - }
|
| - std::unique_ptr<UkmSource> source = base::MakeUnique<UkmSource>();
|
| - source->set_id(source_id);
|
| - source->set_url(url);
|
| - sources_.insert(std::make_pair(source_id, std::move(source)));
|
| -}
|
| -
|
| -void UkmService::AddEntry(std::unique_ptr<UkmEntry> entry) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (!recording_enabled_) {
|
| - RecordDroppedEntry(DroppedDataReason::RECORDING_DISABLED);
|
| - return;
|
| - }
|
| - if (entries_.size() >= GetMaxEntries()) {
|
| - RecordDroppedEntry(DroppedDataReason::MAX_HIT);
|
| - return;
|
| - }
|
| -
|
| - if (!whitelisted_entry_hashes_.empty() &&
|
| - !base::ContainsKey(whitelisted_entry_hashes_, entry->event_hash())) {
|
| - RecordDroppedEntry(DroppedDataReason::NOT_WHITELISTED);
|
| - return;
|
| - }
|
| -
|
| - entries_.push_back(std::move(entry));
|
| -}
|
| -
|
| -void UkmService::StoreWhitelistedEntries() {
|
| - const auto entries =
|
| - base::SplitString(GetWhitelistEntries(), ",", base::TRIM_WHITESPACE,
|
| - base::SPLIT_WANT_NONEMPTY);
|
| - for (const auto& entry_string : entries) {
|
| - whitelisted_entry_hashes_.insert(base::HashMetricName(entry_string));
|
| - }
|
| -}
|
| -
|
| } // namespace ukm
|
|
|