xref: /aosp_15_r20/external/cronet/components/metrics/metrics_service_client.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 #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