xref: /aosp_15_r20/external/cronet/components/metrics/metrics_service.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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