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_SERVICE_CLIENT_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_METRICS_SERVICE_CLIENT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker #include <memory> 10*6777b538SAndroid Build Coastguard Worker #include <string> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/callback_list.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial_params.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 16*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_log_store.h" 17*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_log_uploader.h" 18*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_reporting_default_state.h" 19*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/system_profile.pb.h" 20*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h" 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker namespace ukm { 23*6777b538SAndroid Build Coastguard Worker class UkmService; 24*6777b538SAndroid Build Coastguard Worker } 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker namespace network_time { 27*6777b538SAndroid Build Coastguard Worker class NetworkTimeTracker; 28*6777b538SAndroid Build Coastguard Worker } 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker namespace variations { 31*6777b538SAndroid Build Coastguard Worker class SyntheticTrialRegistry; 32*6777b538SAndroid Build Coastguard Worker } 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker class IdentifiabilityStudyState; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker namespace metrics { 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker class MetricsLogUploader; 39*6777b538SAndroid Build Coastguard Worker class MetricsService; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker namespace structured { 42*6777b538SAndroid Build Coastguard Worker class StructuredMetricsService; 43*6777b538SAndroid Build Coastguard Worker } 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // An abstraction of operations that depend on the embedder's (e.g. Chrome) 46*6777b538SAndroid Build Coastguard Worker // environment. 47*6777b538SAndroid Build Coastguard Worker class MetricsServiceClient { 48*6777b538SAndroid Build Coastguard Worker public: 49*6777b538SAndroid Build Coastguard Worker MetricsServiceClient(); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker MetricsServiceClient(const MetricsServiceClient&) = delete; 52*6777b538SAndroid Build Coastguard Worker MetricsServiceClient& operator=(const MetricsServiceClient&) = delete; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker virtual ~MetricsServiceClient(); 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker // Returns the synthetic trial registry shared by MetricsService and 57*6777b538SAndroid Build Coastguard Worker // UkmService. 58*6777b538SAndroid Build Coastguard Worker virtual variations::SyntheticTrialRegistry* GetSyntheticTrialRegistry() = 0; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker // Returns the MetricsService instance that this client is associated with. 61*6777b538SAndroid Build Coastguard Worker // With the exception of testing contexts, the returned instance must be valid 62*6777b538SAndroid Build Coastguard Worker // for the lifetime of this object (typically, the embedder's client 63*6777b538SAndroid Build Coastguard Worker // implementation will own the MetricsService instance being returned). 64*6777b538SAndroid Build Coastguard Worker virtual MetricsService* GetMetricsService() = 0; 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker // Returns the UkmService instance that this client is associated with. 67*6777b538SAndroid Build Coastguard Worker virtual ukm::UkmService* GetUkmService(); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // Returns the IdentifiabilityStudyState instance that this client is 70*6777b538SAndroid Build Coastguard Worker // associated with. Might be nullptr. 71*6777b538SAndroid Build Coastguard Worker virtual IdentifiabilityStudyState* GetIdentifiabilityStudyState(); 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker // Returns the StructuredMetricsService instance that this client is 74*6777b538SAndroid Build Coastguard Worker // associated with. 75*6777b538SAndroid Build Coastguard Worker virtual structured::StructuredMetricsService* GetStructuredMetricsService(); 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker // Returns true if metrics should be uploaded for the given |user_id|, which 78*6777b538SAndroid Build Coastguard Worker // corresponds to the |user_id| field in ChromeUserMetricsExtension. 79*6777b538SAndroid Build Coastguard Worker virtual bool ShouldUploadMetricsForUserId(uint64_t user_id); 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker // Registers the client id with other services (e.g. crash reporting), called 82*6777b538SAndroid Build Coastguard Worker // when metrics recording gets enabled. 83*6777b538SAndroid Build Coastguard Worker virtual void SetMetricsClientId(const std::string& client_id) = 0; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Returns the product value to use in uploaded reports, which will be used to 86*6777b538SAndroid Build Coastguard Worker // set the ChromeUserMetricsExtension.product field. See comments on that 87*6777b538SAndroid Build Coastguard Worker // field on why it's an int32_t rather than an enum. 88*6777b538SAndroid Build Coastguard Worker virtual int32_t GetProduct() = 0; 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Returns the current application locale (e.g. "en-US"). 91*6777b538SAndroid Build Coastguard Worker virtual std::string GetApplicationLocale() = 0; 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker // Return a NetworkTimeTracker for access to a server-provided clock. 94*6777b538SAndroid Build Coastguard Worker virtual const network_time::NetworkTimeTracker* GetNetworkTimeTracker() = 0; 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker // Retrieves the brand code string associated with the install, returning 97*6777b538SAndroid Build Coastguard Worker // false if no brand code is available. 98*6777b538SAndroid Build Coastguard Worker virtual bool GetBrand(std::string* brand_code) = 0; 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker // Returns the release channel (e.g. stable, beta, etc) of the application. 101*6777b538SAndroid Build Coastguard Worker virtual SystemProfileProto::Channel GetChannel() = 0; 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // Returns true if the application is on the extended stable channel. 104*6777b538SAndroid Build Coastguard Worker virtual bool IsExtendedStableChannel() = 0; 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker // Returns the version of the application as a string. 107*6777b538SAndroid Build Coastguard Worker virtual std::string GetVersionString() = 0; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker // Called by the metrics service when a new environment has been recorded. 110*6777b538SAndroid Build Coastguard Worker // Takes the serialized environment as a parameter. The contents of 111*6777b538SAndroid Build Coastguard Worker // |serialized_environment| are consumed by the call, but the caller maintains 112*6777b538SAndroid Build Coastguard Worker // ownership. OnEnvironmentUpdate(std::string * serialized_environment)113*6777b538SAndroid Build Coastguard Worker virtual void OnEnvironmentUpdate(std::string* serialized_environment) {} 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker // Collects child process histograms and merges them into StatisticsRecorder. 116*6777b538SAndroid Build Coastguard Worker // Called when child process histograms need to be merged ASAP. For example, 117*6777b538SAndroid Build Coastguard Worker // on Android, when the browser was backgrounded. MergeSubprocessHistograms()118*6777b538SAndroid Build Coastguard Worker virtual void MergeSubprocessHistograms() {} 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker // Called prior to a metrics log being closed, allowing the client to collect 121*6777b538SAndroid Build Coastguard Worker // extra histograms that will go in that log. Asynchronous API - the client 122*6777b538SAndroid Build Coastguard Worker // implementation should call |done_callback| when complete. 123*6777b538SAndroid Build Coastguard Worker virtual void CollectFinalMetricsForLog(base::OnceClosure done_callback) = 0; 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker // Get the URL of the metrics server. 126*6777b538SAndroid Build Coastguard Worker virtual GURL GetMetricsServerUrl(); 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker // Get the fallback HTTP URL of the metrics server. 129*6777b538SAndroid Build Coastguard Worker virtual GURL GetInsecureMetricsServerUrl(); 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker // Creates a MetricsLogUploader with the specified parameters (see comments on 132*6777b538SAndroid Build Coastguard Worker // MetricsLogUploader for details). 133*6777b538SAndroid Build Coastguard Worker virtual std::unique_ptr<MetricsLogUploader> CreateUploader( 134*6777b538SAndroid Build Coastguard Worker const GURL& server_url, 135*6777b538SAndroid Build Coastguard Worker const GURL& insecure_server_url, 136*6777b538SAndroid Build Coastguard Worker base::StringPiece mime_type, 137*6777b538SAndroid Build Coastguard Worker metrics::MetricsLogUploader::MetricServiceType service_type, 138*6777b538SAndroid Build Coastguard Worker const MetricsLogUploader::UploadCallback& on_upload_complete) = 0; 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker // Returns the interval between upload attempts. Checks if debugging flags 141*6777b538SAndroid Build Coastguard Worker // have been set, otherwise defaults to GetStandardUploadInterval(). 142*6777b538SAndroid Build Coastguard Worker base::TimeDelta GetUploadInterval(); 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker // Returns the standard interval between upload attempts. 145*6777b538SAndroid Build Coastguard Worker virtual base::TimeDelta GetStandardUploadInterval() = 0; 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker // Whether or not the MetricsService should start up quickly and upload the 148*6777b538SAndroid Build Coastguard Worker // initial report quickly. By default, this work may be delayed by some 149*6777b538SAndroid Build Coastguard Worker // amount. Only the default behavior should be used in production, but clients 150*6777b538SAndroid Build Coastguard Worker // can override this in tests if tests need to make assertions on the log 151*6777b538SAndroid Build Coastguard Worker // data. 152*6777b538SAndroid Build Coastguard Worker virtual bool ShouldStartUpFastForTesting() const; 153*6777b538SAndroid Build Coastguard Worker 154*6777b538SAndroid Build Coastguard Worker // Called when loading state changed, e.g. start/stop loading. LoadingStateChanged(bool is_loading)155*6777b538SAndroid Build Coastguard Worker virtual void LoadingStateChanged(bool is_loading) {} 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker // Returns whether metrics reporting is managed by policy. 158*6777b538SAndroid Build Coastguard Worker virtual bool IsReportingPolicyManaged(); 159*6777b538SAndroid Build Coastguard Worker 160*6777b538SAndroid Build Coastguard Worker // Gets information about the default value for the metrics reporting checkbox 161*6777b538SAndroid Build Coastguard Worker // shown during first-run. 162*6777b538SAndroid Build Coastguard Worker virtual EnableMetricsDefault GetMetricsReportingDefaultState(); 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker // Return true iff the system is currently on a cellular connection. 165*6777b538SAndroid Build Coastguard Worker virtual bool IsOnCellularConnection(); 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker // Returns true iff UKM is allowed for all profiles. 168*6777b538SAndroid Build Coastguard Worker // See //components/ukm/observers/ukm_consent_state_observer.h for details. 169*6777b538SAndroid Build Coastguard Worker virtual bool IsUkmAllowedForAllProfiles(); 170*6777b538SAndroid Build Coastguard Worker 171*6777b538SAndroid Build Coastguard Worker // Returns whether UKM notification listeners were attached to all profiles. 172*6777b538SAndroid Build Coastguard Worker virtual bool AreNotificationListenersEnabledOnAllProfiles(); 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard Worker // Gets the app package name (as defined by the embedder). Since package name 175*6777b538SAndroid Build Coastguard Worker // is only meaningful for Android, other platforms should return the empty 176*6777b538SAndroid Build Coastguard Worker // string (this is the same as the default behavior). If the package name 177*6777b538SAndroid Build Coastguard Worker // should not be logged for privacy/fingerprintability reasons, the embedder 178*6777b538SAndroid Build Coastguard Worker // should return the empty string. 179*6777b538SAndroid Build Coastguard Worker virtual std::string GetAppPackageNameIfLoggable(); 180*6777b538SAndroid Build Coastguard Worker 181*6777b538SAndroid Build Coastguard Worker // Gets the key used to sign metrics uploads. This will be used to compute an 182*6777b538SAndroid Build Coastguard Worker // HMAC-SHA256 signature of an uploaded log. 183*6777b538SAndroid Build Coastguard Worker virtual std::string GetUploadSigningKey(); 184*6777b538SAndroid Build Coastguard Worker 185*6777b538SAndroid Build Coastguard Worker // Checks if the cloned install detector says that client ids should be reset. 186*6777b538SAndroid Build Coastguard Worker virtual bool ShouldResetClientIdsOnClonedInstall(); 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Worker virtual base::CallbackListSubscription AddOnClonedInstallDetectedCallback( 189*6777b538SAndroid Build Coastguard Worker base::OnceClosure callback); 190*6777b538SAndroid Build Coastguard Worker 191*6777b538SAndroid Build Coastguard Worker // Specifies local log storage requirements and restrictions. 192*6777b538SAndroid Build Coastguard Worker virtual MetricsLogStore::StorageLimits GetStorageLimits() const; 193*6777b538SAndroid Build Coastguard Worker 194*6777b538SAndroid Build Coastguard Worker // Sets the callback to run MetricsServiceManager::UpdateRunningServices. 195*6777b538SAndroid Build Coastguard Worker void SetUpdateRunningServicesCallback(const base::RepeatingClosure& callback); 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker // Notify MetricsServiceManager to UpdateRunningServices using callback. 198*6777b538SAndroid Build Coastguard Worker void UpdateRunningServices(); 199*6777b538SAndroid Build Coastguard Worker 200*6777b538SAndroid Build Coastguard Worker // Checks if the user has forced metrics collection on via the override flag. 201*6777b538SAndroid Build Coastguard Worker bool IsMetricsReportingForceEnabled() const; 202*6777b538SAndroid Build Coastguard Worker 203*6777b538SAndroid Build Coastguard Worker // Initializes per-user metrics collection. For more details what per-user 204*6777b538SAndroid Build Coastguard Worker // metrics collection is, refer to MetricsService::InitPerUserMetrics. 205*6777b538SAndroid Build Coastguard Worker // 206*6777b538SAndroid Build Coastguard Worker // Since the concept of a user is only applicable in Ash Chrome, this function 207*6777b538SAndroid Build Coastguard Worker // should no-op for other platforms. InitPerUserMetrics()208*6777b538SAndroid Build Coastguard Worker virtual void InitPerUserMetrics() {} 209*6777b538SAndroid Build Coastguard Worker 210*6777b538SAndroid Build Coastguard Worker // Updates the current user's metrics consent. This allows embedders to update 211*6777b538SAndroid Build Coastguard Worker // the user consent. If there is no current user, then this function will 212*6777b538SAndroid Build Coastguard Worker // no-op. 213*6777b538SAndroid Build Coastguard Worker // 214*6777b538SAndroid Build Coastguard Worker // Since the concept of a user is only applicable on Ash Chrome, this function 215*6777b538SAndroid Build Coastguard Worker // should no-op for other platforms. UpdateCurrentUserMetricsConsent(bool user_metrics_consent)216*6777b538SAndroid Build Coastguard Worker virtual void UpdateCurrentUserMetricsConsent(bool user_metrics_consent) {} 217*6777b538SAndroid Build Coastguard Worker 218*6777b538SAndroid Build Coastguard Worker // Returns the current user metrics consent if it should be applied to decide 219*6777b538SAndroid Build Coastguard Worker // the current metrics reporting state. This allows embedders to determine 220*6777b538SAndroid Build Coastguard Worker // when a user metric consent state should not be applied (ie no logged in 221*6777b538SAndroid Build Coastguard Worker // user or managed policy). 222*6777b538SAndroid Build Coastguard Worker // 223*6777b538SAndroid Build Coastguard Worker // Will return std::nullopt if there is no current user or current user 224*6777b538SAndroid Build Coastguard Worker // metrics consent should not be applied to determine metrics reporting state. 225*6777b538SAndroid Build Coastguard Worker // 226*6777b538SAndroid Build Coastguard Worker // Not all platforms support per-user consent. If per-user consent is not 227*6777b538SAndroid Build Coastguard Worker // supported, this function should return std::nullopt. 228*6777b538SAndroid Build Coastguard Worker virtual std::optional<bool> GetCurrentUserMetricsConsent() const; 229*6777b538SAndroid Build Coastguard Worker 230*6777b538SAndroid Build Coastguard Worker // Returns the current user id. 231*6777b538SAndroid Build Coastguard Worker // 232*6777b538SAndroid Build Coastguard Worker // Will return std::nullopt if there is no current user, metrics reporting is 233*6777b538SAndroid Build Coastguard Worker // disabled, or current user should not have a user id. 234*6777b538SAndroid Build Coastguard Worker // 235*6777b538SAndroid Build Coastguard Worker // Not all platforms support per-user consent. If per-user consent is not 236*6777b538SAndroid Build Coastguard Worker // supported, this function should return std::nullopt. 237*6777b538SAndroid Build Coastguard Worker virtual std::optional<std::string> GetCurrentUserId() const; 238*6777b538SAndroid Build Coastguard Worker 239*6777b538SAndroid Build Coastguard Worker private: 240*6777b538SAndroid Build Coastguard Worker base::RepeatingClosure update_running_services_; 241*6777b538SAndroid Build Coastguard Worker }; 242*6777b538SAndroid Build Coastguard Worker 243*6777b538SAndroid Build Coastguard Worker } // namespace metrics 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_METRICS_METRICS_SERVICE_CLIENT_H_ 246