Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
power_collector.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
19#include <atomic>
20#include <chrono>
21#include <cstdint>
22#include <memory>
23#include <mutex>
24#include <string>
25#include <unordered_map>
26#include <vector>
27
30
31namespace kcenon {
32namespace monitoring {
33
39 unknown,
40 battery,
41 ac,
42 usb,
43 wireless,
44 cpu,
45 gpu,
46 memory,
47 package,
48 platform,
49 other
50};
51
56 switch (type) {
58 return "battery";
60 return "ac";
62 return "usb";
64 return "wireless";
66 return "cpu";
68 return "gpu";
70 return "memory";
72 return "package";
74 return "platform";
76 return "other";
77 default:
78 return "unknown";
79 }
80}
81
87 std::string id;
88 std::string name;
89 std::string path;
91};
92
99
100 // Power metrics
101 double power_watts{0.0};
102 double energy_joules{0.0};
103 double power_limit_watts{0.0};
104
105 // Voltage metrics
106 double voltage_volts{0.0};
107
108 // Battery-specific metrics
109 double battery_percent{0.0};
112 bool is_charging{false};
113 bool is_discharging{false};
114 bool is_full{false};
115
116 // Availability flags
117 bool power_available{false};
118 bool battery_available{false};
119 bool limits_available{false};
120
121 std::chrono::system_clock::time_point timestamp;
122};
123
124// Forward declaration
125namespace platform {
126class metrics_provider;
127} // namespace platform
128
137 public:
140
141 // Non-copyable, non-moveable due to internal state
146
151 bool is_power_available() const;
152
157 std::vector<power_source_info> enumerate_sources();
158
163 std::vector<power_reading> read_all_power();
164
165 private:
166 std::unique_ptr<platform::metrics_provider> provider_;
167};
168
178 public:
180 ~power_collector() override = default;
181
182 // Non-copyable, non-moveable due to internal state
187
188 // collector_plugin implementation
189 auto name() const -> std::string_view override { return "power"; }
190 auto collect() -> std::vector<metric> override;
191 auto interval() const -> std::chrono::milliseconds override { return std::chrono::seconds(10); }
192 auto is_available() const -> bool override;
193 auto get_metric_types() const -> std::vector<std::string> override;
194
195 auto get_metadata() const -> plugin_metadata override {
196 return plugin_metadata{
197 .name = name(),
198 .description = "Power consumption metrics from various sources",
199 .category = plugin_category::hardware,
200 .version = "1.0.0",
201 .dependencies = {},
202 .requires_platform_support = true
203 };
204 }
205
206 auto initialize(const config_map& config) -> bool override;
207 void shutdown() override {}
208 auto get_statistics() const -> stats_map override;
209
214 std::vector<power_reading> get_last_readings() const;
215
220 bool is_power_available() const;
221
222 private:
224
225 // Configuration
226 bool enabled_{true};
228 bool collect_rapl_{true};
229
230 // Statistics
231 mutable std::mutex stats_mutex_;
232 std::atomic<size_t> collection_count_{0};
233 std::atomic<size_t> collection_errors_{0};
234 std::atomic<size_t> sources_found_{0};
235 std::vector<power_reading> last_readings_;
236
237 // Helper methods
238 metric create_metric(const std::string& name, double value, const power_reading& reading,
239 const std::string& unit = "") const;
240 void add_source_metrics(std::vector<metric>& metrics, const power_reading& reading);
241};
242
243} // namespace monitoring
244} // namespace kcenon
Pure virtual interface for metric collector plugins.
Power consumption monitoring collector implementing collector_plugin interface.
power_collector(power_collector &&)=delete
auto name() const -> std::string_view override
Get the unique name of this plugin.
std::vector< power_reading > last_readings_
auto get_metadata() const -> plugin_metadata override
Get plugin metadata.
auto get_statistics() const -> stats_map override
Get plugin statistics.
auto collect() -> std::vector< metric > override
Collect current metrics from this plugin.
std::unique_ptr< power_info_collector > collector_
auto is_available() const -> bool override
Check if this plugin is available on the current system.
std::atomic< size_t > collection_count_
auto initialize(const config_map &config) -> bool override
Initialize plugin with configuration.
void add_source_metrics(std::vector< metric > &metrics, const power_reading &reading)
power_collector & operator=(const power_collector &)=delete
metric create_metric(const std::string &name, double value, const power_reading &reading, const std::string &unit="") const
std::vector< power_reading > get_last_readings() const
power_collector & operator=(power_collector &&)=delete
power_collector(const power_collector &)=delete
std::atomic< size_t > collection_errors_
void shutdown() override
Shutdown plugin and release resources.
auto get_metric_types() const -> std::vector< std::string > override
Get supported metric types.
auto interval() const -> std::chrono::milliseconds override
Get the collection interval for this plugin.
Power data collector using platform abstraction layer.
power_info_collector & operator=(power_info_collector &&)=delete
std::vector< power_reading > read_all_power()
power_info_collector(power_info_collector &&)=delete
power_info_collector(const power_info_collector &)=delete
std::unique_ptr< platform::metrics_provider > provider_
std::vector< power_source_info > enumerate_sources()
power_info_collector & operator=(const power_info_collector &)=delete
Plugin interface for metric collectors.
Adapter for metric types to support interface definitions.
std::unordered_map< std::string, double > stats_map
Type alias for statistics map.
@ hardware
Hardware sensors (GPU, temperature, battery, power)
std::string power_source_type_to_string(power_source_type type)
Convert power_source_type to string representation.
std::unordered_map< std::string, std::string > config_map
Type alias for configuration map.
power_source_type
Type of power source.
@ platform
Platform/system power domain.
@ other
Other power source type.
@ unknown
Unknown power source type.
@ memory
Memory/DRAM power domain (RAPL)
@ cpu
CPU power domain (RAPL)
@ ac
AC adapter / mains power.
@ package
Processor package power domain (RAPL)
Basic metric structure for interface compatibility.
Metadata describing a collector plugin.
A single power reading from a source.
bool is_full
True if battery is fully charged.
bool power_available
Whether power metrics are available.
bool is_discharging
True if battery is discharging.
double battery_percent
Battery charge percentage (0-100)
double voltage_volts
Current voltage in Volts.
bool is_charging
True if battery is charging.
double power_limit_watts
Power limit/TDP in Watts (if available)
power_source_info source
Power source information.
double battery_charge_rate
Charging/discharging rate in Watts.
double energy_joules
Cumulative energy consumed in Joules.
double power_watts
Current power consumption in Watts.
std::chrono::system_clock::time_point timestamp
Reading timestamp.
bool limits_available
Whether power limit info is available.
bool battery_available
Whether battery metrics are available.
double battery_capacity_wh
Battery capacity in Watt-hours.
Information about a power source.
power_source_type type
Power source type classification.
std::string id
Unique source identifier.
std::string path
Platform-specific path (e.g., /sys/class/power_supply/BAT0)
std::string name
Human-readable source name.