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