| 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
|
|
|