Chromium Code Reviews| 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; |
| } |