xref: /aosp_15_r20/external/cronet/components/metrics/file_metrics_provider.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2016 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_FILE_METRICS_PROVIDER_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_FILE_METRICS_PROVIDER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <list>
11*6777b538SAndroid Build Coastguard Worker #include <memory>
12*6777b538SAndroid Build Coastguard Worker #include <vector>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/metrics/statistics_recorder.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
23*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_provider.h"
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker class PrefRegistrySimple;
26*6777b538SAndroid Build Coastguard Worker class PrefService;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace metrics {
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker // FileMetricsProvider gathers and logs histograms written to files on disk.
31*6777b538SAndroid Build Coastguard Worker // Any number of files can be registered and will be polled once per upload
32*6777b538SAndroid Build Coastguard Worker // cycle (at startup and periodically thereafter -- about every 30 minutes
33*6777b538SAndroid Build Coastguard Worker // for desktop) for data to send.
34*6777b538SAndroid Build Coastguard Worker class FileMetricsProvider : public MetricsProvider,
35*6777b538SAndroid Build Coastguard Worker                             public base::StatisticsRecorder::HistogramProvider {
36*6777b538SAndroid Build Coastguard Worker  public:
37*6777b538SAndroid Build Coastguard Worker   struct Params;
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   enum SourceType {
40*6777b538SAndroid Build Coastguard Worker     // "Atomic" files are a collection of histograms that are written
41*6777b538SAndroid Build Coastguard Worker     // completely in a single atomic operation (typically a write followed
42*6777b538SAndroid Build Coastguard Worker     // by an atomic rename) and the file is never updated again except to
43*6777b538SAndroid Build Coastguard Worker     // be replaced by a completely new set of histograms. This is the only
44*6777b538SAndroid Build Coastguard Worker     // option that can be used if the file is not writeable by *this*
45*6777b538SAndroid Build Coastguard Worker     // process. Once the file has been read, an attempt will be made to
46*6777b538SAndroid Build Coastguard Worker     // delete it thus providing some measure of safety should different
47*6777b538SAndroid Build Coastguard Worker     // instantiations (such as by different users of a system-level install)
48*6777b538SAndroid Build Coastguard Worker     // try to read it. In case the delete operation fails, this class
49*6777b538SAndroid Build Coastguard Worker     // persistently tracks the last-modified time of the file so it will
50*6777b538SAndroid Build Coastguard Worker     // not be read a second time.
51*6777b538SAndroid Build Coastguard Worker     SOURCE_HISTOGRAMS_ATOMIC_FILE,
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker     // A directory of atomic PMA files. This handles a directory in which
54*6777b538SAndroid Build Coastguard Worker     // files of metrics are atomically added. Only files ending with ".pma"
55*6777b538SAndroid Build Coastguard Worker     // will be read. They are read according to their last-modified time and
56*6777b538SAndroid Build Coastguard Worker     // never read more that once (unless they change). Only one file will
57*6777b538SAndroid Build Coastguard Worker     // be read per reporting cycle. Filenames that start with a dot (.) or
58*6777b538SAndroid Build Coastguard Worker     // an underscore (_) are ignored so temporary files (perhaps created by
59*6777b538SAndroid Build Coastguard Worker     // the ImportantFileWriter) will not get read. Files that have been
60*6777b538SAndroid Build Coastguard Worker     // read will be attempted to be deleted; should those files not be
61*6777b538SAndroid Build Coastguard Worker     // deletable by this process, it is the reponsibility of the producer
62*6777b538SAndroid Build Coastguard Worker     // to keep the directory pruned in some manner. Added files must have a
63*6777b538SAndroid Build Coastguard Worker     // timestamp later (not the same or earlier) than the newest file that
64*6777b538SAndroid Build Coastguard Worker     // already exists or it may be assumed to have been already uploaded.
65*6777b538SAndroid Build Coastguard Worker     SOURCE_HISTOGRAMS_ATOMIC_DIR,
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker     // "Active" files may be open by one or more other processes and updated
68*6777b538SAndroid Build Coastguard Worker     // at any time with new samples or new histograms. Such files may also be
69*6777b538SAndroid Build Coastguard Worker     // inactive for any period of time only to be opened again and have new
70*6777b538SAndroid Build Coastguard Worker     // data written to them. The file should probably never be deleted because
71*6777b538SAndroid Build Coastguard Worker     // there would be no guarantee that the data has been reported.
72*6777b538SAndroid Build Coastguard Worker     SOURCE_HISTOGRAMS_ACTIVE_FILE,
73*6777b538SAndroid Build Coastguard Worker   };
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   enum SourceAssociation {
76*6777b538SAndroid Build Coastguard Worker     // Associates the metrics in the file with the current run of the browser.
77*6777b538SAndroid Build Coastguard Worker     // The reporting will take place as part of the normal logging of
78*6777b538SAndroid Build Coastguard Worker     // histograms.
79*6777b538SAndroid Build Coastguard Worker     ASSOCIATE_CURRENT_RUN,
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker     // Associates the metrics in the file with the previous run of the browesr.
82*6777b538SAndroid Build Coastguard Worker     // The reporting will take place as part of the "stability" histograms.
83*6777b538SAndroid Build Coastguard Worker     // This is important when metrics are dumped as part of a crash of the
84*6777b538SAndroid Build Coastguard Worker     // previous run. This can only be used with FILE_HISTOGRAMS_ATOMIC.
85*6777b538SAndroid Build Coastguard Worker     ASSOCIATE_PREVIOUS_RUN,
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker     // Associates the metrics in the file with the a profile embedded in the
88*6777b538SAndroid Build Coastguard Worker     // same file. The reporting will take place at a convenient time after
89*6777b538SAndroid Build Coastguard Worker     // startup when the browser is otherwise idle. If there is no embedded
90*6777b538SAndroid Build Coastguard Worker     // system profile, these metrics will be lost.
91*6777b538SAndroid Build Coastguard Worker     ASSOCIATE_INTERNAL_PROFILE,
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker     // Like above but fall back to ASSOCIATE_PREVIOUS_RUN if there is no
94*6777b538SAndroid Build Coastguard Worker     // embedded profile. This has a small cost during startup as that is
95*6777b538SAndroid Build Coastguard Worker     // when previous-run metrics are sent so the file has be checked at
96*6777b538SAndroid Build Coastguard Worker     // that time even though actual transfer will be delayed if an
97*6777b538SAndroid Build Coastguard Worker     // embedded profile is found.
98*6777b538SAndroid Build Coastguard Worker     ASSOCIATE_INTERNAL_PROFILE_OR_PREVIOUS_RUN,
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker     // Used to only record the metadata of |ASSOCIATE_INTERNAL_PROFILE| but not
101*6777b538SAndroid Build Coastguard Worker     // merge the metrics. Instead, write metadata such as the samples count etc,
102*6777b538SAndroid Build Coastguard Worker     // to prefs then delete file. To precisely simulate the
103*6777b538SAndroid Build Coastguard Worker     // |ASSOCIATE_INTERNAL_PROFILE| behavior, one file record will be read out
104*6777b538SAndroid Build Coastguard Worker     // and added to the stability prefs each time the metrics service requests
105*6777b538SAndroid Build Coastguard Worker     // the |ASSOCIATE_INTERNAL_PROFILE| source metrics. Finally, the results
106*6777b538SAndroid Build Coastguard Worker     // will be recoreded as stability metrics in the next run.
107*6777b538SAndroid Build Coastguard Worker     ASSOCIATE_INTERNAL_PROFILE_SAMPLES_COUNTER,
108*6777b538SAndroid Build Coastguard Worker   };
109*6777b538SAndroid Build Coastguard Worker 
110*6777b538SAndroid Build Coastguard Worker   enum FilterAction {
111*6777b538SAndroid Build Coastguard Worker     // Process this file normally.
112*6777b538SAndroid Build Coastguard Worker     FILTER_PROCESS_FILE,
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker     // This file is the active metrics file for the current process.  Don't
115*6777b538SAndroid Build Coastguard Worker     // do anything with it. This is effectively "try later" but isn't
116*6777b538SAndroid Build Coastguard Worker     // added to the results histogram because the file has to be ignored
117*6777b538SAndroid Build Coastguard Worker     // throughout the life of the browser and that skews the distribution.
118*6777b538SAndroid Build Coastguard Worker     FILTER_ACTIVE_THIS_PID,
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker     // Try again. This could happen within milliseconds or minutes but no other
121*6777b538SAndroid Build Coastguard Worker     // files from the same source will get processed in between. The process
122*6777b538SAndroid Build Coastguard Worker     // must have permission to "touch" the file and alter its last-modified
123*6777b538SAndroid Build Coastguard Worker     // time because files are always processed in order of those stamps.
124*6777b538SAndroid Build Coastguard Worker     FILTER_TRY_LATER,
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker     // Skip this file. This file will not be processed until it has changed
127*6777b538SAndroid Build Coastguard Worker     // (i.e. had its last-modifided time updated). If it is "atomic", an
128*6777b538SAndroid Build Coastguard Worker     // attempt will be made to delete it.
129*6777b538SAndroid Build Coastguard Worker     FILTER_SKIP_FILE,
130*6777b538SAndroid Build Coastguard Worker   };
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   // A "filter" can be defined to determine what to do on a per-file basis.
133*6777b538SAndroid Build Coastguard Worker   // This is called only after a file has been found to be the next one to
134*6777b538SAndroid Build Coastguard Worker   // be processed so it's okay if filter calls are relatively expensive.
135*6777b538SAndroid Build Coastguard Worker   // Calls are made on a background thread of low-priority and capable of
136*6777b538SAndroid Build Coastguard Worker   // doing I/O.
137*6777b538SAndroid Build Coastguard Worker   using FilterCallback =
138*6777b538SAndroid Build Coastguard Worker       base::RepeatingCallback<FilterAction(const base::FilePath& path)>;
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   // Parameters for RegisterSource, defined as a structure to allow new
141*6777b538SAndroid Build Coastguard Worker   // ones to be added (with default values) that doesn't require changes
142*6777b538SAndroid Build Coastguard Worker   // to all call sites.
143*6777b538SAndroid Build Coastguard Worker   struct Params {
144*6777b538SAndroid Build Coastguard Worker     Params(const base::FilePath& path,
145*6777b538SAndroid Build Coastguard Worker            SourceType type,
146*6777b538SAndroid Build Coastguard Worker            SourceAssociation association,
147*6777b538SAndroid Build Coastguard Worker            base::StringPiece prefs_key = base::StringPiece());
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker     ~Params();
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker     // The standard parameters, set during construction.
152*6777b538SAndroid Build Coastguard Worker     const base::FilePath path;
153*6777b538SAndroid Build Coastguard Worker     const SourceType type;
154*6777b538SAndroid Build Coastguard Worker     const SourceAssociation association;
155*6777b538SAndroid Build Coastguard Worker     const base::StringPiece prefs_key;
156*6777b538SAndroid Build Coastguard Worker 
157*6777b538SAndroid Build Coastguard Worker     // Other parameters that can be set after construction.
158*6777b538SAndroid Build Coastguard Worker     FilterCallback filter;       // Run-time check for what to do with file.
159*6777b538SAndroid Build Coastguard Worker     base::TimeDelta max_age;     // Maximum age of a file (0=unlimited).
160*6777b538SAndroid Build Coastguard Worker     size_t max_dir_kib = 0;      // Maximum bytes in a directory (0=inf).
161*6777b538SAndroid Build Coastguard Worker     size_t max_dir_files = 100;  // Maximum files in a directory (0=inf).
162*6777b538SAndroid Build Coastguard Worker   };
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   explicit FileMetricsProvider(PrefService* local_state);
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker   FileMetricsProvider(const FileMetricsProvider&) = delete;
167*6777b538SAndroid Build Coastguard Worker   FileMetricsProvider& operator=(const FileMetricsProvider&) = delete;
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker   ~FileMetricsProvider() override;
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker   // Indicates a file or directory to be monitored and how the file or files
172*6777b538SAndroid Build Coastguard Worker   // within that directory are used. Because some metadata may need to persist
173*6777b538SAndroid Build Coastguard Worker   // across process restarts, preferences entries are used based on the
174*6777b538SAndroid Build Coastguard Worker   // |prefs_key| name. Call RegisterSourcePrefs() with the same name to create
175*6777b538SAndroid Build Coastguard Worker   // the necessary keys in advance. Set |prefs_key| empty (nullptr will work) if
176*6777b538SAndroid Build Coastguard Worker   // no persistence is required. ACTIVE files shouldn't have a pref key as
177*6777b538SAndroid Build Coastguard Worker   // they update internal state about what has been previously sent.
178*6777b538SAndroid Build Coastguard Worker   void RegisterSource(const Params& params);
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   // Registers all necessary preferences for maintaining persistent state
181*6777b538SAndroid Build Coastguard Worker   // about a monitored file across process restarts. The |prefs_key| is
182*6777b538SAndroid Build Coastguard Worker   // typically the filename.
183*6777b538SAndroid Build Coastguard Worker   static void RegisterSourcePrefs(PrefRegistrySimple* prefs,
184*6777b538SAndroid Build Coastguard Worker                                   const base::StringPiece prefs_key);
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   static void RegisterPrefs(PrefRegistrySimple* prefs);
187*6777b538SAndroid Build Coastguard Worker 
188*6777b538SAndroid Build Coastguard Worker  private:
189*6777b538SAndroid Build Coastguard Worker   friend class FileMetricsProviderTest;
190*6777b538SAndroid Build Coastguard Worker   friend class TestFileMetricsProvider;
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker   // The different results that can occur accessing a file.
193*6777b538SAndroid Build Coastguard Worker   enum AccessResult {
194*6777b538SAndroid Build Coastguard Worker     // File was successfully mapped.
195*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_SUCCESS,
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker     // File does not exist.
198*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_DOESNT_EXIST,
199*6777b538SAndroid Build Coastguard Worker 
200*6777b538SAndroid Build Coastguard Worker     // File exists but not modified since last read.
201*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_NOT_MODIFIED,
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker     // File is not valid: is a directory or zero-size.
204*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_INVALID_FILE,
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker     // System could not map file into memory.
207*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_SYSTEM_MAP_FAILURE,
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker     // File had invalid contents.
210*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_INVALID_CONTENTS,
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker     // File could not be opened.
213*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_NO_OPEN,
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker     // File contents were internally deleted.
216*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_MEMORY_DELETED,
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker     // File is scheduled to be tried again later.
219*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_FILTER_TRY_LATER,
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker     // File was skipped according to filtering rules.
222*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_FILTER_SKIP_FILE,
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker     // File was skipped because it exceeds the maximum age.
225*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_TOO_OLD,
226*6777b538SAndroid Build Coastguard Worker 
227*6777b538SAndroid Build Coastguard Worker     // File was skipped because too many files in directory.
228*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_TOO_MANY_FILES,
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker     // File was skipped because too many bytes in directory.
231*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_TOO_MANY_BYTES,
232*6777b538SAndroid Build Coastguard Worker 
233*6777b538SAndroid Build Coastguard Worker     // The file was skipped because it's being written by this process.
234*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_THIS_PID,
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker     // The file had no embedded system profile.
237*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_NO_PROFILE,
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker     // The file had internal data corruption.
240*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_DATA_CORRUPTION,
241*6777b538SAndroid Build Coastguard Worker 
242*6777b538SAndroid Build Coastguard Worker     // The file is not writable when it should be.
243*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_NOT_WRITABLE,
244*6777b538SAndroid Build Coastguard Worker 
245*6777b538SAndroid Build Coastguard Worker     ACCESS_RESULT_MAX
246*6777b538SAndroid Build Coastguard Worker   };
247*6777b538SAndroid Build Coastguard Worker 
248*6777b538SAndroid Build Coastguard Worker   // Information about sources being monitored; defined and used exclusively
249*6777b538SAndroid Build Coastguard Worker   // inside the .cc file.
250*6777b538SAndroid Build Coastguard Worker   struct SourceInfo;
251*6777b538SAndroid Build Coastguard Worker   using SourceInfoList = std::list<std::unique_ptr<SourceInfo>>;
252*6777b538SAndroid Build Coastguard Worker 
253*6777b538SAndroid Build Coastguard Worker   // Records an access result in a histogram.
254*6777b538SAndroid Build Coastguard Worker   static void RecordAccessResult(AccessResult result);
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   // Looks for the next file to read within a directory. Returns true if a
257*6777b538SAndroid Build Coastguard Worker   // file was found. This is part of CheckAndMapNewMetricSourcesOnTaskRunner
258*6777b538SAndroid Build Coastguard Worker   // and so runs on an thread capable of I/O. The |source| structure will
259*6777b538SAndroid Build Coastguard Worker   // be internally updated to indicate the next file to be read.
260*6777b538SAndroid Build Coastguard Worker   static bool LocateNextFileInDirectory(SourceInfo* source);
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker   // Handles the completion of a source.
263*6777b538SAndroid Build Coastguard Worker   static void FinishedWithSource(SourceInfo* source, AccessResult result);
264*6777b538SAndroid Build Coastguard Worker 
265*6777b538SAndroid Build Coastguard Worker   // Checks a list of sources (on a task-runner allowed to do I/O) and merge
266*6777b538SAndroid Build Coastguard Worker   // any data found within them.
267*6777b538SAndroid Build Coastguard Worker   // Returns a list of histogram sample counts for sources of type
268*6777b538SAndroid Build Coastguard Worker   // ASSOCIATE_INTERNAL_PROFILE_SAMPLES_COUNTER that were processed.
269*6777b538SAndroid Build Coastguard Worker   static std::vector<size_t> CheckAndMergeMetricSourcesOnTaskRunner(
270*6777b538SAndroid Build Coastguard Worker       SourceInfoList* sources);
271*6777b538SAndroid Build Coastguard Worker 
272*6777b538SAndroid Build Coastguard Worker   // Checks a single source and maps it into memory.
273*6777b538SAndroid Build Coastguard Worker   static AccessResult CheckAndMapMetricSource(SourceInfo* source);
274*6777b538SAndroid Build Coastguard Worker 
275*6777b538SAndroid Build Coastguard Worker   // Merges all of the histograms from a |source| to the StatisticsRecorder.
276*6777b538SAndroid Build Coastguard Worker   // Returns the number of histograms merged.
277*6777b538SAndroid Build Coastguard Worker   static size_t MergeHistogramDeltasFromSource(SourceInfo* source);
278*6777b538SAndroid Build Coastguard Worker 
279*6777b538SAndroid Build Coastguard Worker   // Records all histograms from a given source via a snapshot-manager. Only the
280*6777b538SAndroid Build Coastguard Worker   // histograms that have |required_flags| will be recorded.
281*6777b538SAndroid Build Coastguard Worker   static void RecordHistogramSnapshotsFromSource(
282*6777b538SAndroid Build Coastguard Worker       base::HistogramSnapshotManager* snapshot_manager,
283*6777b538SAndroid Build Coastguard Worker       SourceInfo* source,
284*6777b538SAndroid Build Coastguard Worker       base::HistogramBase::Flags required_flags);
285*6777b538SAndroid Build Coastguard Worker 
286*6777b538SAndroid Build Coastguard Worker   // Calls source filter (if any) and returns the desired action.
287*6777b538SAndroid Build Coastguard Worker   static AccessResult HandleFilterSource(SourceInfo* source,
288*6777b538SAndroid Build Coastguard Worker                                          const base::FilePath& path);
289*6777b538SAndroid Build Coastguard Worker 
290*6777b538SAndroid Build Coastguard Worker   // The part of ProvideIndependentMetrics that runs as a background task.
291*6777b538SAndroid Build Coastguard Worker   static bool ProvideIndependentMetricsOnTaskRunner(
292*6777b538SAndroid Build Coastguard Worker       SourceInfo* source,
293*6777b538SAndroid Build Coastguard Worker       ChromeUserMetricsExtension* uma_proto,
294*6777b538SAndroid Build Coastguard Worker       base::HistogramSnapshotManager* snapshot_manager,
295*6777b538SAndroid Build Coastguard Worker       base::OnceClosure serialize_log_callback);
296*6777b538SAndroid Build Coastguard Worker 
297*6777b538SAndroid Build Coastguard Worker   // Collects the metadata of the |source|.
298*6777b538SAndroid Build Coastguard Worker   // Returns the number of histogram samples from that source.
299*6777b538SAndroid Build Coastguard Worker   static size_t CollectFileMetadataFromSource(SourceInfo* source);
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker   // Appends the samples count to pref on UI thread.
302*6777b538SAndroid Build Coastguard Worker   void AppendToSamplesCountPref(std::vector<size_t> samples_count);
303*6777b538SAndroid Build Coastguard Worker 
304*6777b538SAndroid Build Coastguard Worker   // Creates a task to check all monitored sources for updates.
305*6777b538SAndroid Build Coastguard Worker   void ScheduleSourcesCheck();
306*6777b538SAndroid Build Coastguard Worker 
307*6777b538SAndroid Build Coastguard Worker   // Takes a list of sources checked by an external task and determines what
308*6777b538SAndroid Build Coastguard Worker   // to do with each. Virtual for testing.
309*6777b538SAndroid Build Coastguard Worker   virtual void RecordSourcesChecked(SourceInfoList* checked,
310*6777b538SAndroid Build Coastguard Worker                                     std::vector<size_t> samples_counts);
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker   // Schedules the deletion of a file in the background using the task-runner.
313*6777b538SAndroid Build Coastguard Worker   void DeleteFileAsync(const base::FilePath& path);
314*6777b538SAndroid Build Coastguard Worker 
315*6777b538SAndroid Build Coastguard Worker   // Updates the persistent state information to show a source as being read.
316*6777b538SAndroid Build Coastguard Worker   void RecordSourceAsRead(SourceInfo* source);
317*6777b538SAndroid Build Coastguard Worker 
318*6777b538SAndroid Build Coastguard Worker   // metrics::MetricsProvider:
319*6777b538SAndroid Build Coastguard Worker   void OnDidCreateMetricsLog() override;
320*6777b538SAndroid Build Coastguard Worker   bool HasIndependentMetrics() override;
321*6777b538SAndroid Build Coastguard Worker   void ProvideIndependentMetrics(
322*6777b538SAndroid Build Coastguard Worker       base::OnceClosure serialize_log_callback,
323*6777b538SAndroid Build Coastguard Worker       base::OnceCallback<void(bool)> done_callback,
324*6777b538SAndroid Build Coastguard Worker       ChromeUserMetricsExtension* uma_proto,
325*6777b538SAndroid Build Coastguard Worker       base::HistogramSnapshotManager* snapshot_manager) override;
326*6777b538SAndroid Build Coastguard Worker   bool HasPreviousSessionData() override;
327*6777b538SAndroid Build Coastguard Worker   void RecordInitialHistogramSnapshots(
328*6777b538SAndroid Build Coastguard Worker       base::HistogramSnapshotManager* snapshot_manager) override;
329*6777b538SAndroid Build Coastguard Worker 
330*6777b538SAndroid Build Coastguard Worker   // base::StatisticsRecorder::HistogramProvider:
331*6777b538SAndroid Build Coastguard Worker   void MergeHistogramDeltas(bool async,
332*6777b538SAndroid Build Coastguard Worker                             base::OnceClosure done_callback) override;
333*6777b538SAndroid Build Coastguard Worker 
334*6777b538SAndroid Build Coastguard Worker   // The part of ProvideIndependentMetrics that runs after background task.
335*6777b538SAndroid Build Coastguard Worker   void ProvideIndependentMetricsCleanup(
336*6777b538SAndroid Build Coastguard Worker       base::OnceCallback<void(bool)> done_callback,
337*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<SourceInfo> source,
338*6777b538SAndroid Build Coastguard Worker       bool success);
339*6777b538SAndroid Build Coastguard Worker 
340*6777b538SAndroid Build Coastguard Worker   // Simulates the independent metrics to read the first item from
341*6777b538SAndroid Build Coastguard Worker   // kMetricsBrowserMetricsMetadata and updates the stability prefs accordingly,
342*6777b538SAndroid Build Coastguard Worker   // return true if the pref isn't empty.
343*6777b538SAndroid Build Coastguard Worker   bool SimulateIndependentMetrics();
344*6777b538SAndroid Build Coastguard Worker 
345*6777b538SAndroid Build Coastguard Worker   // A list of sources not currently active that need to be checked for changes.
346*6777b538SAndroid Build Coastguard Worker   SourceInfoList sources_to_check_;
347*6777b538SAndroid Build Coastguard Worker 
348*6777b538SAndroid Build Coastguard Worker   // A list of currently active sources to be merged when required.
349*6777b538SAndroid Build Coastguard Worker   SourceInfoList sources_mapped_;
350*6777b538SAndroid Build Coastguard Worker 
351*6777b538SAndroid Build Coastguard Worker   // A list of currently active sources to be merged when required.
352*6777b538SAndroid Build Coastguard Worker   SourceInfoList sources_with_profile_;
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker   // A list of sources for a previous run. These are held separately because
355*6777b538SAndroid Build Coastguard Worker   // they are not subject to the periodic background checking that handles
356*6777b538SAndroid Build Coastguard Worker   // metrics for the current run.
357*6777b538SAndroid Build Coastguard Worker   SourceInfoList sources_for_previous_run_;
358*6777b538SAndroid Build Coastguard Worker 
359*6777b538SAndroid Build Coastguard Worker   // The preferences-service used to store persistent state about sources.
360*6777b538SAndroid Build Coastguard Worker   raw_ptr<PrefService> pref_service_;
361*6777b538SAndroid Build Coastguard Worker 
362*6777b538SAndroid Build Coastguard Worker   SEQUENCE_CHECKER(sequence_checker_);
363*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<FileMetricsProvider> weak_factory_{this};
364*6777b538SAndroid Build Coastguard Worker };
365*6777b538SAndroid Build Coastguard Worker 
366*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
367*6777b538SAndroid Build Coastguard Worker 
368*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_METRICS_FILE_METRICS_PROVIDER_H_
369