Index: components/ukm/ukm_service.cc |
diff --git a/components/ukm/ukm_service.cc b/components/ukm/ukm_service.cc |
index 42bb7ad38383b0c53f7bc3c836dcd07392131ad2..a8e03b7d9fb44272f1a9dbf35fb20cbf73c809ae 100644 |
--- a/components/ukm/ukm_service.cc |
+++ b/components/ukm/ukm_service.cc |
@@ -69,17 +69,36 @@ std::string GetServerUrl() { |
return kDefaultServerUrl; |
} |
+// 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); |
+ return client_id; |
+} |
+ |
uint64_t LoadOrGenerateClientId(PrefService* pref_service) { |
uint64_t client_id = pref_service->GetInt64(prefs::kUkmClientId); |
if (!client_id) { |
Alexei Svitkine (slow)
2017/02/04 00:52:23
Nit: No {}
Steven Holte
2017/02/06 21:57:54
Done.
|
- // Generate and store a new client id. |
- while (!client_id) |
- client_id = base::RandUint64(); |
- pref_service->SetInt64(prefs::kUkmClientId, client_id); |
+ client_id = GenerateClientId(pref_service); |
} |
return client_id; |
} |
+enum class DroppedSourceReason { |
+ NOT_DROPPED = 0, |
+ RECORDING_DISABLED = 1, |
+ MAX_SOURCES_HIT = 2, |
+ NUM_DROPPED_SOURCES_REASONS |
+}; |
+ |
+void RecordDroppedSource(DroppedSourceReason reason) { |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "UKM.Sources.Dropped", static_cast<int>(reason), |
+ static_cast<int>(DroppedSourceReason::NUM_DROPPED_SOURCES_REASONS)); |
+} |
+ |
} // namespace |
const base::Feature kUkmFeature = {"Ukm", base::FEATURE_DISABLED_BY_DEFAULT}; |
@@ -87,6 +106,7 @@ 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_(client), |
persisted_logs_(std::unique_ptr<ukm::PersistedLogsMetricsImpl>( |
new ukm::PersistedLogsMetricsImpl()), |
@@ -131,6 +151,14 @@ 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"; |
@@ -158,6 +186,10 @@ void UkmService::Purge() { |
sources_.clear(); |
} |
+void UkmService::ResetClientId() { |
+ client_id_ = GenerateClientId(pref_service_); |
+} |
+ |
// static |
void UkmService::RegisterPrefs(PrefRegistrySimple* registry) { |
registry->RegisterInt64Pref(prefs::kUkmClientId, 0); |
@@ -192,6 +224,10 @@ void UkmService::RotateLog() { |
void UkmService::BuildAndStoreLog() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DVLOG(1) << "UkmService::BuildAndStoreLog"; |
+ // Suppress generating a log if we have no new data to include. |
+ if (sources_.empty()) |
+ return; |
+ |
Report report; |
report.set_client_id(client_id_); |
@@ -262,8 +298,12 @@ void UkmService::OnLogUploadComplete(int response_code) { |
} |
void UkmService::RecordSource(std::unique_ptr<UkmSource> source) { |
+ if (!recording_enabled_) { |
+ RecordDroppedSource(DroppedSourceReason::RECORDING_DISABLED); |
+ return; |
+ } |
if (sources_.size() >= kMaxSources) { |
- UMA_HISTOGRAM_BOOLEAN("UKM.Sources.MaxSourcesHit", true); |
+ RecordDroppedSource(DroppedSourceReason::MAX_SOURCES_HIT); |
return; |
} |