xref: /aosp_15_r20/external/cronet/components/metrics/metrics_upload_scheduler.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_upload_scheduler.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial_params.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_macros.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
14*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_scheduler.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace metrics {
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker // When uploading metrics to the server fails, we progressively wait longer and
20*6777b538SAndroid Build Coastguard Worker // longer before sending the next log. This backoff process helps reduce load
21*6777b538SAndroid Build Coastguard Worker // on a server that is having issues.
22*6777b538SAndroid Build Coastguard Worker // The following is the multiplier we use to expand that inter-log duration.
23*6777b538SAndroid Build Coastguard Worker const double kBackoffMultiplier = 2;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker // The maximum backoff interval in hours.
26*6777b538SAndroid Build Coastguard Worker const int kMaxBackoffIntervalHours = 24;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker // Minutes to wait if we are unable to upload due to data usage cap.
29*6777b538SAndroid Build Coastguard Worker const int kOverDataUsageIntervalMinutes = 5;
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker // Increases the upload interval each time it's called, to handle the case
32*6777b538SAndroid Build Coastguard Worker // where the server is having issues.
BackOffUploadInterval(base::TimeDelta interval)33*6777b538SAndroid Build Coastguard Worker base::TimeDelta BackOffUploadInterval(base::TimeDelta interval) {
34*6777b538SAndroid Build Coastguard Worker   DCHECK_GT(kBackoffMultiplier, 1.0);
35*6777b538SAndroid Build Coastguard Worker   interval = base::Microseconds(
36*6777b538SAndroid Build Coastguard Worker       static_cast<int64_t>(kBackoffMultiplier * interval.InMicroseconds()));
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker   base::TimeDelta max_interval = base::Hours(kMaxBackoffIntervalHours);
39*6777b538SAndroid Build Coastguard Worker   if (interval > max_interval || interval.InSeconds() < 0) {
40*6777b538SAndroid Build Coastguard Worker     interval = max_interval;
41*6777b538SAndroid Build Coastguard Worker   }
42*6777b538SAndroid Build Coastguard Worker   return interval;
43*6777b538SAndroid Build Coastguard Worker }
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker }  // namespace
46*6777b538SAndroid Build Coastguard Worker 
MetricsUploadScheduler(const base::RepeatingClosure & upload_callback,bool fast_startup_for_testing)47*6777b538SAndroid Build Coastguard Worker MetricsUploadScheduler::MetricsUploadScheduler(
48*6777b538SAndroid Build Coastguard Worker     const base::RepeatingClosure& upload_callback,
49*6777b538SAndroid Build Coastguard Worker     bool fast_startup_for_testing)
50*6777b538SAndroid Build Coastguard Worker     : MetricsScheduler(upload_callback, fast_startup_for_testing),
51*6777b538SAndroid Build Coastguard Worker       unsent_logs_interval_(GetUnsentLogsInterval()),
52*6777b538SAndroid Build Coastguard Worker       initial_backoff_interval_(GetInitialBackoffInterval()),
53*6777b538SAndroid Build Coastguard Worker       backoff_interval_(initial_backoff_interval_) {}
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker MetricsUploadScheduler::~MetricsUploadScheduler() = default;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker // static
GetUnsentLogsInterval()58*6777b538SAndroid Build Coastguard Worker base::TimeDelta MetricsUploadScheduler::GetUnsentLogsInterval() {
59*6777b538SAndroid Build Coastguard Worker   return base::Seconds(3);
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker // static
GetInitialBackoffInterval()63*6777b538SAndroid Build Coastguard Worker base::TimeDelta MetricsUploadScheduler::GetInitialBackoffInterval() {
64*6777b538SAndroid Build Coastguard Worker   return base::Minutes(5);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker 
UploadFinished(bool server_is_healthy)67*6777b538SAndroid Build Coastguard Worker void MetricsUploadScheduler::UploadFinished(bool server_is_healthy) {
68*6777b538SAndroid Build Coastguard Worker   // If the server is having issues, back off. Otherwise, reset to default
69*6777b538SAndroid Build Coastguard Worker   // (unless there are more logs to send, in which case the next upload should
70*6777b538SAndroid Build Coastguard Worker   // happen sooner).
71*6777b538SAndroid Build Coastguard Worker   if (!server_is_healthy) {
72*6777b538SAndroid Build Coastguard Worker     TaskDone(backoff_interval_);
73*6777b538SAndroid Build Coastguard Worker     backoff_interval_ = BackOffUploadInterval(backoff_interval_);
74*6777b538SAndroid Build Coastguard Worker   } else {
75*6777b538SAndroid Build Coastguard Worker     backoff_interval_ = initial_backoff_interval_;
76*6777b538SAndroid Build Coastguard Worker     TaskDone(unsent_logs_interval_);
77*6777b538SAndroid Build Coastguard Worker   }
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker 
StopAndUploadCancelled()80*6777b538SAndroid Build Coastguard Worker void MetricsUploadScheduler::StopAndUploadCancelled() {
81*6777b538SAndroid Build Coastguard Worker   Stop();
82*6777b538SAndroid Build Coastguard Worker   TaskDone(unsent_logs_interval_);
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker 
UploadOverDataUsageCap()85*6777b538SAndroid Build Coastguard Worker void MetricsUploadScheduler::UploadOverDataUsageCap() {
86*6777b538SAndroid Build Coastguard Worker   TaskDone(base::Minutes(kOverDataUsageIntervalMinutes));
87*6777b538SAndroid Build Coastguard Worker }
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
90