1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 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_STRUCTURED_EXTERNAL_METRICS_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_STRUCTURED_EXTERNAL_METRICS_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/containers/flat_set.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace metrics::structured { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker class EventsProto; 19*6777b538SAndroid Build Coastguard Worker class ExternalMetricsTest; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // ExternalMetrics reads structured metrics saved by Chrome OS and uploads them 22*6777b538SAndroid Build Coastguard Worker // to the UMA server on its behalf. This is structured metrics' equivalent of 23*6777b538SAndroid Build Coastguard Worker // `ash::ExternalMetrics`. 24*6777b538SAndroid Build Coastguard Worker // 25*6777b538SAndroid Build Coastguard Worker // Chrome periodically reads a directory of protos and adds their content into 26*6777b538SAndroid Build Coastguard Worker // the StructuredMetricProvider's regular metrics upload. After reading each 27*6777b538SAndroid Build Coastguard Worker // file, it is deleted. Chrome and ChromeOS use flock to prevent concurrent 28*6777b538SAndroid Build Coastguard Worker // read/writes. 29*6777b538SAndroid Build Coastguard Worker class ExternalMetrics { 30*6777b538SAndroid Build Coastguard Worker public: 31*6777b538SAndroid Build Coastguard Worker using MetricsCollectedCallback = 32*6777b538SAndroid Build Coastguard Worker base::RepeatingCallback<void(const EventsProto&)>; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker ExternalMetrics(const base::FilePath& events_directory, 35*6777b538SAndroid Build Coastguard Worker const base::TimeDelta& collection_interval, 36*6777b538SAndroid Build Coastguard Worker MetricsCollectedCallback callback); 37*6777b538SAndroid Build Coastguard Worker ~ExternalMetrics(); 38*6777b538SAndroid Build Coastguard Worker ExternalMetrics(const ExternalMetrics&) = delete; 39*6777b538SAndroid Build Coastguard Worker ExternalMetrics& operator=(const ExternalMetrics&) = delete; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker // Adds a project to the disallowed list for testing. 42*6777b538SAndroid Build Coastguard Worker void AddDisallowedProjectForTest(uint64_t project_name_hash); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker void EnableRecording(); 45*6777b538SAndroid Build Coastguard Worker void DisableRecording(); 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker private: 48*6777b538SAndroid Build Coastguard Worker friend class ExternalMetricsTest; 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker void ScheduleCollector(); 51*6777b538SAndroid Build Coastguard Worker void CollectEventsAndReschedule(); 52*6777b538SAndroid Build Coastguard Worker void CollectEvents(); 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // Builds a cache of disallow projects from the Finch controlled variable. 55*6777b538SAndroid Build Coastguard Worker void CacheDisallowedProjectsSet(); 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker bool recording_enabled_ = false; 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker const base::FilePath events_directory_; 60*6777b538SAndroid Build Coastguard Worker const base::TimeDelta collection_interval_; 61*6777b538SAndroid Build Coastguard Worker MetricsCollectedCallback callback_; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker // A set of projects that are not allowed to be recorded. This is a cache of 64*6777b538SAndroid Build Coastguard Worker // GetDisabledProjects(). 65*6777b538SAndroid Build Coastguard Worker base::flat_set<uint64_t> disallowed_projects_; 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> task_runner_; 68*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<ExternalMetrics> weak_factory_{this}; 69*6777b538SAndroid Build Coastguard Worker }; 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker } // namespace metrics::structured 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_METRICS_STRUCTURED_EXTERNAL_METRICS_H_ 74