xref: /aosp_15_r20/external/cronet/components/metrics/drive_metrics_provider.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 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_DRIVE_METRICS_PROVIDER_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_DRIVE_METRICS_PROVIDER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h"
12*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_provider.h"
13*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/system_profile.pb.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker class FilePath;
17*6777b538SAndroid Build Coastguard Worker }
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace metrics {
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker // Provides metrics about the local drives on a user's computer. Currently only
22*6777b538SAndroid Build Coastguard Worker // checks to see if they incur a seek-time penalty (e.g. if they're SSDs).
23*6777b538SAndroid Build Coastguard Worker class DriveMetricsProvider : public metrics::MetricsProvider {
24*6777b538SAndroid Build Coastguard Worker  public:
25*6777b538SAndroid Build Coastguard Worker   explicit DriveMetricsProvider(int local_state_path_key);
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker   DriveMetricsProvider(const DriveMetricsProvider&) = delete;
28*6777b538SAndroid Build Coastguard Worker   DriveMetricsProvider& operator=(const DriveMetricsProvider&) = delete;
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker   ~DriveMetricsProvider() override;
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker   // metrics::MetricsProvider:
33*6777b538SAndroid Build Coastguard Worker   void AsyncInit(base::OnceClosure done_callback) override;
34*6777b538SAndroid Build Coastguard Worker   void ProvideSystemProfileMetrics(
35*6777b538SAndroid Build Coastguard Worker       metrics::SystemProfileProto* system_profile_proto) override;
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker  private:
38*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(DriveMetricsProviderTest, HasSeekPenalty);
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   // A response to querying a drive as to whether it incurs a seek penalty.
41*6777b538SAndroid Build Coastguard Worker   // |has_seek_penalty| is set if |success| is true.
42*6777b538SAndroid Build Coastguard Worker   struct SeekPenaltyResponse {
43*6777b538SAndroid Build Coastguard Worker     SeekPenaltyResponse();
44*6777b538SAndroid Build Coastguard Worker     bool success;
45*6777b538SAndroid Build Coastguard Worker     bool has_seek_penalty;
46*6777b538SAndroid Build Coastguard Worker   };
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   struct DriveMetrics {
49*6777b538SAndroid Build Coastguard Worker     SeekPenaltyResponse app_drive;
50*6777b538SAndroid Build Coastguard Worker     SeekPenaltyResponse user_data_drive;
51*6777b538SAndroid Build Coastguard Worker   };
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker   // Determine whether the device that services |path| has a seek penalty.
54*6777b538SAndroid Build Coastguard Worker   // Returns false if it couldn't be determined (e.g., |path| doesn't exist).
55*6777b538SAndroid Build Coastguard Worker   static bool HasSeekPenalty(const base::FilePath& path,
56*6777b538SAndroid Build Coastguard Worker                              bool* has_seek_penalty);
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   // Gather metrics about various drives. Should be run on a background thread.
59*6777b538SAndroid Build Coastguard Worker   static DriveMetrics GetDriveMetricsOnBackgroundThread(
60*6777b538SAndroid Build Coastguard Worker       int local_state_path_key);
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Tries to determine whether there is a penalty for seeking on the drive that
63*6777b538SAndroid Build Coastguard Worker   // hosts |path_service_key| (for example: the drive that holds "Local State").
64*6777b538SAndroid Build Coastguard Worker   static void QuerySeekPenalty(int path_service_key,
65*6777b538SAndroid Build Coastguard Worker                                SeekPenaltyResponse* response);
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   // Called when metrics are done being gathered asynchronously.
68*6777b538SAndroid Build Coastguard Worker   // |done_callback| is the callback that should be called once all metrics are
69*6777b538SAndroid Build Coastguard Worker   // gathered.
70*6777b538SAndroid Build Coastguard Worker   void GotDriveMetrics(base::OnceClosure done_callback,
71*6777b538SAndroid Build Coastguard Worker                        const DriveMetrics& metrics);
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   // Fills |drive| with information from successful |response|s.
74*6777b538SAndroid Build Coastguard Worker   void FillDriveMetrics(const SeekPenaltyResponse& response,
75*6777b538SAndroid Build Coastguard Worker                         metrics::SystemProfileProto::Hardware::Drive* drive);
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   // The key to give to base::PathService to obtain the path to local state
78*6777b538SAndroid Build Coastguard Worker   // (supplied by the embedder).
79*6777b538SAndroid Build Coastguard Worker   int local_state_path_key_;
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   // Information gathered about various important drives.
82*6777b538SAndroid Build Coastguard Worker   DriveMetrics metrics_;
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   SEQUENCE_CHECKER(sequence_checker_);
85*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<DriveMetricsProvider> weak_ptr_factory_{this};
86*6777b538SAndroid Build Coastguard Worker };
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_METRICS_DRIVE_METRICS_PROVIDER_H_
91