xref: /aosp_15_r20/external/cronet/components/metrics/structured/external_metrics.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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