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

Unified Diff: components/metrics/metrics_reporting_scheduler.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
Index: components/metrics/metrics_reporting_scheduler.cc
diff --git a/components/metrics/metrics_reporting_scheduler.cc b/components/metrics/metrics_reporting_scheduler.cc
deleted file mode 100644
index 625d546fea28391a85f575f42a7733fa9a727cb6..0000000000000000000000000000000000000000
--- a/components/metrics/metrics_reporting_scheduler.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/metrics/metrics_reporting_scheduler.h"
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/strings/string_number_conversions.h"
-#include "build/build_config.h"
-#include "components/variations/variations_associated_data.h"
-
-using base::TimeDelta;
-
-namespace metrics {
-
-namespace {
-
-// The delay, in seconds, after startup before sending the first log message.
-#if defined(OS_ANDROID) || defined(OS_IOS)
-// Sessions are more likely to be short on a mobile device, so handle the
-// initial log quickly.
-const int kInitialUploadIntervalSeconds = 15;
-#else
-const int kInitialUploadIntervalSeconds = 60;
-#endif
-
-// The delay, in seconds, between uploading when there are queued logs from
-// previous sessions to send.
-#if defined(OS_ANDROID) || defined(OS_IOS)
-// Sending in a burst is better on a mobile device, since keeping the radio on
-// is very expensive.
-const int kUnsentLogsIntervalSeconds = 3;
-#else
-const int kUnsentLogsIntervalSeconds = 15;
-#endif
-
-// When uploading metrics to the server fails, we progressively wait longer and
-// longer before sending the next log. This backoff process helps reduce load
-// on a server that is having issues.
-// The following is the multiplier we use to expand that inter-log duration.
-const double kBackoffMultiplier = 1.1;
-
-// The maximum backoff multiplier.
-const int kMaxBackoffMultiplier = 10;
-
-} // anonymous namespace
-
-MetricsReportingScheduler::MetricsReportingScheduler(
- const base::Closure& upload_callback,
- const base::Callback<base::TimeDelta(void)>& upload_interval_callback)
- : upload_callback_(upload_callback),
- upload_interval_(TimeDelta::FromSeconds(kInitialUploadIntervalSeconds)),
- running_(false),
- callback_pending_(false),
- init_task_complete_(false),
- waiting_for_init_task_complete_(false),
- upload_interval_callback_(upload_interval_callback) {
-}
-
-MetricsReportingScheduler::~MetricsReportingScheduler() {}
-
-void MetricsReportingScheduler::Start() {
- running_ = true;
- ScheduleNextUpload();
-}
-
-void MetricsReportingScheduler::Stop() {
- running_ = false;
- if (upload_timer_.IsRunning())
- upload_timer_.Stop();
-}
-
-// Callback from MetricsService when the startup init task has completed.
-void MetricsReportingScheduler::InitTaskComplete() {
- DCHECK(!init_task_complete_);
- init_task_complete_ = true;
- if (waiting_for_init_task_complete_) {
- waiting_for_init_task_complete_ = false;
- TriggerUpload();
- } else {
- LogMetricsInitSequence(INIT_TASK_COMPLETED_FIRST);
- }
-}
-
-void MetricsReportingScheduler::UploadFinished(bool server_is_healthy,
- bool more_logs_remaining) {
- DCHECK(callback_pending_);
- callback_pending_ = false;
- // If the server is having issues, back off. Otherwise, reset to default
- // (unless there are more logs to send, in which case the next upload should
- // happen sooner).
- if (!server_is_healthy) {
- BackOffUploadInterval();
- } else if (more_logs_remaining) {
- upload_interval_ = TimeDelta::FromSeconds(kUnsentLogsIntervalSeconds);
- } else {
- upload_interval_ = GetStandardUploadInterval();
- last_upload_finish_time_ = base::TimeTicks::Now();
- }
-
- if (running_)
- ScheduleNextUpload();
-}
-
-void MetricsReportingScheduler::UploadCancelled() {
- DCHECK(callback_pending_);
- callback_pending_ = false;
- if (running_)
- ScheduleNextUpload();
-}
-
-void MetricsReportingScheduler::SetUploadIntervalForTesting(
- base::TimeDelta interval) {
- upload_interval_ = interval;
-}
-
-void MetricsReportingScheduler::LogMetricsInitSequence(InitSequence sequence) {
- UMA_HISTOGRAM_ENUMERATION("UMA.InitSequence", sequence,
- INIT_SEQUENCE_ENUM_SIZE);
-}
-
-void MetricsReportingScheduler::LogActualUploadInterval(TimeDelta interval) {
- UMA_HISTOGRAM_CUSTOM_COUNTS("UMA.ActualLogUploadInterval",
- interval.InMinutes(),
- 1,
- base::TimeDelta::FromHours(12).InMinutes(),
- 50);
-}
-
-void MetricsReportingScheduler::TriggerUpload() {
- // If the timer fired before the init task has completed, don't trigger the
- // upload yet - wait for the init task to complete and do it then.
- if (!init_task_complete_) {
- LogMetricsInitSequence(TIMER_FIRED_FIRST);
- waiting_for_init_task_complete_ = true;
- return;
- }
-
- if (!last_upload_finish_time_.is_null()) {
- LogActualUploadInterval(base::TimeTicks::Now() - last_upload_finish_time_);
- last_upload_finish_time_ = base::TimeTicks();
- }
-
- callback_pending_ = true;
- upload_callback_.Run();
-}
-
-void MetricsReportingScheduler::ScheduleNextUpload() {
- DCHECK(running_);
- if (upload_timer_.IsRunning() || callback_pending_)
- return;
-
- upload_timer_.Start(FROM_HERE, upload_interval_, this,
- &MetricsReportingScheduler::TriggerUpload);
-}
-
-void MetricsReportingScheduler::BackOffUploadInterval() {
- DCHECK_GT(kBackoffMultiplier, 1.0);
- upload_interval_ = TimeDelta::FromMicroseconds(static_cast<int64_t>(
- kBackoffMultiplier * upload_interval_.InMicroseconds()));
-
- TimeDelta max_interval = kMaxBackoffMultiplier * GetStandardUploadInterval();
- if (upload_interval_ > max_interval || upload_interval_.InSeconds() < 0) {
- upload_interval_ = max_interval;
- }
-}
-
-base::TimeDelta MetricsReportingScheduler::GetStandardUploadInterval() {
- return upload_interval_callback_.Run();
-}
-
-} // namespace metrics
« no previous file with comments | « components/metrics/metrics_reporting_scheduler.h ('k') | components/metrics/metrics_reporting_scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698