1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 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 collects information about the user 6*6777b538SAndroid Build Coastguard Worker // experience in order to help improve future versions of the app. 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_METRICS_METRICS_SERVICE_H_ 9*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_METRICS_SERVICE_H_ 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include <map> 14*6777b538SAndroid Build Coastguard Worker #include <memory> 15*6777b538SAndroid Build Coastguard Worker #include <string> 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker #include "base/callback_list.h" 18*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h" 19*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h" 20*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 23*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial.h" 24*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_flattener.h" 25*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_snapshot_manager.h" 26*6777b538SAndroid Build Coastguard Worker #include "base/metrics/statistics_recorder.h" 27*6777b538SAndroid Build Coastguard Worker #include "base/metrics/user_metrics.h" 28*6777b538SAndroid Build Coastguard Worker #include "base/observer_list.h" 29*6777b538SAndroid Build Coastguard Worker #include "base/scoped_observation.h" 30*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 31*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 32*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 33*6777b538SAndroid Build Coastguard Worker #include "build/chromeos_buildflags.h" 34*6777b538SAndroid Build Coastguard Worker #include "components/metrics/delegating_provider.h" 35*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_log.h" 36*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_log_store.h" 37*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_logs_event_manager.h" 38*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_provider.h" 39*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_reporting_service.h" 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker class PrefService; 42*6777b538SAndroid Build Coastguard Worker class PrefRegistrySimple; 43*6777b538SAndroid Build Coastguard Worker FORWARD_DECLARE_TEST(ChromeMetricsServiceClientTest, 44*6777b538SAndroid Build Coastguard Worker TestRegisterMetricsServiceProviders); 45*6777b538SAndroid Build Coastguard Worker FORWARD_DECLARE_TEST(IOSChromeMetricsServiceClientTest, 46*6777b538SAndroid Build Coastguard Worker TestRegisterMetricsServiceProviders); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker namespace variations { 49*6777b538SAndroid Build Coastguard Worker class SyntheticTrialRegistry; 50*6777b538SAndroid Build Coastguard Worker } 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker namespace metrics { 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker class MetricsRotationScheduler; 55*6777b538SAndroid Build Coastguard Worker class MetricsServiceClient; 56*6777b538SAndroid Build Coastguard Worker class MetricsServiceObserver; 57*6777b538SAndroid Build Coastguard Worker class MetricsStateManager; 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // See metrics_service.cc for a detailed description. 60*6777b538SAndroid Build Coastguard Worker class MetricsService { 61*6777b538SAndroid Build Coastguard Worker public: 62*6777b538SAndroid Build Coastguard Worker // Creates the MetricsService with the given |state_manager|, |client|, and 63*6777b538SAndroid Build Coastguard Worker // |local_state|. Does not take ownership of the paramaters; instead stores 64*6777b538SAndroid Build Coastguard Worker // a weak pointer to each. Caller should ensure that the parameters are valid 65*6777b538SAndroid Build Coastguard Worker // for the lifetime of this class. 66*6777b538SAndroid Build Coastguard Worker MetricsService(MetricsStateManager* state_manager, 67*6777b538SAndroid Build Coastguard Worker MetricsServiceClient* client, 68*6777b538SAndroid Build Coastguard Worker PrefService* local_state); 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker MetricsService(const MetricsService&) = delete; 71*6777b538SAndroid Build Coastguard Worker MetricsService& operator=(const MetricsService&) = delete; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker virtual ~MetricsService(); 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker // Initializes metrics recording state. Updates various bookkeeping values in 76*6777b538SAndroid Build Coastguard Worker // prefs and sets up the scheduler. This is a separate function rather than 77*6777b538SAndroid Build Coastguard Worker // being done by the constructor so that field trials could be created before 78*6777b538SAndroid Build Coastguard Worker // this is run. 79*6777b538SAndroid Build Coastguard Worker void InitializeMetricsRecordingState(); 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker // Starts the metrics system, turning on recording and uploading of metrics. 82*6777b538SAndroid Build Coastguard Worker // Should be called when starting up with metrics enabled, or when metrics 83*6777b538SAndroid Build Coastguard Worker // are turned on. 84*6777b538SAndroid Build Coastguard Worker void Start(); 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker // Starts the metrics system in a special test-only mode. Metrics won't ever 87*6777b538SAndroid Build Coastguard Worker // be uploaded or persisted in this mode, but metrics will be recorded in 88*6777b538SAndroid Build Coastguard Worker // memory. 89*6777b538SAndroid Build Coastguard Worker void StartRecordingForTests(); 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker // Starts updating the "last live" browser timestamp. 92*6777b538SAndroid Build Coastguard Worker void StartUpdatingLastLiveTimestamp(); 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker // Shuts down the metrics system. Should be called at shutdown, or if metrics 95*6777b538SAndroid Build Coastguard Worker // are turned off. 96*6777b538SAndroid Build Coastguard Worker void Stop(); 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker // Enable/disable transmission of accumulated logs and crash reports (dumps). 99*6777b538SAndroid Build Coastguard Worker // Calling Start() automatically enables reporting, but sending is 100*6777b538SAndroid Build Coastguard Worker // asyncronous so this can be called immediately after Start() to prevent 101*6777b538SAndroid Build Coastguard Worker // any uploading. 102*6777b538SAndroid Build Coastguard Worker void EnableReporting(); 103*6777b538SAndroid Build Coastguard Worker void DisableReporting(); 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker // Returns the client ID for this client, or the empty string if metrics 106*6777b538SAndroid Build Coastguard Worker // recording is not currently running. 107*6777b538SAndroid Build Coastguard Worker std::string GetClientId() const; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker // Get the low entropy source values. 110*6777b538SAndroid Build Coastguard Worker int GetLowEntropySource(); 111*6777b538SAndroid Build Coastguard Worker int GetOldLowEntropySource(); 112*6777b538SAndroid Build Coastguard Worker int GetPseudoLowEntropySource(); 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker // Get the limited entropy randomization source. 115*6777b538SAndroid Build Coastguard Worker std::string_view GetLimitedEntropyRandomizationSource(); 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker // Set an external provided id for the metrics service. This method can be 118*6777b538SAndroid Build Coastguard Worker // set by a caller which wants to explicitly control the *next* id used by the 119*6777b538SAndroid Build Coastguard Worker // metrics service. Note that setting the external client id will *not* change 120*6777b538SAndroid Build Coastguard Worker // the current metrics client id. In order to change the current client id, 121*6777b538SAndroid Build Coastguard Worker // callers should call ResetClientId to change the current client id to the 122*6777b538SAndroid Build Coastguard Worker // provided id. 123*6777b538SAndroid Build Coastguard Worker void SetExternalClientId(const std::string& id); 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker // Returns the date at which the current metrics client ID was created as 126*6777b538SAndroid Build Coastguard Worker // an int64_t containing seconds since the epoch. 127*6777b538SAndroid Build Coastguard Worker int64_t GetMetricsReportingEnabledDate(); 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker // Returns true if the last session exited cleanly. 130*6777b538SAndroid Build Coastguard Worker bool WasLastShutdownClean() const; 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker // Registers local state prefs used by this class. 133*6777b538SAndroid Build Coastguard Worker static void RegisterPrefs(PrefRegistrySimple* registry); 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker // This should be called when the application is not idle, i.e. the user seems 136*6777b538SAndroid Build Coastguard Worker // to be interacting with the application. 137*6777b538SAndroid Build Coastguard Worker void OnApplicationNotIdle(); 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) 140*6777b538SAndroid Build Coastguard Worker // Called when the application is going into background mode. 141*6777b538SAndroid Build Coastguard Worker // If |keep_recording_in_background| is true, UMA is still recorded and 142*6777b538SAndroid Build Coastguard Worker // reported while in the background. 143*6777b538SAndroid Build Coastguard Worker void OnAppEnterBackground(bool keep_recording_in_background = false); 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker // Called when the application is coming out of background mode. 146*6777b538SAndroid Build Coastguard Worker void OnAppEnterForeground(bool force_open_new_log = false); 147*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker // Called when a document first starts loading. 150*6777b538SAndroid Build Coastguard Worker void OnPageLoadStarted(); 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker // Signals that the browser is shutting down cleanly. Intended to be called 153*6777b538SAndroid Build Coastguard Worker // during shutdown after critical shutdown tasks have completed. 154*6777b538SAndroid Build Coastguard Worker void LogCleanShutdown(); 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker bool recording_active() const; 157*6777b538SAndroid Build Coastguard Worker bool reporting_active() const; 158*6777b538SAndroid Build Coastguard Worker bool has_unsent_logs() const; 159*6777b538SAndroid Build Coastguard Worker 160*6777b538SAndroid Build Coastguard Worker bool IsMetricsReportingEnabled() const; 161*6777b538SAndroid Build Coastguard Worker 162*6777b538SAndroid Build Coastguard Worker // Register the specified |provider| to provide additional metrics into the 163*6777b538SAndroid Build Coastguard Worker // UMA log. Should be called during MetricsService initialization only. 164*6777b538SAndroid Build Coastguard Worker void RegisterMetricsProvider(std::unique_ptr<MetricsProvider> provider); 165*6777b538SAndroid Build Coastguard Worker 166*6777b538SAndroid Build Coastguard Worker // Check if this install was cloned or imaged from another machine. If a 167*6777b538SAndroid Build Coastguard Worker // clone is detected, reset the client id and low entropy source. This 168*6777b538SAndroid Build Coastguard Worker // should not be called more than once. 169*6777b538SAndroid Build Coastguard Worker void CheckForClonedInstall(); 170*6777b538SAndroid Build Coastguard Worker 171*6777b538SAndroid Build Coastguard Worker // Checks if the cloned install detector says that client ids should be reset. 172*6777b538SAndroid Build Coastguard Worker bool ShouldResetClientIdsOnClonedInstall(); 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard Worker // Clears the stability metrics that are saved in local state. 175*6777b538SAndroid Build Coastguard Worker void ClearSavedStabilityMetrics(); 176*6777b538SAndroid Build Coastguard Worker 177*6777b538SAndroid Build Coastguard Worker // Marks current histograms as reported by snapshotting them, without 178*6777b538SAndroid Build Coastguard Worker // actually saving the deltas. At a higher level, this is used to throw 179*6777b538SAndroid Build Coastguard Worker // away new histogram samples (since the last log) so that they will not 180*6777b538SAndroid Build Coastguard Worker // be included in the next log. 181*6777b538SAndroid Build Coastguard Worker void MarkCurrentHistogramsAsReported(); 182*6777b538SAndroid Build Coastguard Worker 183*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_ASH) 184*6777b538SAndroid Build Coastguard Worker // Binds a user log store to store unsent logs. This log store will be 185*6777b538SAndroid Build Coastguard Worker // fully managed by MetricsLogStore. This will no-op if another log store has 186*6777b538SAndroid Build Coastguard Worker // already been set. 187*6777b538SAndroid Build Coastguard Worker // 188*6777b538SAndroid Build Coastguard Worker // If this is called before initial logs are recorded, then histograms 189*6777b538SAndroid Build Coastguard Worker // recorded before user log store is set will be included with user histograms 190*6777b538SAndroid Build Coastguard Worker // when initial logs are recorded. 191*6777b538SAndroid Build Coastguard Worker // 192*6777b538SAndroid Build Coastguard Worker // If this is called after initial logs are recorded, then this will flush all 193*6777b538SAndroid Build Coastguard Worker // logs recorded before swapping to |user_log_store|. 194*6777b538SAndroid Build Coastguard Worker void SetUserLogStore(std::unique_ptr<UnsentLogStore> user_log_store); 195*6777b538SAndroid Build Coastguard Worker 196*6777b538SAndroid Build Coastguard Worker // Unbinds the user log store. If there was no user log store, then this does 197*6777b538SAndroid Build Coastguard Worker // nothing. 198*6777b538SAndroid Build Coastguard Worker // 199*6777b538SAndroid Build Coastguard Worker // If this is called before initial logs are recorded, then histograms and the 200*6777b538SAndroid Build Coastguard Worker // current log will be discarded. 201*6777b538SAndroid Build Coastguard Worker // 202*6777b538SAndroid Build Coastguard Worker // If called after initial logs are recorded, then this will flush all logs 203*6777b538SAndroid Build Coastguard Worker // before the user log store is unset. 204*6777b538SAndroid Build Coastguard Worker void UnsetUserLogStore(); 205*6777b538SAndroid Build Coastguard Worker 206*6777b538SAndroid Build Coastguard Worker // Returns true if a user log store has been bound. 207*6777b538SAndroid Build Coastguard Worker bool HasUserLogStore(); 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard Worker // Initializes per-user metrics collection. Logs recorded during a user 210*6777b538SAndroid Build Coastguard Worker // session will be stored within each user's directory and consent to send 211*6777b538SAndroid Build Coastguard Worker // these logs will be controlled by each user. Logs recorded before any user 212*6777b538SAndroid Build Coastguard Worker // logs in or during guest sessions (given device owner has consented) will be 213*6777b538SAndroid Build Coastguard Worker // stored in local_state. 214*6777b538SAndroid Build Coastguard Worker // 215*6777b538SAndroid Build Coastguard Worker // This is in its own function because the MetricsService is created very 216*6777b538SAndroid Build Coastguard Worker // early on and a user metrics service may have dependencies on services that 217*6777b538SAndroid Build Coastguard Worker // are created happen after MetricsService is initialized. 218*6777b538SAndroid Build Coastguard Worker void InitPerUserMetrics(); 219*6777b538SAndroid Build Coastguard Worker 220*6777b538SAndroid Build Coastguard Worker // Returns the current user metrics consent if it should be applied to 221*6777b538SAndroid Build Coastguard Worker // determine metrics reporting state. 222*6777b538SAndroid Build Coastguard Worker // 223*6777b538SAndroid Build Coastguard Worker // See comments at MetricsServiceClient::GetCurrentUserMetricsConsent() for 224*6777b538SAndroid Build Coastguard Worker // more details. 225*6777b538SAndroid Build Coastguard Worker std::optional<bool> GetCurrentUserMetricsConsent() const; 226*6777b538SAndroid Build Coastguard Worker 227*6777b538SAndroid Build Coastguard Worker // Returns the current logged in user id. See comments at 228*6777b538SAndroid Build Coastguard Worker // MetricsServiceClient::GetCurrentUserId() for more details. 229*6777b538SAndroid Build Coastguard Worker std::optional<std::string> GetCurrentUserId() const; 230*6777b538SAndroid Build Coastguard Worker 231*6777b538SAndroid Build Coastguard Worker // Updates the current user metrics consent. No-ops if no user has logged in. 232*6777b538SAndroid Build Coastguard Worker void UpdateCurrentUserMetricsConsent(bool user_metrics_consent); 233*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_CHROMEOS_ASH) 234*6777b538SAndroid Build Coastguard Worker 235*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS) 236*6777b538SAndroid Build Coastguard Worker // Forces the client ID to be reset and generates a new client ID. This will 237*6777b538SAndroid Build Coastguard Worker // be called when a user re-consents to metrics collection and the user had 238*6777b538SAndroid Build Coastguard Worker // consented in the past. 239*6777b538SAndroid Build Coastguard Worker // 240*6777b538SAndroid Build Coastguard Worker // This is to preserve the pseudo-anonymous identifier <client_id, user_id>. 241*6777b538SAndroid Build Coastguard Worker void ResetClientId(); 242*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_CHROMEOS) 243*6777b538SAndroid Build Coastguard Worker 244*6777b538SAndroid Build Coastguard Worker variations::SyntheticTrialRegistry* GetSyntheticTrialRegistry(); 245*6777b538SAndroid Build Coastguard Worker 246*6777b538SAndroid Build Coastguard Worker // Returns the delay before the init tasks (to asynchronously initialize 247*6777b538SAndroid Build Coastguard Worker // metrics providers) run. 248*6777b538SAndroid Build Coastguard Worker base::TimeDelta GetInitializationDelay(); 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Worker // Returns the delay before the task to update the "last alive timestamp" is 251*6777b538SAndroid Build Coastguard Worker // run. 252*6777b538SAndroid Build Coastguard Worker base::TimeDelta GetUpdateLastAliveTimestampDelay(); 253*6777b538SAndroid Build Coastguard Worker LogStoreForTest()254*6777b538SAndroid Build Coastguard Worker MetricsLogStore* LogStoreForTest() { 255*6777b538SAndroid Build Coastguard Worker return reporting_service_.metrics_log_store(); 256*6777b538SAndroid Build Coastguard Worker } 257*6777b538SAndroid Build Coastguard Worker 258*6777b538SAndroid Build Coastguard Worker // Test hook to safely stage the current log in the log store. 259*6777b538SAndroid Build Coastguard Worker bool StageCurrentLogForTest(); 260*6777b538SAndroid Build Coastguard Worker GetCurrentLogForTest()261*6777b538SAndroid Build Coastguard Worker MetricsLog* GetCurrentLogForTest() { return current_log_.get(); } 262*6777b538SAndroid Build Coastguard Worker GetDelegatingProviderForTesting()263*6777b538SAndroid Build Coastguard Worker DelegatingProvider* GetDelegatingProviderForTesting() { 264*6777b538SAndroid Build Coastguard Worker return &delegating_provider_; 265*6777b538SAndroid Build Coastguard Worker } 266*6777b538SAndroid Build Coastguard Worker 267*6777b538SAndroid Build Coastguard Worker // Adds/Removes a logs observer. Observers are notified when a log is newly 268*6777b538SAndroid Build Coastguard Worker // created and is now known by the metrics service. This may occur when 269*6777b538SAndroid Build Coastguard Worker // closing a log, or when loading a log from persistent storage. Observers are 270*6777b538SAndroid Build Coastguard Worker // also notified when an event occurs on the log (e.g., log is staged, 271*6777b538SAndroid Build Coastguard Worker // uploaded, etc.). See MetricsLogsEventManager::LogEvent for more details. 272*6777b538SAndroid Build Coastguard Worker void AddLogsObserver(MetricsLogsEventManager::Observer* observer); 273*6777b538SAndroid Build Coastguard Worker void RemoveLogsObserver(MetricsLogsEventManager::Observer* observer); 274*6777b538SAndroid Build Coastguard Worker logs_event_observer()275*6777b538SAndroid Build Coastguard Worker MetricsServiceObserver* logs_event_observer() { 276*6777b538SAndroid Build Coastguard Worker return logs_event_observer_.get(); 277*6777b538SAndroid Build Coastguard Worker } 278*6777b538SAndroid Build Coastguard Worker 279*6777b538SAndroid Build Coastguard Worker // Observers will be notified when the enablement state changes. The callback 280*6777b538SAndroid Build Coastguard Worker // should accept one boolean argument, which will signal whether or not the 281*6777b538SAndroid Build Coastguard Worker // metrics collection has been enabled. 282*6777b538SAndroid Build Coastguard Worker base::CallbackListSubscription AddEnablementObserver( 283*6777b538SAndroid Build Coastguard Worker const base::RepeatingCallback<void(bool)>& observer); 284*6777b538SAndroid Build Coastguard Worker 285*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) IsInForegroundForTesting()286*6777b538SAndroid Build Coastguard Worker bool IsInForegroundForTesting() const { return is_in_foreground_; } 287*6777b538SAndroid Build Coastguard Worker #endif 288*6777b538SAndroid Build Coastguard Worker 289*6777b538SAndroid Build Coastguard Worker // Creates a new MetricsLog instance with the given |log_type|. CreateLogForTesting(MetricsLog::LogType log_type)290*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLog> CreateLogForTesting( 291*6777b538SAndroid Build Coastguard Worker MetricsLog::LogType log_type) { 292*6777b538SAndroid Build Coastguard Worker return CreateLog(log_type); 293*6777b538SAndroid Build Coastguard Worker } 294*6777b538SAndroid Build Coastguard Worker 295*6777b538SAndroid Build Coastguard Worker protected: 296*6777b538SAndroid Build Coastguard Worker // Sets the persistent system profile. Virtual for tests. 297*6777b538SAndroid Build Coastguard Worker virtual void SetPersistentSystemProfile(const std::string& serialized_proto, 298*6777b538SAndroid Build Coastguard Worker bool complete); 299*6777b538SAndroid Build Coastguard Worker 300*6777b538SAndroid Build Coastguard Worker // Records the current environment (system profile) in |log|, and persists 301*6777b538SAndroid Build Coastguard Worker // the results in prefs. 302*6777b538SAndroid Build Coastguard Worker // Exposed for testing. 303*6777b538SAndroid Build Coastguard Worker static std::string RecordCurrentEnvironmentHelper( 304*6777b538SAndroid Build Coastguard Worker MetricsLog* log, 305*6777b538SAndroid Build Coastguard Worker PrefService* local_state, 306*6777b538SAndroid Build Coastguard Worker DelegatingProvider* delegating_provider); 307*6777b538SAndroid Build Coastguard Worker 308*6777b538SAndroid Build Coastguard Worker // The MetricsService has a lifecycle that is stored as a state. 309*6777b538SAndroid Build Coastguard Worker // See metrics_service.cc for description of this lifecycle. 310*6777b538SAndroid Build Coastguard Worker enum State { 311*6777b538SAndroid Build Coastguard Worker CONSTRUCTED, // Constructor was called. 312*6777b538SAndroid Build Coastguard Worker INITIALIZED, // InitializeMetricsRecordingState() was called. 313*6777b538SAndroid Build Coastguard Worker INIT_TASK_SCHEDULED, // Waiting for deferred init tasks to finish. 314*6777b538SAndroid Build Coastguard Worker INIT_TASK_DONE, // Waiting for timer to send initial log. 315*6777b538SAndroid Build Coastguard Worker SENDING_LOGS, // Sending logs and creating new ones when we run out. 316*6777b538SAndroid Build Coastguard Worker }; 317*6777b538SAndroid Build Coastguard Worker state()318*6777b538SAndroid Build Coastguard Worker State state() const { return state_; } 319*6777b538SAndroid Build Coastguard Worker 320*6777b538SAndroid Build Coastguard Worker private: 321*6777b538SAndroid Build Coastguard Worker // The current state of recording for the MetricsService. The state is UNSET 322*6777b538SAndroid Build Coastguard Worker // until set to something else, at which point it remains INACTIVE or ACTIVE 323*6777b538SAndroid Build Coastguard Worker // for the lifetime of the object. 324*6777b538SAndroid Build Coastguard Worker enum RecordingState { 325*6777b538SAndroid Build Coastguard Worker INACTIVE, 326*6777b538SAndroid Build Coastguard Worker ACTIVE, 327*6777b538SAndroid Build Coastguard Worker UNSET, 328*6777b538SAndroid Build Coastguard Worker }; 329*6777b538SAndroid Build Coastguard Worker 330*6777b538SAndroid Build Coastguard Worker // The result of a call to FinalizeLog(). 331*6777b538SAndroid Build Coastguard Worker struct FinalizedLog { 332*6777b538SAndroid Build Coastguard Worker FinalizedLog(); 333*6777b538SAndroid Build Coastguard Worker ~FinalizedLog(); 334*6777b538SAndroid Build Coastguard Worker 335*6777b538SAndroid Build Coastguard Worker // This type is move only. 336*6777b538SAndroid Build Coastguard Worker FinalizedLog(FinalizedLog&& other); 337*6777b538SAndroid Build Coastguard Worker FinalizedLog& operator=(FinalizedLog&& other); 338*6777b538SAndroid Build Coastguard Worker 339*6777b538SAndroid Build Coastguard Worker // The size of the uncompressed log data. This is only used for calculating 340*6777b538SAndroid Build Coastguard Worker // some metrics. 341*6777b538SAndroid Build Coastguard Worker size_t uncompressed_log_size; 342*6777b538SAndroid Build Coastguard Worker 343*6777b538SAndroid Build Coastguard Worker // A LogInfo object representing the log, which contains its compressed 344*6777b538SAndroid Build Coastguard Worker // data, hash, signature, timestamp, and some metadata. 345*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnsentLogStore::LogInfo> log_info; 346*6777b538SAndroid Build Coastguard Worker }; 347*6777b538SAndroid Build Coastguard Worker 348*6777b538SAndroid Build Coastguard Worker // Writes snapshots of histograms owned by the StatisticsRecorder to a log. 349*6777b538SAndroid Build Coastguard Worker // Does not take ownership of the log. 350*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/40897621): Although this class takes in |required_flags| in 351*6777b538SAndroid Build Coastguard Worker // its constructor to filter the StatisticsRecorder histograms being put into 352*6777b538SAndroid Build Coastguard Worker // the log, the |histogram_snapshot_manager_| is not aware of this. So if 353*6777b538SAndroid Build Coastguard Worker // the |histogram_snapshot_manager_| is passed to some other caller, this 354*6777b538SAndroid Build Coastguard Worker // caller will need to manually filter the histograms. Re-factor the code so 355*6777b538SAndroid Build Coastguard Worker // that this is not needed. 356*6777b538SAndroid Build Coastguard Worker class MetricsLogHistogramWriter { 357*6777b538SAndroid Build Coastguard Worker public: 358*6777b538SAndroid Build Coastguard Worker explicit MetricsLogHistogramWriter(MetricsLog* log); 359*6777b538SAndroid Build Coastguard Worker 360*6777b538SAndroid Build Coastguard Worker MetricsLogHistogramWriter(MetricsLog* log, 361*6777b538SAndroid Build Coastguard Worker base::HistogramBase::Flags required_flags); 362*6777b538SAndroid Build Coastguard Worker 363*6777b538SAndroid Build Coastguard Worker MetricsLogHistogramWriter(const MetricsLogHistogramWriter&) = delete; 364*6777b538SAndroid Build Coastguard Worker MetricsLogHistogramWriter& operator=(const MetricsLogHistogramWriter&) = 365*6777b538SAndroid Build Coastguard Worker delete; 366*6777b538SAndroid Build Coastguard Worker 367*6777b538SAndroid Build Coastguard Worker ~MetricsLogHistogramWriter(); 368*6777b538SAndroid Build Coastguard Worker 369*6777b538SAndroid Build Coastguard Worker // Snapshots the deltas of histograms known by the StatisticsRecorder and 370*6777b538SAndroid Build Coastguard Worker // writes them to the log passed in the constructor. This also marks the 371*6777b538SAndroid Build Coastguard Worker // samples (the deltas) as logged. 372*6777b538SAndroid Build Coastguard Worker void SnapshotStatisticsRecorderDeltas(); 373*6777b538SAndroid Build Coastguard Worker 374*6777b538SAndroid Build Coastguard Worker // Snapshots the unlogged samples of histograms known by the 375*6777b538SAndroid Build Coastguard Worker // StatisticsRecorder and writes them to the log passed in the constructor. 376*6777b538SAndroid Build Coastguard Worker // Note that unlike SnapshotStatisticsRecorderDeltas(), this does not mark 377*6777b538SAndroid Build Coastguard Worker // the samples as logged. To do so, a call to MarkUnloggedSamplesAsLogged() 378*6777b538SAndroid Build Coastguard Worker // (in |histogram_snapshot_manager_|) should be made. 379*6777b538SAndroid Build Coastguard Worker void SnapshotStatisticsRecorderUnloggedSamples(); 380*6777b538SAndroid Build Coastguard Worker histogram_snapshot_manager()381*6777b538SAndroid Build Coastguard Worker base::HistogramSnapshotManager* histogram_snapshot_manager() { 382*6777b538SAndroid Build Coastguard Worker return histogram_snapshot_manager_.get(); 383*6777b538SAndroid Build Coastguard Worker } 384*6777b538SAndroid Build Coastguard Worker snapshot_transaction_id()385*6777b538SAndroid Build Coastguard Worker base::StatisticsRecorder::SnapshotTransactionId snapshot_transaction_id() { 386*6777b538SAndroid Build Coastguard Worker return snapshot_transaction_id_; 387*6777b538SAndroid Build Coastguard Worker } 388*6777b538SAndroid Build Coastguard Worker 389*6777b538SAndroid Build Coastguard Worker private: 390*6777b538SAndroid Build Coastguard Worker // Used to select which histograms to record when calling 391*6777b538SAndroid Build Coastguard Worker // SnapshotStatisticsRecorderHistograms() or 392*6777b538SAndroid Build Coastguard Worker // SnapshotStatisticsRecorderUnloggedSamples(). 393*6777b538SAndroid Build Coastguard Worker const base::HistogramBase::Flags required_flags_; 394*6777b538SAndroid Build Coastguard Worker 395*6777b538SAndroid Build Coastguard Worker // Used to write histograms to the log passed in the constructor. 396*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::HistogramFlattener> flattener_; 397*6777b538SAndroid Build Coastguard Worker 398*6777b538SAndroid Build Coastguard Worker // Used to snapshot histograms. 399*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::HistogramSnapshotManager> histogram_snapshot_manager_; 400*6777b538SAndroid Build Coastguard Worker 401*6777b538SAndroid Build Coastguard Worker // The snapshot transaction ID of a call to either 402*6777b538SAndroid Build Coastguard Worker // SnapshotStatisticsRecorderDeltas() or 403*6777b538SAndroid Build Coastguard Worker // SnapshotStatisticsRecorderUnloggedSamples(). 404*6777b538SAndroid Build Coastguard Worker base::StatisticsRecorder::SnapshotTransactionId snapshot_transaction_id_; 405*6777b538SAndroid Build Coastguard Worker }; 406*6777b538SAndroid Build Coastguard Worker 407*6777b538SAndroid Build Coastguard Worker // Loads "independent" metrics from a metrics provider and executes a 408*6777b538SAndroid Build Coastguard Worker // callback when complete, which could be immediate or after some 409*6777b538SAndroid Build Coastguard Worker // execution on a background thread. 410*6777b538SAndroid Build Coastguard Worker class IndependentMetricsLoader { 411*6777b538SAndroid Build Coastguard Worker public: 412*6777b538SAndroid Build Coastguard Worker explicit IndependentMetricsLoader(std::unique_ptr<MetricsLog> log, 413*6777b538SAndroid Build Coastguard Worker std::string app_version, 414*6777b538SAndroid Build Coastguard Worker std::string signing_key); 415*6777b538SAndroid Build Coastguard Worker 416*6777b538SAndroid Build Coastguard Worker IndependentMetricsLoader(const IndependentMetricsLoader&) = delete; 417*6777b538SAndroid Build Coastguard Worker IndependentMetricsLoader& operator=(const IndependentMetricsLoader&) = 418*6777b538SAndroid Build Coastguard Worker delete; 419*6777b538SAndroid Build Coastguard Worker 420*6777b538SAndroid Build Coastguard Worker ~IndependentMetricsLoader(); 421*6777b538SAndroid Build Coastguard Worker 422*6777b538SAndroid Build Coastguard Worker // Call ProvideIndependentMetrics (which may execute on a background thread) 423*6777b538SAndroid Build Coastguard Worker // for the |metrics_provider| and execute the |done_callback| when complete 424*6777b538SAndroid Build Coastguard Worker // with the result (true if successful). |done_callback| must own |this|. 425*6777b538SAndroid Build Coastguard Worker void Run(base::OnceCallback<void(bool)> done_callback, 426*6777b538SAndroid Build Coastguard Worker MetricsProvider* metrics_provider); 427*6777b538SAndroid Build Coastguard Worker 428*6777b538SAndroid Build Coastguard Worker // Finalizes/serializes |log_|, and stores the result in |finalized_log_|. 429*6777b538SAndroid Build Coastguard Worker // Should only be called once, after |log_| has been filled. 430*6777b538SAndroid Build Coastguard Worker void FinalizeLog(); 431*6777b538SAndroid Build Coastguard Worker 432*6777b538SAndroid Build Coastguard Worker // Returns whether FinalizeLog() was called. 433*6777b538SAndroid Build Coastguard Worker bool HasFinalizedLog(); 434*6777b538SAndroid Build Coastguard Worker 435*6777b538SAndroid Build Coastguard Worker // Extracts |finalized_log_|. Should be only called once, after 436*6777b538SAndroid Build Coastguard Worker // FinalizeLog() has been called. No more operations should be done after 437*6777b538SAndroid Build Coastguard Worker // this. 438*6777b538SAndroid Build Coastguard Worker FinalizedLog ReleaseFinalizedLog(); 439*6777b538SAndroid Build Coastguard Worker 440*6777b538SAndroid Build Coastguard Worker private: 441*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLog> log_; 442*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::HistogramFlattener> flattener_; 443*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::HistogramSnapshotManager> snapshot_manager_; 444*6777b538SAndroid Build Coastguard Worker bool run_called_ = false; 445*6777b538SAndroid Build Coastguard Worker 446*6777b538SAndroid Build Coastguard Worker // Used for finalizing |log_| in FinalizeLog(). 447*6777b538SAndroid Build Coastguard Worker const std::string app_version_; 448*6777b538SAndroid Build Coastguard Worker const std::string signing_key_; 449*6777b538SAndroid Build Coastguard Worker 450*6777b538SAndroid Build Coastguard Worker // Stores the result of FinalizeLog(). 451*6777b538SAndroid Build Coastguard Worker FinalizedLog finalized_log_; 452*6777b538SAndroid Build Coastguard Worker bool finalize_log_called_ = false; 453*6777b538SAndroid Build Coastguard Worker bool release_finalized_log_called_ = false; 454*6777b538SAndroid Build Coastguard Worker }; 455*6777b538SAndroid Build Coastguard Worker 456*6777b538SAndroid Build Coastguard Worker // Gets the LogStore for UMA logs. log_store()457*6777b538SAndroid Build Coastguard Worker MetricsLogStore* log_store() { 458*6777b538SAndroid Build Coastguard Worker return reporting_service_.metrics_log_store(); 459*6777b538SAndroid Build Coastguard Worker } 460*6777b538SAndroid Build Coastguard Worker 461*6777b538SAndroid Build Coastguard Worker // Calls into the client to initialize some system profile metrics. 462*6777b538SAndroid Build Coastguard Worker void StartInitTask(); 463*6777b538SAndroid Build Coastguard Worker 464*6777b538SAndroid Build Coastguard Worker // Callback that moves the state to INIT_TASK_DONE. When this is called, the 465*6777b538SAndroid Build Coastguard Worker // state should be INIT_TASK_SCHEDULED. 466*6777b538SAndroid Build Coastguard Worker void FinishedInitTask(); 467*6777b538SAndroid Build Coastguard Worker 468*6777b538SAndroid Build Coastguard Worker void OnUserAction(const std::string& action, base::TimeTicks action_time); 469*6777b538SAndroid Build Coastguard Worker 470*6777b538SAndroid Build Coastguard Worker // Get the amount of uptime since this process started and since the last 471*6777b538SAndroid Build Coastguard Worker // call to this function. Also updates the cumulative uptime metric (stored 472*6777b538SAndroid Build Coastguard Worker // as a pref) for uninstall. Uptimes are measured using TimeTicks, which 473*6777b538SAndroid Build Coastguard Worker // guarantees that it is monotonic and does not jump if the user changes 474*6777b538SAndroid Build Coastguard Worker // their clock. The TimeTicks implementation also makes the clock not 475*6777b538SAndroid Build Coastguard Worker // count time the computer is suspended. 476*6777b538SAndroid Build Coastguard Worker void GetUptimes(PrefService* pref, 477*6777b538SAndroid Build Coastguard Worker base::TimeDelta* incremental_uptime, 478*6777b538SAndroid Build Coastguard Worker base::TimeDelta* uptime); 479*6777b538SAndroid Build Coastguard Worker 480*6777b538SAndroid Build Coastguard Worker // Turns recording on or off. 481*6777b538SAndroid Build Coastguard Worker // DisableRecording() also forces a persistent save of logging state (if 482*6777b538SAndroid Build Coastguard Worker // anything has been recorded, or transmitted). 483*6777b538SAndroid Build Coastguard Worker void EnableRecording(); 484*6777b538SAndroid Build Coastguard Worker void DisableRecording(); 485*6777b538SAndroid Build Coastguard Worker 486*6777b538SAndroid Build Coastguard Worker // If in_idle is true, sets idle_since_last_transmission to true. 487*6777b538SAndroid Build Coastguard Worker // If in_idle is false and idle_since_last_transmission_ is true, sets 488*6777b538SAndroid Build Coastguard Worker // idle_since_last_transmission to false and starts the timer (provided 489*6777b538SAndroid Build Coastguard Worker // starting the timer is permitted). 490*6777b538SAndroid Build Coastguard Worker void HandleIdleSinceLastTransmission(bool in_idle); 491*6777b538SAndroid Build Coastguard Worker 492*6777b538SAndroid Build Coastguard Worker // Set up client ID, session ID, etc. 493*6777b538SAndroid Build Coastguard Worker void InitializeMetricsState(); 494*6777b538SAndroid Build Coastguard Worker 495*6777b538SAndroid Build Coastguard Worker // Opens a new log for recording user experience metrics. If |call_providers| 496*6777b538SAndroid Build Coastguard Worker // is true, OnDidCreateMetricsLog() of providers will be called right after 497*6777b538SAndroid Build Coastguard Worker // opening the new log. 498*6777b538SAndroid Build Coastguard Worker void OpenNewLog(bool call_providers = true); 499*6777b538SAndroid Build Coastguard Worker 500*6777b538SAndroid Build Coastguard Worker // Closes out the current log after adding any last information. |async| 501*6777b538SAndroid Build Coastguard Worker // determines whether finalizing the log will be done in a background thread. 502*6777b538SAndroid Build Coastguard Worker // |log_stored_callback| will be run (on the main thread) after the finalized 503*6777b538SAndroid Build Coastguard Worker // log is stored. Note that when |async| is true, the closed log could end up 504*6777b538SAndroid Build Coastguard Worker // not being stored (see MaybeCleanUpAndStoreFinalizedLog()). Regardless, 505*6777b538SAndroid Build Coastguard Worker // |log_stored_callback| is still run. Note that currently, there is only 506*6777b538SAndroid Build Coastguard Worker // support to close one log asynchronously at a time (this should be enforced 507*6777b538SAndroid Build Coastguard Worker // by the caller). 508*6777b538SAndroid Build Coastguard Worker void CloseCurrentLog( 509*6777b538SAndroid Build Coastguard Worker bool async, 510*6777b538SAndroid Build Coastguard Worker MetricsLogsEventManager::CreateReason reason, 511*6777b538SAndroid Build Coastguard Worker base::OnceClosure log_stored_callback = base::DoNothing()); 512*6777b538SAndroid Build Coastguard Worker 513*6777b538SAndroid Build Coastguard Worker // Stores the |finalized_log| in |log_store()|. 514*6777b538SAndroid Build Coastguard Worker void StoreFinalizedLog(MetricsLog::LogType log_type, 515*6777b538SAndroid Build Coastguard Worker MetricsLogsEventManager::CreateReason reason, 516*6777b538SAndroid Build Coastguard Worker base::OnceClosure done_callback, 517*6777b538SAndroid Build Coastguard Worker FinalizedLog finalized_log); 518*6777b538SAndroid Build Coastguard Worker 519*6777b538SAndroid Build Coastguard Worker // Calls MarkUnloggedSamplesAsLogged() on |log_histogram_writer| and stores 520*6777b538SAndroid Build Coastguard Worker // the |finalized_log| (see StoreFinalizedLog()), but only if the 521*6777b538SAndroid Build Coastguard Worker // StatisticRecorder's last transaction ID is the same as the one from 522*6777b538SAndroid Build Coastguard Worker // |log_histogram_writer| at the time of calling. See comments in the 523*6777b538SAndroid Build Coastguard Worker // implementation for more details. 524*6777b538SAndroid Build Coastguard Worker void MaybeCleanUpAndStoreFinalizedLog( 525*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLogHistogramWriter> log_histogram_writer, 526*6777b538SAndroid Build Coastguard Worker MetricsLog::LogType log_type, 527*6777b538SAndroid Build Coastguard Worker MetricsLogsEventManager::CreateReason reason, 528*6777b538SAndroid Build Coastguard Worker base::OnceClosure done_callback, 529*6777b538SAndroid Build Coastguard Worker FinalizedLog finalized_log); 530*6777b538SAndroid Build Coastguard Worker 531*6777b538SAndroid Build Coastguard Worker // Pushes the text of the current and staged logs into persistent storage. 532*6777b538SAndroid Build Coastguard Worker void PushPendingLogsToPersistentStorage( 533*6777b538SAndroid Build Coastguard Worker MetricsLogsEventManager::CreateReason reason); 534*6777b538SAndroid Build Coastguard Worker 535*6777b538SAndroid Build Coastguard Worker // Ensures that scheduler is running, assuming the current settings are such 536*6777b538SAndroid Build Coastguard Worker // that metrics should be reported. If not, this is a no-op. 537*6777b538SAndroid Build Coastguard Worker void StartSchedulerIfNecessary(); 538*6777b538SAndroid Build Coastguard Worker 539*6777b538SAndroid Build Coastguard Worker // Starts the process of uploading metrics data. 540*6777b538SAndroid Build Coastguard Worker void StartScheduledUpload(); 541*6777b538SAndroid Build Coastguard Worker 542*6777b538SAndroid Build Coastguard Worker // Called by the client via a callback when final log info collection is 543*6777b538SAndroid Build Coastguard Worker // complete. 544*6777b538SAndroid Build Coastguard Worker void OnFinalLogInfoCollectionDone(); 545*6777b538SAndroid Build Coastguard Worker 546*6777b538SAndroid Build Coastguard Worker // Called via a callback after a periodic ongoing log (created through the 547*6777b538SAndroid Build Coastguard Worker // MetricsRotationScheduler) was stored in |log_store()|. 548*6777b538SAndroid Build Coastguard Worker void OnAsyncPeriodicOngoingLogStored(); 549*6777b538SAndroid Build Coastguard Worker 550*6777b538SAndroid Build Coastguard Worker // Prepares the initial stability log, which is only logged when the previous 551*6777b538SAndroid Build Coastguard Worker // run of Chrome crashed. This log contains any stability metrics left over 552*6777b538SAndroid Build Coastguard Worker // from that previous run, and only these stability metrics. It uses the 553*6777b538SAndroid Build Coastguard Worker // system profile from the previous session. |prefs_previous_version| is used 554*6777b538SAndroid Build Coastguard Worker // to validate the version number recovered from the system profile. Returns 555*6777b538SAndroid Build Coastguard Worker // true if a log was created. 556*6777b538SAndroid Build Coastguard Worker bool PrepareInitialStabilityLog(const std::string& prefs_previous_version); 557*6777b538SAndroid Build Coastguard Worker 558*6777b538SAndroid Build Coastguard Worker // Creates a new MetricsLog instance with the given |log_type|. 559*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLog> CreateLog(MetricsLog::LogType log_type); 560*6777b538SAndroid Build Coastguard Worker 561*6777b538SAndroid Build Coastguard Worker // Records the current environment (system profile) in |log|, and persists 562*6777b538SAndroid Build Coastguard Worker // the results in prefs and GlobalPersistentSystemProfile. 563*6777b538SAndroid Build Coastguard Worker void RecordCurrentEnvironment(MetricsLog* log, bool complete); 564*6777b538SAndroid Build Coastguard Worker 565*6777b538SAndroid Build Coastguard Worker // Handle completion of PrepareProviderMetricsLog which is run as a 566*6777b538SAndroid Build Coastguard Worker // background task. 567*6777b538SAndroid Build Coastguard Worker void PrepareProviderMetricsLogDone( 568*6777b538SAndroid Build Coastguard Worker std::unique_ptr<IndependentMetricsLoader> loader, 569*6777b538SAndroid Build Coastguard Worker bool success); 570*6777b538SAndroid Build Coastguard Worker 571*6777b538SAndroid Build Coastguard Worker // Record a single independent profile and associated histogram from 572*6777b538SAndroid Build Coastguard Worker // metrics providers. If this returns true, one was found and there may 573*6777b538SAndroid Build Coastguard Worker // be more. 574*6777b538SAndroid Build Coastguard Worker bool PrepareProviderMetricsLog(); 575*6777b538SAndroid Build Coastguard Worker 576*6777b538SAndroid Build Coastguard Worker // Records one independent histogram log and then reschedules itself to 577*6777b538SAndroid Build Coastguard Worker // check for others. The interval is so as to not adversely impact the UI. 578*6777b538SAndroid Build Coastguard Worker void PrepareProviderMetricsTask(); 579*6777b538SAndroid Build Coastguard Worker 580*6777b538SAndroid Build Coastguard Worker // Updates the "last live" browser timestamp and schedules the next update. 581*6777b538SAndroid Build Coastguard Worker void UpdateLastLiveTimestampTask(); 582*6777b538SAndroid Build Coastguard Worker 583*6777b538SAndroid Build Coastguard Worker // Returns whether it is too early to close a log. 584*6777b538SAndroid Build Coastguard Worker bool IsTooEarlyToCloseLog(); 585*6777b538SAndroid Build Coastguard Worker 586*6777b538SAndroid Build Coastguard Worker // Called if this install is detected as cloned. 587*6777b538SAndroid Build Coastguard Worker void OnClonedInstallDetected(); 588*6777b538SAndroid Build Coastguard Worker 589*6777b538SAndroid Build Coastguard Worker // Snapshots histogram deltas using the passed |log_histogram_writer| and then 590*6777b538SAndroid Build Coastguard Worker // finalizes |log| by calling FinalizeLog(). |log|, |current_app_version| and 591*6777b538SAndroid Build Coastguard Worker // |signing_key| are used to finalize the log (see FinalizeLog()). 592*6777b538SAndroid Build Coastguard Worker // Semantically, this is equivalent to SnapshotUnloggedSamplesAndFinalizeLog() 593*6777b538SAndroid Build Coastguard Worker // followed by MarkUnloggedSamplesAsLogged(). 594*6777b538SAndroid Build Coastguard Worker static FinalizedLog SnapshotDeltasAndFinalizeLog( 595*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLogHistogramWriter> log_histogram_writer, 596*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLog> log, 597*6777b538SAndroid Build Coastguard Worker bool truncate_events, 598*6777b538SAndroid Build Coastguard Worker std::optional<ChromeUserMetricsExtension::RealLocalTime> close_time, 599*6777b538SAndroid Build Coastguard Worker std::string&& current_app_version, 600*6777b538SAndroid Build Coastguard Worker std::string&& signing_key); 601*6777b538SAndroid Build Coastguard Worker 602*6777b538SAndroid Build Coastguard Worker // Snapshots unlogged histogram samples using the passed 603*6777b538SAndroid Build Coastguard Worker // |log_histogram_writer| and then finalizes |log| by calling FinalizeLog(). 604*6777b538SAndroid Build Coastguard Worker // |log|, |current_app_version| and |signing_key| are used to finalize the log 605*6777b538SAndroid Build Coastguard Worker // (see FinalizeLog()). Note that unlike SnapshotDeltasAndFinalizeLog(), this 606*6777b538SAndroid Build Coastguard Worker // does not own the passed |log_histogram_writer|, because it should be 607*6777b538SAndroid Build Coastguard Worker // available to eventually mark the unlogged samples as logged. 608*6777b538SAndroid Build Coastguard Worker static FinalizedLog SnapshotUnloggedSamplesAndFinalizeLog( 609*6777b538SAndroid Build Coastguard Worker MetricsLogHistogramWriter* log_histogram_writer, 610*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLog> log, 611*6777b538SAndroid Build Coastguard Worker bool truncate_events, 612*6777b538SAndroid Build Coastguard Worker std::optional<ChromeUserMetricsExtension::RealLocalTime> close_time, 613*6777b538SAndroid Build Coastguard Worker std::string&& current_app_version, 614*6777b538SAndroid Build Coastguard Worker std::string&& signing_key); 615*6777b538SAndroid Build Coastguard Worker 616*6777b538SAndroid Build Coastguard Worker // Finalizes |log| (see MetricsLog::FinalizeLog()). The |signing_key| is used 617*6777b538SAndroid Build Coastguard Worker // to compute a signature for the log. 618*6777b538SAndroid Build Coastguard Worker static FinalizedLog FinalizeLog( 619*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLog> log, 620*6777b538SAndroid Build Coastguard Worker bool truncate_events, 621*6777b538SAndroid Build Coastguard Worker std::optional<ChromeUserMetricsExtension::RealLocalTime> close_time, 622*6777b538SAndroid Build Coastguard Worker const std::string& current_app_version, 623*6777b538SAndroid Build Coastguard Worker const std::string& signing_key); 624*6777b538SAndroid Build Coastguard Worker 625*6777b538SAndroid Build Coastguard Worker // Sub-service for uploading logs. 626*6777b538SAndroid Build Coastguard Worker MetricsReportingService reporting_service_; 627*6777b538SAndroid Build Coastguard Worker 628*6777b538SAndroid Build Coastguard Worker // The log that we are still appending to. 629*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsLog> current_log_; 630*6777b538SAndroid Build Coastguard Worker 631*6777b538SAndroid Build Coastguard Worker // Used to manage various metrics reporting state prefs, such as client id, 632*6777b538SAndroid Build Coastguard Worker // low entropy source and whether metrics reporting is enabled. Weak pointer. 633*6777b538SAndroid Build Coastguard Worker const raw_ptr<MetricsStateManager> state_manager_; 634*6777b538SAndroid Build Coastguard Worker 635*6777b538SAndroid Build Coastguard Worker // Used to interact with the embedder. Weak pointer; must outlive |this| 636*6777b538SAndroid Build Coastguard Worker // instance. 637*6777b538SAndroid Build Coastguard Worker const raw_ptr<MetricsServiceClient> client_; 638*6777b538SAndroid Build Coastguard Worker 639*6777b538SAndroid Build Coastguard Worker // Registered metrics providers. 640*6777b538SAndroid Build Coastguard Worker DelegatingProvider delegating_provider_; 641*6777b538SAndroid Build Coastguard Worker 642*6777b538SAndroid Build Coastguard Worker raw_ptr<PrefService> local_state_; 643*6777b538SAndroid Build Coastguard Worker 644*6777b538SAndroid Build Coastguard Worker base::ActionCallback action_callback_; 645*6777b538SAndroid Build Coastguard Worker 646*6777b538SAndroid Build Coastguard Worker // Indicate whether recording and reporting are currently happening. 647*6777b538SAndroid Build Coastguard Worker // These should not be set directly, but by calling SetRecording and 648*6777b538SAndroid Build Coastguard Worker // SetReporting. 649*6777b538SAndroid Build Coastguard Worker RecordingState recording_state_; 650*6777b538SAndroid Build Coastguard Worker 651*6777b538SAndroid Build Coastguard Worker // Indicate whether test mode is enabled, where the initial log should never 652*6777b538SAndroid Build Coastguard Worker // be cut, and logs are neither persisted nor uploaded. 653*6777b538SAndroid Build Coastguard Worker bool test_mode_active_; 654*6777b538SAndroid Build Coastguard Worker 655*6777b538SAndroid Build Coastguard Worker // The progression of states made by the browser are recorded in the following 656*6777b538SAndroid Build Coastguard Worker // state. 657*6777b538SAndroid Build Coastguard Worker State state_; 658*6777b538SAndroid Build Coastguard Worker 659*6777b538SAndroid Build Coastguard Worker // Whether the MetricsService object has received any notifications since 660*6777b538SAndroid Build Coastguard Worker // the last time a transmission was sent. 661*6777b538SAndroid Build Coastguard Worker bool idle_since_last_transmission_; 662*6777b538SAndroid Build Coastguard Worker 663*6777b538SAndroid Build Coastguard Worker // A number that identifies the how many times the app has been launched. 664*6777b538SAndroid Build Coastguard Worker int session_id_; 665*6777b538SAndroid Build Coastguard Worker 666*6777b538SAndroid Build Coastguard Worker // The scheduler for determining when log rotations should happen. 667*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsRotationScheduler> rotation_scheduler_; 668*6777b538SAndroid Build Coastguard Worker 669*6777b538SAndroid Build Coastguard Worker // Stores the time of the first call to |GetUptimes()|. 670*6777b538SAndroid Build Coastguard Worker base::TimeTicks first_updated_time_; 671*6777b538SAndroid Build Coastguard Worker 672*6777b538SAndroid Build Coastguard Worker // Stores the time of the last call to |GetUptimes()|. 673*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_updated_time_; 674*6777b538SAndroid Build Coastguard Worker 675*6777b538SAndroid Build Coastguard Worker // Indicates if loading of independent metrics is currently active. 676*6777b538SAndroid Build Coastguard Worker bool independent_loader_active_ = false; 677*6777b538SAndroid Build Coastguard Worker 678*6777b538SAndroid Build Coastguard Worker // Indicates whether or not there is currently a periodic ongoing log being 679*6777b538SAndroid Build Coastguard Worker // finalized (or is scheduled to be finalized). 680*6777b538SAndroid Build Coastguard Worker bool pending_ongoing_log_ = false; 681*6777b538SAndroid Build Coastguard Worker 682*6777b538SAndroid Build Coastguard Worker // Stores the time when we last posted a task to finalize a periodic ongoing 683*6777b538SAndroid Build Coastguard Worker // log asynchronously. 684*6777b538SAndroid Build Coastguard Worker base::TimeTicks async_ongoing_log_posted_time_; 685*6777b538SAndroid Build Coastguard Worker 686*6777b538SAndroid Build Coastguard Worker // Logs event manager to keep track of the various logs that the metrics 687*6777b538SAndroid Build Coastguard Worker // service interacts with. An unowned pointer of this instance is passed down 688*6777b538SAndroid Build Coastguard Worker // to various objects that are owned by this class. 689*6777b538SAndroid Build Coastguard Worker MetricsLogsEventManager logs_event_manager_; 690*6777b538SAndroid Build Coastguard Worker 691*6777b538SAndroid Build Coastguard Worker // An observer that observes all events notified through |logs_event_manager_| 692*6777b538SAndroid Build Coastguard Worker // since the creation of this MetricsService instance. This is only created 693*6777b538SAndroid Build Coastguard Worker // if this is a debug build, or the |kExportUmaLogsToFile| command line flag 694*6777b538SAndroid Build Coastguard Worker // is passed. This is primarily used by the chrome://metrics-internals debug 695*6777b538SAndroid Build Coastguard Worker // page. 696*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsServiceObserver> logs_event_observer_; 697*6777b538SAndroid Build Coastguard Worker 698*6777b538SAndroid Build Coastguard Worker // A set of observers that keeps track of the metrics reporting state. 699*6777b538SAndroid Build Coastguard Worker base::RepeatingCallbackList<void(bool)> enablement_observers_; 700*6777b538SAndroid Build Coastguard Worker 701*6777b538SAndroid Build Coastguard Worker // Subscription for a callback that runs if this install is detected as 702*6777b538SAndroid Build Coastguard Worker // cloned. 703*6777b538SAndroid Build Coastguard Worker base::CallbackListSubscription cloned_install_subscription_; 704*6777b538SAndroid Build Coastguard Worker 705*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) 706*6777b538SAndroid Build Coastguard Worker // Indicates whether OnAppEnterForeground() (true) or OnAppEnterBackground 707*6777b538SAndroid Build Coastguard Worker // (false) was called. 708*6777b538SAndroid Build Coastguard Worker bool is_in_foreground_ = false; 709*6777b538SAndroid Build Coastguard Worker #endif 710*6777b538SAndroid Build Coastguard Worker 711*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, ActiveFieldTrialsReported); 712*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, IsPluginProcess); 713*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(::ChromeMetricsServiceClientTest, 714*6777b538SAndroid Build Coastguard Worker TestRegisterMetricsServiceProviders); 715*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(::IOSChromeMetricsServiceClientTest, 716*6777b538SAndroid Build Coastguard Worker TestRegisterMetricsServiceProviders); 717*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 718*6777b538SAndroid Build Coastguard Worker 719*6777b538SAndroid Build Coastguard Worker // Weak pointers factory used to post task on different threads. All weak 720*6777b538SAndroid Build Coastguard Worker // pointers managed by this factory have the same lifetime as MetricsService. 721*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<MetricsService> self_ptr_factory_{this}; 722*6777b538SAndroid Build Coastguard Worker }; 723*6777b538SAndroid Build Coastguard Worker 724*6777b538SAndroid Build Coastguard Worker } // namespace metrics 725*6777b538SAndroid Build Coastguard Worker 726*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_METRICS_METRICS_SERVICE_H_ 727