Index: components/ukm/ukm_service.cc |
diff --git a/components/ukm/ukm_service.cc b/components/ukm/ukm_service.cc |
index bc682aa644008ffa1ce98b07984ec5dcf0491e2f..87176c714a5f3e4938b80cd0ec71ede2eeb7ca47 100644 |
--- a/components/ukm/ukm_service.cc |
+++ b/components/ukm/ukm_service.cc |
@@ -12,6 +12,7 @@ |
#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/rand_util.h" |
#include "base/strings/string_number_conversions.h" |
@@ -30,7 +31,6 @@ |
#include "components/ukm/ukm_entry_builder.h" |
#include "components/ukm/ukm_pref_names.h" |
#include "components/ukm/ukm_source.h" |
-#include "components/variations/variations_associated_data.h" |
namespace ukm { |
@@ -71,18 +71,31 @@ const size_t kMaxEntries = 5000; |
std::string GetServerUrl() { |
std::string server_url = |
- variations::GetVariationParamValueByFeature(kUkmFeature, "ServerUrl"); |
+ base::GetFieldTrialParamValueByFeature(kUkmFeature, "ServerUrl"); |
if (!server_url.empty()) |
return server_url; |
return kDefaultServerUrl; |
} |
+bool ShouldRecordInitialUrl() { |
+ return base::GetFieldTrialParamByFeatureAsBool(kUkmFeature, |
+ "RecordInitialUrl", false); |
+} |
+ |
+bool ShouldRecordSessionId() { |
+ return base::GetFieldTrialParamByFeatureAsBool(kUkmFeature, "RecordSessionId", |
+ false); |
+} |
+ |
// Generates a new client id and stores it in prefs. |
uint64_t GenerateClientId(PrefService* pref_service) { |
uint64_t client_id = 0; |
while (!client_id) |
client_id = base::RandUint64(); |
pref_service->SetInt64(prefs::kUkmClientId, client_id); |
+ |
+ // Also reset the session id counter. |
+ pref_service->SetInteger(prefs::kUkmSessionId, 0); |
return client_id; |
} |
@@ -93,6 +106,13 @@ uint64_t LoadOrGenerateClientId(PrefService* pref_service) { |
return client_id; |
} |
+int32_t LoadSessionId(PrefService* pref_service) { |
+ int32_t session_id = pref_service->GetInteger(prefs::kUkmSessionId); |
+ ++session_id; // increment session id, once per session |
+ pref_service->SetInteger(prefs::kUkmSessionId, session_id); |
+ return session_id; |
+} |
+ |
enum class DroppedDataReason { |
NOT_DROPPED = 0, |
RECORDING_DISABLED = 1, |
@@ -120,6 +140,8 @@ UkmService::UkmService(PrefService* pref_service, |
metrics::MetricsServiceClient* client) |
: pref_service_(pref_service), |
recording_enabled_(false), |
+ client_id_(0), |
+ session_id_(0), |
client_(client), |
persisted_logs_(std::unique_ptr<ukm::PersistedLogsMetricsImpl>( |
new ukm::PersistedLogsMetricsImpl()), |
@@ -158,6 +180,7 @@ UkmService::~UkmService() { |
void UkmService::Initialize() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(!initialize_started_); |
DVLOG(1) << "UkmService::Initialize"; |
initialize_started_ = true; |
@@ -244,8 +267,11 @@ void UkmService::Purge() { |
entries_.clear(); |
} |
+// TODO(bmcquade): rename this to something more generic, like |
+// ResetClientState. Consider resetting all prefs here. |
void UkmService::ResetClientId() { |
client_id_ = GenerateClientId(pref_service_); |
+ session_id_ = LoadSessionId(pref_service_); |
} |
void UkmService::RegisterMetricsProvider( |
@@ -256,6 +282,7 @@ void UkmService::RegisterMetricsProvider( |
// static |
void UkmService::RegisterPrefs(PrefRegistrySimple* registry) { |
registry->RegisterInt64Pref(prefs::kUkmClientId, 0); |
+ registry->RegisterIntegerPref(prefs::kUkmSessionId, 0); |
registry->RegisterListPref(prefs::kUkmPersistedLogs); |
} |
@@ -263,6 +290,7 @@ void UkmService::StartInitTask() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DVLOG(1) << "UkmService::StartInitTask"; |
client_id_ = LoadOrGenerateClientId(pref_service_); |
+ session_id_ = LoadSessionId(pref_service_); |
client_->InitializeSystemProfileMetrics(base::Bind( |
&UkmService::FinishedInitTask, self_ptr_factory_.GetWeakPtr())); |
} |
@@ -294,10 +322,14 @@ void UkmService::BuildAndStoreLog() { |
Report report; |
report.set_client_id(client_id_); |
+ if (ShouldRecordSessionId()) |
+ report.set_session_id(session_id_); |
for (const auto& source : sources_) { |
Source* proto_source = report.add_sources(); |
source->PopulateProto(proto_source); |
+ if (!ShouldRecordInitialUrl()) |
+ proto_source->clear_initial_url(); |
} |
for (const auto& entry : entries_) { |
Entry* proto_entry = report.add_entries(); |
@@ -423,7 +455,7 @@ void UkmService::UpdateSourceURL(int32_t source_id, const GURL& url) { |
if (source_id != source->id()) |
continue; |
- source->set_url(url); |
+ source->UpdateUrl(url); |
return; |
} |