1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_
6 #define COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_
11 #include "base/threading/sequence_bound.h"
12 #include "base/time/time.h"
13 #include "base/timer/timer.h"
14 #include "base/trace_event/trace_log.h"
15 #include "components/power_metrics/energy_metrics_provider.h"
17 namespace power_metrics {
19 // A delegate to isolate System Power Monitor functionality mainly for
21 class SystemPowerMonitorDelegate {
23 SystemPowerMonitorDelegate();
25 SystemPowerMonitorDelegate(const SystemPowerMonitorDelegate&) = delete;
26 SystemPowerMonitorDelegate& operator=(const SystemPowerMonitorDelegate&) =
29 virtual ~SystemPowerMonitorDelegate();
31 // Emits trace counter. The metric string stands for trace counter name,
32 // timestamp is the counter timestamp, power is the corresponding counter
33 // value of system power consumption in units of milliwatts.
34 virtual void RecordSystemPower(const char* metric,
35 base::TimeTicks timestamp,
38 // Returns whether the tracing category is enabled to determine if we should
40 virtual bool IsTraceCategoryEnabled() const;
43 // Manages a timer to regularly sample and emit trace events, whose start and
44 // stop are controlled by System Power Monitor.
45 class SystemPowerMonitorHelper {
47 // Default sampling interval, which should be set to larger or equal to 50 ms.
48 static constexpr base::TimeDelta kDefaultSampleInterval =
49 base::Milliseconds(50);
51 SystemPowerMonitorHelper(
52 std::unique_ptr<EnergyMetricsProvider> provider,
53 std::unique_ptr<SystemPowerMonitorDelegate> delegate);
55 SystemPowerMonitorHelper(const SystemPowerMonitorHelper&) = delete;
56 SystemPowerMonitorHelper& operator=(const SystemPowerMonitorHelper&) = delete;
58 ~SystemPowerMonitorHelper();
64 bool IsTimerRunningForTesting();
67 std::vector<const char*> valid_metrics_;
68 EnergyMetricsProvider::EnergyMetrics last_sample_;
69 base::TimeTicks last_timestamp_;
70 base::RepeatingTimer timer_;
72 // Used to derive instant system energy metrics.
73 std::unique_ptr<EnergyMetricsProvider> provider_;
74 std::unique_ptr<SystemPowerMonitorDelegate> delegate_;
77 // Monitors system-wide power consumption. Gets data from EnergyMetricsProvider.
78 class SystemPowerMonitor
79 : public base::trace_event::TraceLog::EnabledStateObserver {
83 SystemPowerMonitor(const SystemPowerMonitor&) = delete;
84 SystemPowerMonitor& operator=(const SystemPowerMonitor&) = delete;
86 ~SystemPowerMonitor() override;
88 static SystemPowerMonitor* GetInstance();
90 // TraceLog::EnabledStateObserver.
91 void OnTraceLogEnabled() override;
92 void OnTraceLogDisabled() override;
95 friend class SystemPowerMonitorTest;
97 SystemPowerMonitor(std::unique_ptr<EnergyMetricsProvider> provider,
98 std::unique_ptr<SystemPowerMonitorDelegate> delegate);
100 base::SequenceBound<SystemPowerMonitorHelper>* GetHelperForTesting();
102 base::SequenceBound<SystemPowerMonitorHelper> helper_;
105 } // namespace power_metrics
107 #endif // COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_