Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: components/ukm/ukm_service.cc

Issue 2770853002: Create Ukm ReportingService implementation. (Closed)
Patch Set: Also revert datatracker unittest change Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/ukm/ukm_service.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « components/ukm/ukm_service.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698