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