xref: /aosp_15_r20/external/cronet/components/metrics/metrics_log.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 set of user experience metrics data recorded by the
6*6777b538SAndroid Build Coastguard Worker // MetricsService. This is the unit of data that is sent to the server.
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_METRICS_METRICS_LOG_H_
9*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_METRICS_LOG_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 <memory>
14*6777b538SAndroid Build Coastguard Worker #include <optional>
15*6777b538SAndroid Build Coastguard Worker #include <string>
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_base.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
22*6777b538SAndroid Build Coastguard Worker #include "build/chromeos_buildflags.h"
23*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_reporting_default_state.h"
24*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
25*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/system_profile.pb.h"
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker class PrefService;
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker namespace base {
30*6777b538SAndroid Build Coastguard Worker class Clock;
31*6777b538SAndroid Build Coastguard Worker class HistogramSamples;
32*6777b538SAndroid Build Coastguard Worker }  // namespace base
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker namespace network_time {
35*6777b538SAndroid Build Coastguard Worker class NetworkTimeTracker;
36*6777b538SAndroid Build Coastguard Worker }  // namespace network_time
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker namespace metrics {
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker // This SourceType is saved in Local state by unsent_log_store.cc and entries
41*6777b538SAndroid Build Coastguard Worker // should not be renumbered.
42*6777b538SAndroid Build Coastguard Worker enum UkmLogSourceType {
43*6777b538SAndroid Build Coastguard Worker   UKM_ONLY = 0,            // Log contains only UKM data.
44*6777b538SAndroid Build Coastguard Worker   APPKM_ONLY = 1,          // Log contains only AppKM data.
45*6777b538SAndroid Build Coastguard Worker   BOTH_UKM_AND_APPKM = 2,  // Log contains both AppKM and UKM data.
46*6777b538SAndroid Build Coastguard Worker };
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker // Holds optional metadata associated with a log to be stored.
49*6777b538SAndroid Build Coastguard Worker struct LogMetadata {
50*6777b538SAndroid Build Coastguard Worker   LogMetadata();
51*6777b538SAndroid Build Coastguard Worker   LogMetadata(std::optional<base::HistogramBase::Count> samples_count,
52*6777b538SAndroid Build Coastguard Worker               std::optional<uint64_t> user_id,
53*6777b538SAndroid Build Coastguard Worker               std::optional<UkmLogSourceType> log_source_type);
54*6777b538SAndroid Build Coastguard Worker   LogMetadata(const LogMetadata& other);
55*6777b538SAndroid Build Coastguard Worker   ~LogMetadata();
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // Adds |sample_count| to |samples_count|. If |samples_count| is empty, then
58*6777b538SAndroid Build Coastguard Worker   // |sample_count| will populate |samples_count|.
59*6777b538SAndroid Build Coastguard Worker   void AddSampleCount(base::HistogramBase::Count sample_count);
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   // The total number of samples in this log if applicable.
62*6777b538SAndroid Build Coastguard Worker   std::optional<base::HistogramBase::Count> samples_count;
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   // User id associated with the log.
65*6777b538SAndroid Build Coastguard Worker   std::optional<uint64_t> user_id;
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   // For UKM logs, indicates the type of data.
68*6777b538SAndroid Build Coastguard Worker   std::optional<UkmLogSourceType> log_source_type;
69*6777b538SAndroid Build Coastguard Worker };
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker class MetricsServiceClient;
72*6777b538SAndroid Build Coastguard Worker class DelegatingProvider;
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker namespace internal {
75*6777b538SAndroid Build Coastguard Worker // Maximum number of events before truncation.
76*6777b538SAndroid Build Coastguard Worker constexpr int kOmniboxEventLimit = 5000;
77*6777b538SAndroid Build Coastguard Worker constexpr int kUserActionEventLimit = 5000;
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker SystemProfileProto::InstallerPackage ToInstallerPackage(
80*6777b538SAndroid Build Coastguard Worker     base::StringPiece installer_package_name);
81*6777b538SAndroid Build Coastguard Worker }  // namespace internal
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker class MetricsLog {
84*6777b538SAndroid Build Coastguard Worker  public:
85*6777b538SAndroid Build Coastguard Worker   enum LogType {
86*6777b538SAndroid Build Coastguard Worker     INITIAL_STABILITY_LOG,  // The initial log containing stability stats.
87*6777b538SAndroid Build Coastguard Worker     ONGOING_LOG,            // Subsequent logs in a session.
88*6777b538SAndroid Build Coastguard Worker     INDEPENDENT_LOG,        // An independent log from a previous session.
89*6777b538SAndroid Build Coastguard Worker   };
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker   // Creates a new metrics log of the specified type.
92*6777b538SAndroid Build Coastguard Worker   // |client_id| is the identifier for this profile on this installation
93*6777b538SAndroid Build Coastguard Worker   // |session_id| is an integer that's incremented on each application launch
94*6777b538SAndroid Build Coastguard Worker   // |client| is used to interact with the embedder.
95*6777b538SAndroid Build Coastguard Worker   // Note: |this| instance does not take ownership of the |client|, but rather
96*6777b538SAndroid Build Coastguard Worker   // stores a weak pointer to it. The caller should ensure that the |client| is
97*6777b538SAndroid Build Coastguard Worker   // valid for the lifetime of this class.
98*6777b538SAndroid Build Coastguard Worker   MetricsLog(const std::string& client_id,
99*6777b538SAndroid Build Coastguard Worker              int session_id,
100*6777b538SAndroid Build Coastguard Worker              LogType log_type,
101*6777b538SAndroid Build Coastguard Worker              MetricsServiceClient* client);
102*6777b538SAndroid Build Coastguard Worker   // As above, with a |clock| and |network_clock| to use to vend Now() calls. As
103*6777b538SAndroid Build Coastguard Worker   // with |client|, the caller must ensure both remain valid for the lifetime of
104*6777b538SAndroid Build Coastguard Worker   // this class.
105*6777b538SAndroid Build Coastguard Worker   MetricsLog(const std::string& client_id,
106*6777b538SAndroid Build Coastguard Worker              int session_id,
107*6777b538SAndroid Build Coastguard Worker              LogType log_type,
108*6777b538SAndroid Build Coastguard Worker              base::Clock* clock,
109*6777b538SAndroid Build Coastguard Worker              const network_time::NetworkTimeTracker* network_clock,
110*6777b538SAndroid Build Coastguard Worker              MetricsServiceClient* client);
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker   MetricsLog(const MetricsLog&) = delete;
113*6777b538SAndroid Build Coastguard Worker   MetricsLog& operator=(const MetricsLog&) = delete;
114*6777b538SAndroid Build Coastguard Worker   virtual ~MetricsLog();
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   // Registers local state prefs used by this class.
117*6777b538SAndroid Build Coastguard Worker   static void RegisterPrefs(PrefRegistrySimple* registry);
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker   // Computes the MD5 hash of the given string, and returns the first 8 bytes of
120*6777b538SAndroid Build Coastguard Worker   // the hash.
121*6777b538SAndroid Build Coastguard Worker   static uint64_t Hash(const std::string& value);
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker   // Get the GMT buildtime for the current binary, expressed in seconds since
124*6777b538SAndroid Build Coastguard Worker   // January 1, 1970 GMT.
125*6777b538SAndroid Build Coastguard Worker   // The value is used to identify when a new build is run, so that previous
126*6777b538SAndroid Build Coastguard Worker   // reliability stats, from other builds, can be abandoned.
127*6777b538SAndroid Build Coastguard Worker   static int64_t GetBuildTime();
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   // Convenience function to return the current time at a resolution in seconds.
130*6777b538SAndroid Build Coastguard Worker   // This wraps base::TimeTicks, and hence provides an abstract time that is
131*6777b538SAndroid Build Coastguard Worker   // always incrementing for use in measuring time durations.
132*6777b538SAndroid Build Coastguard Worker   static int64_t GetCurrentTime();
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker   // Records core profile settings into the SystemProfileProto.
135*6777b538SAndroid Build Coastguard Worker   static void RecordCoreSystemProfile(MetricsServiceClient* client,
136*6777b538SAndroid Build Coastguard Worker                                       SystemProfileProto* system_profile);
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker   // Records core profile settings into the SystemProfileProto without a client.
139*6777b538SAndroid Build Coastguard Worker   static void RecordCoreSystemProfile(
140*6777b538SAndroid Build Coastguard Worker       const std::string& version,
141*6777b538SAndroid Build Coastguard Worker       metrics::SystemProfileProto::Channel channel,
142*6777b538SAndroid Build Coastguard Worker       bool is_extended_stable_channel,
143*6777b538SAndroid Build Coastguard Worker       const std::string& application_locale,
144*6777b538SAndroid Build Coastguard Worker       const std::string& package_name,
145*6777b538SAndroid Build Coastguard Worker       SystemProfileProto* system_profile);
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker   // Assign a unique finalized record id to this log.
148*6777b538SAndroid Build Coastguard Worker   void AssignFinalizedRecordId(PrefService* local_state);
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker   // Assign a unique record id to this log.
151*6777b538SAndroid Build Coastguard Worker   void AssignRecordId(PrefService* local_state);
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker   // Records a user-initiated action.
154*6777b538SAndroid Build Coastguard Worker   void RecordUserAction(const std::string& key, base::TimeTicks action_time);
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   // Record any changes in a given histogram for transmission.
157*6777b538SAndroid Build Coastguard Worker   void RecordHistogramDelta(const std::string& histogram_name,
158*6777b538SAndroid Build Coastguard Worker                             const base::HistogramSamples& snapshot);
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker   // TODO(rkaplow): I think this can be a little refactored as it currently
161*6777b538SAndroid Build Coastguard Worker   // records a pretty arbitrary set of things.
162*6777b538SAndroid Build Coastguard Worker   // Records the current operating environment, including metrics provided by
163*6777b538SAndroid Build Coastguard Worker   // the specified |delegating_provider|. The current environment is
164*6777b538SAndroid Build Coastguard Worker   // returned as a SystemProfileProto.
165*6777b538SAndroid Build Coastguard Worker   const SystemProfileProto& RecordEnvironment(
166*6777b538SAndroid Build Coastguard Worker       DelegatingProvider* delegating_provider);
167*6777b538SAndroid Build Coastguard Worker 
168*6777b538SAndroid Build Coastguard Worker   // Loads the environment proto that was saved by the last RecordEnvironment()
169*6777b538SAndroid Build Coastguard Worker   // call from prefs. On success, returns true. Otherwise, (if there was no
170*6777b538SAndroid Build Coastguard Worker   // saved environment in prefs or it could not be decoded), returns false.
171*6777b538SAndroid Build Coastguard Worker   bool LoadSavedEnvironmentFromPrefs(PrefService* local_state);
172*6777b538SAndroid Build Coastguard Worker 
173*6777b538SAndroid Build Coastguard Worker   // Populates the log with data about the previous session.
174*6777b538SAndroid Build Coastguard Worker   // |delegating_provider| forwards the call to provide data to registered
175*6777b538SAndroid Build Coastguard Worker   // MetricsProviders. |local_state| is used to schedule a write because a side
176*6777b538SAndroid Build Coastguard Worker   // effect of providing some data is updating Local State prefs.
177*6777b538SAndroid Build Coastguard Worker   void RecordPreviousSessionData(DelegatingProvider* delegating_provider,
178*6777b538SAndroid Build Coastguard Worker                                  PrefService* local_state);
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   // Populates the log with data about the current session. The uptimes are used
181*6777b538SAndroid Build Coastguard Worker   // to populate the log with info about how long Chrome has been running.
182*6777b538SAndroid Build Coastguard Worker   // |delegating_provider| forwards the call to provide data to registered
183*6777b538SAndroid Build Coastguard Worker   // MetricsProviders. |local_state| is used to schedule a write because a side
184*6777b538SAndroid Build Coastguard Worker   // effect of providing some data is updating Local State prefs.
185*6777b538SAndroid Build Coastguard Worker   void RecordCurrentSessionData(base::TimeDelta incremental_uptime,
186*6777b538SAndroid Build Coastguard Worker                                 base::TimeDelta uptime,
187*6777b538SAndroid Build Coastguard Worker                                 DelegatingProvider* delegating_provider,
188*6777b538SAndroid Build Coastguard Worker                                 PrefService* local_state);
189*6777b538SAndroid Build Coastguard Worker 
190*6777b538SAndroid Build Coastguard Worker   // Returns the current time using |network_clock_| if non-null (falls back to
191*6777b538SAndroid Build Coastguard Worker   // |clock_| otherwise). If |record_time_zone| is true, the returned time will
192*6777b538SAndroid Build Coastguard Worker   // also be populated with the time zone. Must be called on the main thread.
193*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension::RealLocalTime GetCurrentClockTime(
194*6777b538SAndroid Build Coastguard Worker       bool record_time_zone);
195*6777b538SAndroid Build Coastguard Worker 
196*6777b538SAndroid Build Coastguard Worker   // Finalizes the log. Calling this function will make a call to CloseLog().
197*6777b538SAndroid Build Coastguard Worker   // |truncate_events| determines whether user action and omnibox data within
198*6777b538SAndroid Build Coastguard Worker   // the log should be trimmed/truncated (for bandwidth concerns).
199*6777b538SAndroid Build Coastguard Worker   // |current_app_version| is the current version of the application, and is
200*6777b538SAndroid Build Coastguard Worker   // used to determine whether the log data was obtained in a previous version.
201*6777b538SAndroid Build Coastguard Worker   // |close_time| is roughly the current time -- it is provided as a param
202*6777b538SAndroid Build Coastguard Worker   // since computing the current time can sometimes only be done on the main
203*6777b538SAndroid Build Coastguard Worker   // thread, and this method may be called on a background thread. The
204*6777b538SAndroid Build Coastguard Worker   // serialized proto of the finalized log will be written to |encoded_log|.
205*6777b538SAndroid Build Coastguard Worker   void FinalizeLog(
206*6777b538SAndroid Build Coastguard Worker       bool truncate_events,
207*6777b538SAndroid Build Coastguard Worker       const std::string& current_app_version,
208*6777b538SAndroid Build Coastguard Worker       std::optional<ChromeUserMetricsExtension::RealLocalTime> close_time,
209*6777b538SAndroid Build Coastguard Worker       std::string* encoded_log);
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_ASH)
212*6777b538SAndroid Build Coastguard Worker   // Assigns a user ID to the log. This should be called immediately after
213*6777b538SAndroid Build Coastguard Worker   // consotruction if it should be applied.
214*6777b538SAndroid Build Coastguard Worker   void SetUserId(const std::string& user_id);
215*6777b538SAndroid Build Coastguard Worker #endif
216*6777b538SAndroid Build Coastguard Worker 
log_type()217*6777b538SAndroid Build Coastguard Worker   LogType log_type() const { return log_type_; }
218*6777b538SAndroid Build Coastguard Worker 
log_metadata()219*6777b538SAndroid Build Coastguard Worker   const LogMetadata& log_metadata() const { return log_metadata_; }
220*6777b538SAndroid Build Coastguard Worker 
uma_proto()221*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension* uma_proto() { return &uma_proto_; }
222*6777b538SAndroid Build Coastguard Worker 
uma_proto()223*6777b538SAndroid Build Coastguard Worker   const ChromeUserMetricsExtension* uma_proto() const { return &uma_proto_; }
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker  private:
226*6777b538SAndroid Build Coastguard Worker   // Stop writing to this record. None of the Record* methods can be called
227*6777b538SAndroid Build Coastguard Worker   // after this is called.
228*6777b538SAndroid Build Coastguard Worker   void CloseLog();
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker   // Records the log_written_by_app_version system_profile field if the
231*6777b538SAndroid Build Coastguard Worker   // |current_version| is different from the system_profile's app_version.
232*6777b538SAndroid Build Coastguard Worker   void RecordLogWrittenByAppVersionIfNeeded(const std::string& current_version);
233*6777b538SAndroid Build Coastguard Worker 
234*6777b538SAndroid Build Coastguard Worker   // Truncate some of the fields within the log that we want to restrict in
235*6777b538SAndroid Build Coastguard Worker   // size due to bandwidth concerns.
236*6777b538SAndroid Build Coastguard Worker   void TruncateEvents();
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker   // Write the default state of the enable metrics checkbox.
239*6777b538SAndroid Build Coastguard Worker   void WriteMetricsEnableDefault(EnableMetricsDefault metrics_default,
240*6777b538SAndroid Build Coastguard Worker                                  SystemProfileProto* system_profile);
241*6777b538SAndroid Build Coastguard Worker 
242*6777b538SAndroid Build Coastguard Worker   // Within the stability group, write attributes that need to be updated asap
243*6777b538SAndroid Build Coastguard Worker   // and can't be delayed until the user decides to restart chromium.
244*6777b538SAndroid Build Coastguard Worker   // Delaying these stats would bias metrics away from happy long lived
245*6777b538SAndroid Build Coastguard Worker   // chromium processes (ones that don't crash, and keep on running).
246*6777b538SAndroid Build Coastguard Worker   void WriteRealtimeStabilityAttributes(base::TimeDelta incremental_uptime,
247*6777b538SAndroid Build Coastguard Worker                                         base::TimeDelta uptime);
248*6777b538SAndroid Build Coastguard Worker 
249*6777b538SAndroid Build Coastguard Worker   // closed_ is true when record has been packed up for sending, and should
250*6777b538SAndroid Build Coastguard Worker   // no longer be written to.  It is only used for sanity checking.
251*6777b538SAndroid Build Coastguard Worker   bool closed_;
252*6777b538SAndroid Build Coastguard Worker 
253*6777b538SAndroid Build Coastguard Worker   // The type of the log, i.e. initial or ongoing.
254*6777b538SAndroid Build Coastguard Worker   const LogType log_type_;
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   // Stores the protocol buffer representation for this log.
257*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension uma_proto_;
258*6777b538SAndroid Build Coastguard Worker 
259*6777b538SAndroid Build Coastguard Worker   // Used to interact with the embedder. Weak pointer; must outlive |this|
260*6777b538SAndroid Build Coastguard Worker   // instance.
261*6777b538SAndroid Build Coastguard Worker   const raw_ptr<MetricsServiceClient> client_;
262*6777b538SAndroid Build Coastguard Worker 
263*6777b538SAndroid Build Coastguard Worker   // The time when the current log was created.
264*6777b538SAndroid Build Coastguard Worker   const base::TimeTicks creation_time_;
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   // True if the environment has already been filled in by a call to
267*6777b538SAndroid Build Coastguard Worker   // RecordEnvironment() or LoadSavedEnvironmentFromPrefs().
268*6777b538SAndroid Build Coastguard Worker   bool has_environment_;
269*6777b538SAndroid Build Coastguard Worker 
270*6777b538SAndroid Build Coastguard Worker   // Optional metadata associated with the log.
271*6777b538SAndroid Build Coastguard Worker   LogMetadata log_metadata_;
272*6777b538SAndroid Build Coastguard Worker 
273*6777b538SAndroid Build Coastguard Worker   // The clock used to vend Time::Now().  Note that this is not used for the
274*6777b538SAndroid Build Coastguard Worker   // static function MetricsLog::GetCurrentTime(). Can be overridden for tests.
275*6777b538SAndroid Build Coastguard Worker   raw_ptr<base::Clock> clock_;
276*6777b538SAndroid Build Coastguard Worker 
277*6777b538SAndroid Build Coastguard Worker   // The NetworkTimeTracker used to provide higher-quality wall clock times than
278*6777b538SAndroid Build Coastguard Worker   // |clock_| (when available). Can be overridden for tests.
279*6777b538SAndroid Build Coastguard Worker   raw_ptr<const network_time::NetworkTimeTracker> network_clock_;
280*6777b538SAndroid Build Coastguard Worker };
281*6777b538SAndroid Build Coastguard Worker 
282*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
283*6777b538SAndroid Build Coastguard Worker 
284*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_METRICS_METRICS_LOG_H_
285