xref: /aosp_15_r20/external/cronet/components/metrics/reporting_service.h (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 // This file defines a service that sends metrics logs to a server.
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_METRICS_REPORTING_SERVICE_H_
8*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_REPORTING_SERVICE_H_
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
16*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
17*6777b538SAndroid Build Coastguard Worker #include "components/metrics/data_use_tracker.h"
18*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_log_uploader.h"
19*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_logs_event_manager.h"
20*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/reporting_info.pb.h"
21*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker class PrefService;
24*6777b538SAndroid Build Coastguard Worker class PrefRegistrySimple;
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace metrics {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker class LogStore;
29*6777b538SAndroid Build Coastguard Worker class MetricsUploadScheduler;
30*6777b538SAndroid Build Coastguard Worker class MetricsServiceClient;
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker // ReportingService is an abstract class which uploads serialized logs from a
33*6777b538SAndroid Build Coastguard Worker // LogStore to a remote server. A concrete implementation of this class must
34*6777b538SAndroid Build Coastguard Worker // provide the specific LogStore and parameters for the MetricsLogUploader, and
35*6777b538SAndroid Build Coastguard Worker // can also implement hooks to record histograms based on certain events that
36*6777b538SAndroid Build Coastguard Worker // occur while attempting to upload logs.
37*6777b538SAndroid Build Coastguard Worker class ReportingService {
38*6777b538SAndroid Build Coastguard Worker  public:
39*6777b538SAndroid Build Coastguard Worker   // Creates a ReportingService with the given |client|, |local_state|,
40*6777b538SAndroid Build Coastguard Worker   // |max_retransmit_size|, and |logs_event_manager|. Does not take ownership
41*6777b538SAndroid Build Coastguard Worker   // of the parameters; instead it stores a weak pointer to each. Caller should
42*6777b538SAndroid Build Coastguard Worker   // ensure that the parameters are valid for the lifetime of this class.
43*6777b538SAndroid Build Coastguard Worker   // |logs_event_manager| is used to notify observers of log events. Can be set
44*6777b538SAndroid Build Coastguard Worker   // to null if observing the events is not necessary.
45*6777b538SAndroid Build Coastguard Worker   ReportingService(MetricsServiceClient* client,
46*6777b538SAndroid Build Coastguard Worker                    PrefService* local_state,
47*6777b538SAndroid Build Coastguard Worker                    size_t max_retransmit_size,
48*6777b538SAndroid Build Coastguard Worker                    MetricsLogsEventManager* logs_event_manager);
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   ReportingService(const ReportingService&) = delete;
51*6777b538SAndroid Build Coastguard Worker   ReportingService& operator=(const ReportingService&) = delete;
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker   virtual ~ReportingService();
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   // Completes setup tasks that can't be done at construction time.
56*6777b538SAndroid Build Coastguard Worker   // Loads persisted logs and creates the MetricsUploadScheduler.
57*6777b538SAndroid Build Coastguard Worker   void Initialize();
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   // Starts the metrics reporting system.
60*6777b538SAndroid Build Coastguard Worker   // Should be called when metrics enabled or new logs are created.
61*6777b538SAndroid Build Coastguard Worker   // When the service is already running, this is a safe no-op.
62*6777b538SAndroid Build Coastguard Worker   void Start();
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   // Shuts down the metrics system. Should be called at shutdown, or if metrics
65*6777b538SAndroid Build Coastguard Worker   // are turned off.
66*6777b538SAndroid Build Coastguard Worker   void Stop();
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   // Enable/disable transmission of accumulated logs and crash reports (dumps).
69*6777b538SAndroid Build Coastguard Worker   // Calling Start() automatically enables reporting, but sending is
70*6777b538SAndroid Build Coastguard Worker   // asyncronous so this can be called immediately after Start() to prevent
71*6777b538SAndroid Build Coastguard Worker   // any uploading.
72*6777b538SAndroid Build Coastguard Worker   void EnableReporting();
73*6777b538SAndroid Build Coastguard Worker   void DisableReporting();
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   // True iff reporting is currently enabled.
76*6777b538SAndroid Build Coastguard Worker   bool reporting_active() const;
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
SetIsInForegound(bool is_in_foreground)79*6777b538SAndroid Build Coastguard Worker   void SetIsInForegound(bool is_in_foreground) {
80*6777b538SAndroid Build Coastguard Worker     is_in_foreground_ = is_in_foreground;
81*6777b538SAndroid Build Coastguard Worker   }
82*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   // Registers local state prefs used by this class. This should only be called
85*6777b538SAndroid Build Coastguard Worker   // once.
86*6777b538SAndroid Build Coastguard Worker   static void RegisterPrefs(PrefRegistrySimple* registry);
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker  protected:
client()89*6777b538SAndroid Build Coastguard Worker   MetricsServiceClient* client() const { return client_; }
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker  private:
92*6777b538SAndroid Build Coastguard Worker   // Retrieves the log store backing this service.
93*6777b538SAndroid Build Coastguard Worker   virtual LogStore* log_store() = 0;
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   // Getters for MetricsLogUploader parameters.
96*6777b538SAndroid Build Coastguard Worker   virtual GURL GetUploadUrl() const = 0;
97*6777b538SAndroid Build Coastguard Worker   virtual GURL GetInsecureUploadUrl() const = 0;
98*6777b538SAndroid Build Coastguard Worker   virtual base::StringPiece upload_mime_type() const = 0;
99*6777b538SAndroid Build Coastguard Worker   virtual MetricsLogUploader::MetricServiceType service_type() const = 0;
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   // Methods for recording data to histograms.
LogActualUploadInterval(base::TimeDelta interval)102*6777b538SAndroid Build Coastguard Worker   virtual void LogActualUploadInterval(base::TimeDelta interval) {}
LogCellularConstraint(bool upload_canceled)103*6777b538SAndroid Build Coastguard Worker   virtual void LogCellularConstraint(bool upload_canceled) {}
LogResponseOrErrorCode(int response_code,int error_code,bool was_https)104*6777b538SAndroid Build Coastguard Worker   virtual void LogResponseOrErrorCode(int response_code,
105*6777b538SAndroid Build Coastguard Worker                                       int error_code,
106*6777b538SAndroid Build Coastguard Worker                                       bool was_https) {}
LogSuccessLogSize(size_t log_size)107*6777b538SAndroid Build Coastguard Worker   virtual void LogSuccessLogSize(size_t log_size) {}
LogSuccessMetadata(const std::string & staged_log)108*6777b538SAndroid Build Coastguard Worker   virtual void LogSuccessMetadata(const std::string& staged_log) {}
LogLargeRejection(size_t log_size)109*6777b538SAndroid Build Coastguard Worker   virtual void LogLargeRejection(size_t log_size) {}
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   // If recording is enabled, begins uploading the next completed log from
112*6777b538SAndroid Build Coastguard Worker   // the log manager, staging it if necessary.
113*6777b538SAndroid Build Coastguard Worker   void SendNextLog();
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker   // Uploads the currently staged log (which must be non-null).
116*6777b538SAndroid Build Coastguard Worker   void SendStagedLog();
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   // Called after transmission completes (either successfully or with failure).
119*6777b538SAndroid Build Coastguard Worker   // If |force_discard| is true, discard the log regardless of the response or
120*6777b538SAndroid Build Coastguard Worker   // error code. For example, this is used for builds that do not include any
121*6777b538SAndroid Build Coastguard Worker   // metrics server URLs (no reason to keep re-sending to a non-existent URL).
122*6777b538SAndroid Build Coastguard Worker   void OnLogUploadComplete(int response_code,
123*6777b538SAndroid Build Coastguard Worker                            int error_code,
124*6777b538SAndroid Build Coastguard Worker                            bool was_https,
125*6777b538SAndroid Build Coastguard Worker                            bool force_discard,
126*6777b538SAndroid Build Coastguard Worker                            base::StringPiece force_discard_reason);
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   // Used to interact with the embedder. Weak pointer; must outlive |this|
129*6777b538SAndroid Build Coastguard Worker   // instance.
130*6777b538SAndroid Build Coastguard Worker   const raw_ptr<MetricsServiceClient> client_;
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   // Used to flush changes to disk after uploading a log. Weak pointer; must
133*6777b538SAndroid Build Coastguard Worker   // outlive |this| instance.
134*6777b538SAndroid Build Coastguard Worker   const raw_ptr<PrefService> local_state_;
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   // Largest log size to attempt to retransmit.
137*6777b538SAndroid Build Coastguard Worker   size_t max_retransmit_size_;
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker   // Event manager to notify observers of log events.
140*6777b538SAndroid Build Coastguard Worker   const raw_ptr<MetricsLogsEventManager> logs_event_manager_;
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker   // Indicate whether recording and reporting are currently happening.
143*6777b538SAndroid Build Coastguard Worker   // These should not be set directly, but by calling SetRecording and
144*6777b538SAndroid Build Coastguard Worker   // SetReporting.
145*6777b538SAndroid Build Coastguard Worker   bool reporting_active_;
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker   // Instance of the helper class for uploading logs.
148*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<MetricsLogUploader> log_uploader_;
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker   // Whether there is a current log upload in progress.
151*6777b538SAndroid Build Coastguard Worker   bool log_upload_in_progress_;
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker   // The scheduler for determining when uploads should happen.
154*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<MetricsUploadScheduler> upload_scheduler_;
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   // Pointer used for obtaining data use pref updater callback on above layers.
157*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<DataUseTracker> data_use_tracker_;
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   // The tick count of the last time log upload has been finished and null if no
160*6777b538SAndroid Build Coastguard Worker   // upload has been done yet.
161*6777b538SAndroid Build Coastguard Worker   base::TimeTicks last_upload_finish_time_;
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker   // Info on current reporting state to send along with reports.
164*6777b538SAndroid Build Coastguard Worker   ReportingInfo reporting_info_;
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
167*6777b538SAndroid Build Coastguard Worker   // Indicates whether the browser is currently in the foreground. Used to
168*6777b538SAndroid Build Coastguard Worker   // determine whether |local_state_| should be flushed immediately after
169*6777b538SAndroid Build Coastguard Worker   // uploading a log.
170*6777b538SAndroid Build Coastguard Worker   bool is_in_foreground_ = false;
171*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
172*6777b538SAndroid Build Coastguard Worker 
173*6777b538SAndroid Build Coastguard Worker   SEQUENCE_CHECKER(sequence_checker_);
174*6777b538SAndroid Build Coastguard Worker 
175*6777b538SAndroid Build Coastguard Worker   // Weak pointers factory used to post task on different threads. All weak
176*6777b538SAndroid Build Coastguard Worker   // pointers managed by this factory have the same lifetime as
177*6777b538SAndroid Build Coastguard Worker   // ReportingService.
178*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<ReportingService> self_ptr_factory_{this};
179*6777b538SAndroid Build Coastguard Worker };
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_METRICS_REPORTING_SERVICE_H_
184