| Index: components/ukm/ukm_service.cc
|
| diff --git a/components/ukm/ukm_service.cc b/components/ukm/ukm_service.cc
|
| index dfe4a2ec72ad8b6d35f2ae5b3ea132b4fb300471..0df4cf6a64c1cb55fe481585ff309c7d2b77507b 100644
|
| --- a/components/ukm/ukm_service.cc
|
| +++ b/components/ukm/ukm_service.cc
|
| @@ -27,49 +27,21 @@
|
| #include "components/metrics/proto/ukm/source.pb.h"
|
| #include "components/prefs/pref_registry_simple.h"
|
| #include "components/prefs/pref_service.h"
|
| -#include "components/ukm/metrics_reporting_scheduler.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 {
|
|
|
| namespace {
|
|
|
| -constexpr char kMimeType[] = "application/vnd.chrome.ukm";
|
| -
|
| // The delay, in seconds, after starting recording before doing expensive
|
| // initialization work.
|
| constexpr int kInitializationDelaySeconds = 5;
|
|
|
| -// The number of UKM logs that will be stored in PersistedLogs before logs
|
| -// start being dropped.
|
| -constexpr int kMinPersistedLogs = 8;
|
| -
|
| -// The number of bytes UKM logs that will be stored in PersistedLogs before
|
| -// logs start being dropped.
|
| -// This ensures that a reasonable amount of history will be stored even if there
|
| -// is a long series of very small logs.
|
| -constexpr int kMinPersistedBytes = 300000;
|
| -
|
| -// If an upload fails, and the transmission was over this byte count, then we
|
| -// will discard the log, and not try to retransmit it. We also don't persist
|
| -// the log to the prefs for transmission during the next chrome session if this
|
| -// limit is exceeded.
|
| -constexpr size_t kMaxLogRetransmitSize = 100 * 1024;
|
| -
|
| -// Gets the UKM Server URL.
|
| -std::string GetServerUrl() {
|
| - constexpr char kDefaultServerUrl[] = "https://clients4.google.com/ukm";
|
| - std::string server_url =
|
| - base::GetFieldTrialParamValueByFeature(kUkmFeature, "ServerUrl");
|
| - if (!server_url.empty())
|
| - return server_url;
|
| - return kDefaultServerUrl;
|
| -}
|
| -
|
| // Gets the list of whitelisted Entries as string. Format is a comma seperated
|
| // list of Entry names (as strings).
|
| std::string GetWhitelistEntries() {
|
| @@ -162,22 +134,15 @@ UkmService::UkmService(PrefService* pref_service,
|
| client_id_(0),
|
| session_id_(0),
|
| client_(client),
|
| - persisted_logs_(std::unique_ptr<ukm::PersistedLogsMetricsImpl>(
|
| - new ukm::PersistedLogsMetricsImpl()),
|
| - pref_service,
|
| - prefs::kUkmPersistedLogs,
|
| - kMinPersistedLogs,
|
| - kMinPersistedBytes,
|
| - kMaxLogRetransmitSize),
|
| + reporting_service_(client, pref_service),
|
| initialize_started_(false),
|
| initialize_complete_(false),
|
| - log_upload_in_progress_(false),
|
| self_ptr_factory_(this) {
|
| DCHECK(pref_service_);
|
| DCHECK(client_);
|
| DVLOG(1) << "UkmService::Constructor";
|
|
|
| - persisted_logs_.LoadPersistedUnsentLogs();
|
| + reporting_service_.Initialize();
|
|
|
| base::Closure rotate_callback =
|
| base::Bind(&UkmService::RotateLog, self_ptr_factory_.GetWeakPtr());
|
| @@ -186,8 +151,8 @@ UkmService::UkmService(PrefService* pref_service,
|
| const base::Callback<base::TimeDelta(void)>& get_upload_interval_callback =
|
| base::Bind(&metrics::MetricsServiceClient::GetStandardUploadInterval,
|
| base::Unretained(client_));
|
| - scheduler_.reset(new ukm::MetricsReportingScheduler(
|
| - rotate_callback, get_upload_interval_callback));
|
| + scheduler_.reset(new ukm::UkmRotationScheduler(rotate_callback,
|
| + get_upload_interval_callback));
|
|
|
| for (auto& provider : metrics_providers_)
|
| provider->Init();
|
| @@ -222,6 +187,8 @@ void UkmService::DisableRecording() {
|
| void UkmService::EnableReporting() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DVLOG(1) << "UkmService::EnableReporting";
|
| + if (reporting_service_.reporting_active())
|
| + return;
|
|
|
| for (auto& provider : metrics_providers_)
|
| provider->OnRecordingEnabled();
|
| @@ -229,12 +196,15 @@ void UkmService::EnableReporting() {
|
| if (!initialize_started_)
|
| Initialize();
|
| scheduler_->Start();
|
| + reporting_service_.EnableReporting();
|
| }
|
|
|
| void UkmService::DisableReporting() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DVLOG(1) << "UkmService::DisableReporting";
|
|
|
| + reporting_service_.DisableReporting();
|
| +
|
| for (auto& provider : metrics_providers_)
|
| provider->OnRecordingDisabled();
|
|
|
| @@ -276,14 +246,13 @@ void UkmService::Flush() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| if (initialize_complete_)
|
| BuildAndStoreLog();
|
| - persisted_logs_.PersistUnsentLogs();
|
| + reporting_service_.ukm_log_store()->PersistUnsentLogs();
|
| }
|
|
|
| void UkmService::Purge() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DVLOG(1) << "UkmService::Purge";
|
| -
|
| - persisted_logs_.Purge();
|
| + reporting_service_.ukm_log_store()->Purge();
|
| sources_.clear();
|
| entries_.clear();
|
| }
|
| @@ -304,7 +273,7 @@ void UkmService::RegisterMetricsProvider(
|
| void UkmService::RegisterPrefs(PrefRegistrySimple* registry) {
|
| registry->RegisterInt64Pref(prefs::kUkmClientId, 0);
|
| registry->RegisterIntegerPref(prefs::kUkmSessionId, 0);
|
| - registry->RegisterListPref(prefs::kUkmPersistedLogs);
|
| + UkmReportingService::RegisterPrefs(registry);
|
| }
|
|
|
| void UkmService::StartInitTask() {
|
| @@ -325,11 +294,10 @@ void UkmService::FinishedInitTask() {
|
|
|
| void UkmService::RotateLog() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!log_upload_in_progress_);
|
| DVLOG(1) << "UkmService::RotateLog";
|
| - if (!persisted_logs_.has_unsent_logs())
|
| + if (!reporting_service_.ukm_log_store()->has_unsent_logs())
|
| BuildAndStoreLog();
|
| - StartScheduledUpload();
|
| + reporting_service_.Start();
|
| }
|
|
|
| void UkmService::BuildAndStoreLog() {
|
| @@ -371,70 +339,7 @@ void UkmService::BuildAndStoreLog() {
|
|
|
| std::string serialized_log;
|
| report.SerializeToString(&serialized_log);
|
| - persisted_logs_.StoreLog(serialized_log);
|
| -}
|
| -
|
| -void UkmService::StartScheduledUpload() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!log_upload_in_progress_);
|
| - if (!persisted_logs_.has_unsent_logs()) {
|
| - // No logs to send, so early out and schedule the next rotation.
|
| - scheduler_->UploadFinished(true, /* has_unsent_logs */ false);
|
| - return;
|
| - }
|
| - if (!persisted_logs_.has_staged_log())
|
| - persisted_logs_.StageNextLog();
|
| - // TODO(holte): Handle data usage on cellular, etc.
|
| - if (!log_uploader_) {
|
| - log_uploader_ = client_->CreateUploader(
|
| - GetServerUrl(), kMimeType, metrics::MetricsLogUploader::UKM,
|
| - base::Bind(&UkmService::OnLogUploadComplete,
|
| - self_ptr_factory_.GetWeakPtr()));
|
| - }
|
| - log_upload_in_progress_ = true;
|
| -
|
| - const std::string hash =
|
| - base::HexEncode(persisted_logs_.staged_log_hash().data(),
|
| - persisted_logs_.staged_log_hash().size());
|
| - log_uploader_->UploadLog(persisted_logs_.staged_log(), hash);
|
| -}
|
| -
|
| -void UkmService::OnLogUploadComplete(int response_code) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(log_upload_in_progress_);
|
| - DVLOG(1) << "UkmService::OnLogUploadComplete";
|
| - log_upload_in_progress_ = false;
|
| -
|
| - UMA_HISTOGRAM_SPARSE_SLOWLY("UKM.Upload.ResponseCode", response_code);
|
| -
|
| - bool upload_succeeded = response_code == 200;
|
| -
|
| - // Staged log may have been deleted by Purge already, otherwise we may
|
| - // remove it from the log store here.
|
| - if (persisted_logs_.has_staged_log()) {
|
| - // Provide boolean for error recovery (allow us to ignore response_code).
|
| - bool discard_log = false;
|
| - const size_t log_size_bytes = persisted_logs_.staged_log().length();
|
| - if (upload_succeeded) {
|
| - UMA_HISTOGRAM_COUNTS_10000("UKM.LogSize.OnSuccess",
|
| - log_size_bytes / 1024);
|
| - } else if (response_code == 400) {
|
| - // Bad syntax. Retransmission won't work.
|
| - discard_log = true;
|
| - }
|
| -
|
| - if (upload_succeeded || discard_log) {
|
| - persisted_logs_.DiscardStagedLog();
|
| - // Store the updated list to disk now that the removed log is uploaded.
|
| - persisted_logs_.PersistUnsentLogs();
|
| - }
|
| - }
|
| -
|
| - // Error 400 indicates a problem with the log, not with the server, so
|
| - // don't consider that a sign that the server is in trouble.
|
| - bool server_is_healthy = upload_succeeded || response_code == 400;
|
| - scheduler_->UploadFinished(server_is_healthy,
|
| - persisted_logs_.has_unsent_logs());
|
| + reporting_service_.ukm_log_store()->StoreLog(serialized_log);
|
| }
|
|
|
| // static
|
|
|