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 #ifndef COMPONENTS_METRICS_METRICS_PROVIDER_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_METRICS_PROVIDER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker namespace base { 12*6777b538SAndroid Build Coastguard Worker class HistogramSnapshotManager; 13*6777b538SAndroid Build Coastguard Worker } // namespace base 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace metrics { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker class ChromeUserMetricsExtension; 18*6777b538SAndroid Build Coastguard Worker class SystemProfileProto; 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // MetricsProvider is an interface allowing different parts of the UMA protos to 21*6777b538SAndroid Build Coastguard Worker // be filled out by different classes. 22*6777b538SAndroid Build Coastguard Worker class MetricsProvider { 23*6777b538SAndroid Build Coastguard Worker public: 24*6777b538SAndroid Build Coastguard Worker MetricsProvider(); 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker MetricsProvider(const MetricsProvider&) = delete; 27*6777b538SAndroid Build Coastguard Worker MetricsProvider& operator=(const MetricsProvider&) = delete; 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker virtual ~MetricsProvider(); 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker // Called after initialization of MetricsService and field trials. 32*6777b538SAndroid Build Coastguard Worker virtual void Init(); 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker // Called during service initialization to allow the provider to start any 35*6777b538SAndroid Build Coastguard Worker // async initialization tasks. The service will wait for the provider to 36*6777b538SAndroid Build Coastguard Worker // call |done_callback| before generating logs for the current session. 37*6777b538SAndroid Build Coastguard Worker // |done_callback| must be run on the same thread that calls |AsyncInit|. 38*6777b538SAndroid Build Coastguard Worker virtual void AsyncInit(base::OnceClosure done_callback); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Called by OnDidCreateMetricsLog() to provide histograms. If histograms 41*6777b538SAndroid Build Coastguard Worker // are not emitted successfully, it will be called in 42*6777b538SAndroid Build Coastguard Worker // ProvideCurrentSessionData(). 43*6777b538SAndroid Build Coastguard Worker // Returns whether or not histograms are emitted successfully. 44*6777b538SAndroid Build Coastguard Worker // Only override this function if: 45*6777b538SAndroid Build Coastguard Worker // 1. You want your histograms to be included in every record uploaded to the 46*6777b538SAndroid Build Coastguard Worker // server. 47*6777b538SAndroid Build Coastguard Worker // 2. You will not override ProvideCurrentSessionData(), 48*6777b538SAndroid Build Coastguard Worker // OnDidCreateMetricsLog(), or ProvideStabilityMetrics(). 49*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/40899764): Refactor the code to remove requirement 2. 50*6777b538SAndroid Build Coastguard Worker virtual bool ProvideHistograms(); 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Called when a new MetricsLog is created. 53*6777b538SAndroid Build Coastguard Worker virtual void OnDidCreateMetricsLog(); 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Called when metrics recording has been enabled. 56*6777b538SAndroid Build Coastguard Worker virtual void OnRecordingEnabled(); 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker // Called when metrics recording has been disabled. 59*6777b538SAndroid Build Coastguard Worker virtual void OnRecordingDisabled(); 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Called when metrics client identifiers have been reset. 62*6777b538SAndroid Build Coastguard Worker // 63*6777b538SAndroid Build Coastguard Worker // Metrics providers should clean up any persisted state that could be used to 64*6777b538SAndroid Build Coastguard Worker // associate the previous identifier with the new one. 65*6777b538SAndroid Build Coastguard Worker // 66*6777b538SAndroid Build Coastguard Worker // Currently this method is only invoked in UKM. 67*6777b538SAndroid Build Coastguard Worker virtual void OnClientStateCleared(); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // Called when the application is going into background mode, on platforms 70*6777b538SAndroid Build Coastguard Worker // where applications may be killed when going into the background (Android, 71*6777b538SAndroid Build Coastguard Worker // iOS). Providers that buffer histogram data in memory should persist 72*6777b538SAndroid Build Coastguard Worker // histograms in this callback, as the application may be killed without 73*6777b538SAndroid Build Coastguard Worker // further notification after this callback. 74*6777b538SAndroid Build Coastguard Worker virtual void OnAppEnterBackground(); 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker // Called when a document first starts loading. 77*6777b538SAndroid Build Coastguard Worker virtual void OnPageLoadStarted(); 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker // Returns whether there are "independent" metrics that can be retrieved 80*6777b538SAndroid Build Coastguard Worker // with a call to ProvideIndependentMetrics(). 81*6777b538SAndroid Build Coastguard Worker virtual bool HasIndependentMetrics(); 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker // Provides a complete and independent uma proto + metrics for uploading. 84*6777b538SAndroid Build Coastguard Worker // Called once every time HasIndependentMetrics() returns true. The passed in 85*6777b538SAndroid Build Coastguard Worker // |uma_proto| is by default filled with current session id and core system 86*6777b538SAndroid Build Coastguard Worker // profile information. This function is called on main thread, but the 87*6777b538SAndroid Build Coastguard Worker // provider can do async work to fill in |uma_proto| and run |done_callback| 88*6777b538SAndroid Build Coastguard Worker // on calling thread when complete. Calling |serialize_log_callback| will 89*6777b538SAndroid Build Coastguard Worker // serialize |uma_proto| so that it is primed to be sent. As an optimization, 90*6777b538SAndroid Build Coastguard Worker // the provider should call this on a background thread before posting back 91*6777b538SAndroid Build Coastguard Worker // |done_callback| on the calling thread. However, it is fine not to call this 92*6777b538SAndroid Build Coastguard Worker // if the thread hopping could introduce data loss (e.g., since the user may 93*6777b538SAndroid Build Coastguard Worker // shut down the browser before |done_callback| is called). In this case, 94*6777b538SAndroid Build Coastguard Worker // |done_callback| will "manually" call it synchronously. Ownership of the 95*6777b538SAndroid Build Coastguard Worker // passed objects remains with the caller and those objects will live until 96*6777b538SAndroid Build Coastguard Worker // the callback is executed. 97*6777b538SAndroid Build Coastguard Worker virtual void ProvideIndependentMetrics( 98*6777b538SAndroid Build Coastguard Worker base::OnceClosure serialize_log_callback, 99*6777b538SAndroid Build Coastguard Worker base::OnceCallback<void(bool)> done_callback, 100*6777b538SAndroid Build Coastguard Worker ChromeUserMetricsExtension* uma_proto, 101*6777b538SAndroid Build Coastguard Worker base::HistogramSnapshotManager* snapshot_manager); 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // Provides additional metrics into the system profile. This is a convenience 104*6777b538SAndroid Build Coastguard Worker // method over ProvideSystemProfileMetricsWithLogCreationTime() without the 105*6777b538SAndroid Build Coastguard Worker // |log_creation_time| param. Should not be called directly by services. 106*6777b538SAndroid Build Coastguard Worker virtual void ProvideSystemProfileMetrics( 107*6777b538SAndroid Build Coastguard Worker SystemProfileProto* system_profile_proto); 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker // Provides additional metrics into the system profile. The log creation 110*6777b538SAndroid Build Coastguard Worker // time param provides a timestamp of when the log was opened, which is needed 111*6777b538SAndroid Build Coastguard Worker // for some metrics providers. 112*6777b538SAndroid Build Coastguard Worker virtual void ProvideSystemProfileMetricsWithLogCreationTime( 113*6777b538SAndroid Build Coastguard Worker base::TimeTicks log_creation_time, 114*6777b538SAndroid Build Coastguard Worker SystemProfileProto* system_profile_proto); 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker // Called once at startup to see whether this provider has critical data 117*6777b538SAndroid Build Coastguard Worker // to provide about the previous session. 118*6777b538SAndroid Build Coastguard Worker // Returning true will trigger ProvidePreviousSessionData on all other 119*6777b538SAndroid Build Coastguard Worker // registered metrics providers. 120*6777b538SAndroid Build Coastguard Worker // Default implementation always returns false. 121*6777b538SAndroid Build Coastguard Worker virtual bool HasPreviousSessionData(); 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker // Called when building a log about the previous session, so the provider 124*6777b538SAndroid Build Coastguard Worker // can provide data about it. Stability metrics can be provided 125*6777b538SAndroid Build Coastguard Worker // directly into |stability_proto| fields or by logging stability histograms 126*6777b538SAndroid Build Coastguard Worker // via the UMA_STABILITY_HISTOGRAM_ENUMERATION() macro. 127*6777b538SAndroid Build Coastguard Worker virtual void ProvidePreviousSessionData( 128*6777b538SAndroid Build Coastguard Worker ChromeUserMetricsExtension* uma_proto); 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker // Called when building a log about the current session, so the provider 131*6777b538SAndroid Build Coastguard Worker // can provide data about it. 132*6777b538SAndroid Build Coastguard Worker virtual void ProvideCurrentSessionData(ChromeUserMetricsExtension* uma_proto); 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker // Called when building a UKM log about the current session. UKM-specific data 135*6777b538SAndroid Build Coastguard Worker // should generally only be emitted through this method, and UMA data should 136*6777b538SAndroid Build Coastguard Worker // be emitted through ProvideCurrentSessionData(). 137*6777b538SAndroid Build Coastguard Worker virtual void ProvideCurrentSessionUKMData(); 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker // Provides additional stability metrics. Stability metrics can be provided 140*6777b538SAndroid Build Coastguard Worker // directly into |stability_proto| fields or by logging stability histograms 141*6777b538SAndroid Build Coastguard Worker // via the UMA_STABILITY_HISTOGRAM_ENUMERATION() macro. 142*6777b538SAndroid Build Coastguard Worker virtual void ProvideStabilityMetrics( 143*6777b538SAndroid Build Coastguard Worker SystemProfileProto* system_profile_proto); 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker // Called to indicate that saved stability prefs should be cleared, e.g. 146*6777b538SAndroid Build Coastguard Worker // because they are from an old version and should not be kept. 147*6777b538SAndroid Build Coastguard Worker virtual void ClearSavedStabilityMetrics(); 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker // Called during regular collection to explicitly load histogram snapshots 150*6777b538SAndroid Build Coastguard Worker // using a snapshot manager. Calls to only PrepareDelta(), not PrepareDeltas() 151*6777b538SAndroid Build Coastguard Worker // (plural), should be made. 152*6777b538SAndroid Build Coastguard Worker virtual void RecordHistogramSnapshots( 153*6777b538SAndroid Build Coastguard Worker base::HistogramSnapshotManager* snapshot_manager); 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker // Called during collection of initial metrics to explicitly load histogram 156*6777b538SAndroid Build Coastguard Worker // snapshots using a snapshot manager. Calls to only PrepareDelta(), not 157*6777b538SAndroid Build Coastguard Worker // PrepareDeltas() (plural), should be made. 158*6777b538SAndroid Build Coastguard Worker virtual void RecordInitialHistogramSnapshots( 159*6777b538SAndroid Build Coastguard Worker base::HistogramSnapshotManager* snapshot_manager); 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker protected: 162*6777b538SAndroid Build Coastguard Worker // Used to indicate whether ProvideHistograms() successfully emits histograms 163*6777b538SAndroid Build Coastguard Worker // when called in OnDidCreateMetricsLog(). 164*6777b538SAndroid Build Coastguard Worker bool emitted_ = false; 165*6777b538SAndroid Build Coastguard Worker }; 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker } // namespace metrics 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_METRICS_METRICS_PROVIDER_H_ 170