Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
system_collectors_example.cpp File Reference

Demonstrates unified system collectors usage. More...

Include dependency graph for system_collectors_example.cpp:

Go to the source code of this file.

Functions

void display_system_metrics (const system_resources &resources)
 
void display_network_collector_metrics (const std::vector< metric > &metrics)
 
void display_process_collector_metrics (const std::vector< metric > &metrics)
 
int main ()
 

Detailed Description

Demonstrates unified system collectors usage.

Definition in file system_collectors_example.cpp.

Function Documentation

◆ display_network_collector_metrics()

void display_network_collector_metrics ( const std::vector< metric > & metrics)

Display network metrics from network_metrics_collector

Examples
system_collectors_example.cpp.

Definition at line 109 of file system_collectors_example.cpp.

109 {
110 std::cout << "\n=== Network Collector Metrics ===" << std::endl;
111
112 for (const auto& m : metrics) {
113 std::cout << " " << m.name << ": ";
114 std::visit([](const auto& val) { std::cout << val; }, m.value);
115 auto unit_it = m.tags.find("unit");
116 if (unit_it != m.tags.end() && !unit_it->second.empty()) {
117 std::cout << " " << unit_it->second;
118 }
119 std::cout << std::endl;
120 }
121}

Referenced by main().

Here is the caller graph for this function:

◆ display_process_collector_metrics()

void display_process_collector_metrics ( const std::vector< metric > & metrics)

Display process metrics from process_metrics_collector

Examples
system_collectors_example.cpp.

Definition at line 126 of file system_collectors_example.cpp.

126 {
127 std::cout << "\n=== Process Collector Metrics ===" << std::endl;
128
129 for (const auto& m : metrics) {
130 std::cout << " " << m.name << ": ";
131 std::visit([](const auto& val) { std::cout << val; }, m.value);
132 auto unit_it = m.tags.find("unit");
133 if (unit_it != m.tags.end() && !unit_it->second.empty()) {
134 std::cout << " " << unit_it->second;
135 }
136 std::cout << std::endl;
137 }
138}

Referenced by main().

Here is the caller graph for this function:

◆ display_system_metrics()

void display_system_metrics ( const system_resources & resources)

Display system resource metrics in a formatted manner

Examples
system_collectors_example.cpp.

Definition at line 42 of file system_collectors_example.cpp.

42 {
43 std::cout << "\n=== System Resource Metrics ===" << std::endl;
44
45 // CPU metrics
46 std::cout << "CPU:" << std::endl;
47 std::cout << " Usage: " << std::fixed << std::setprecision(2)
48 << resources.cpu.usage_percent << "%" << std::endl;
49 std::cout << " User: " << resources.cpu.user_percent << "%" << std::endl;
50 std::cout << " System: " << resources.cpu.system_percent << "%" << std::endl;
51 std::cout << " Idle: " << resources.cpu.idle_percent << "%" << std::endl;
52 std::cout << " Core Count: " << resources.cpu.count << std::endl;
53 std::cout << " Load Average: "
54 << resources.cpu.load.one_min << " (1m), "
55 << resources.cpu.load.five_min << " (5m), "
56 << resources.cpu.load.fifteen_min << " (15m)" << std::endl;
57
58 // Memory metrics
59 std::cout << "\nMemory:" << std::endl;
60 std::cout << " Total: " << (resources.memory.total_bytes / (1024.0 * 1024.0 * 1024.0))
61 << " GB" << std::endl;
62 std::cout << " Used: " << (resources.memory.used_bytes / (1024.0 * 1024.0 * 1024.0))
63 << " GB (" << resources.memory.usage_percent << "%)" << std::endl;
64 std::cout << " Available: " << (resources.memory.available_bytes / (1024.0 * 1024.0 * 1024.0))
65 << " GB" << std::endl;
66 std::cout << " Swap Used: " << (resources.memory.swap.used_bytes / (1024.0 * 1024.0 * 1024.0))
67 << " GB (" << resources.memory.swap.usage_percent << "%)" << std::endl;
68
69 // Disk metrics
70 std::cout << "\nDisk:" << std::endl;
71 std::cout << " Total: " << (resources.disk.total_bytes / (1024.0 * 1024.0 * 1024.0))
72 << " GB" << std::endl;
73 std::cout << " Used: " << (resources.disk.used_bytes / (1024.0 * 1024.0 * 1024.0))
74 << " GB (" << resources.disk.usage_percent << "%)" << std::endl;
75 std::cout << " I/O Read: " << (resources.disk.io.read_bytes_per_sec / (1024.0 * 1024.0))
76 << " MB/s (" << resources.disk.io.read_ops_per_sec << " ops/s)" << std::endl;
77 std::cout << " I/O Write: " << (resources.disk.io.write_bytes_per_sec / (1024.0 * 1024.0))
78 << " MB/s (" << resources.disk.io.write_ops_per_sec << " ops/s)" << std::endl;
79
80 // Network metrics
81 std::cout << "\nNetwork:" << std::endl;
82 std::cout << " RX: " << (resources.network.rx_bytes_per_sec / (1024.0 * 1024.0))
83 << " MB/s (" << resources.network.rx_packets_per_sec << " packets/s)" << std::endl;
84 std::cout << " TX: " << (resources.network.tx_bytes_per_sec / (1024.0 * 1024.0))
85 << " MB/s (" << resources.network.tx_packets_per_sec << " packets/s)" << std::endl;
86 std::cout << " Errors: RX=" << resources.network.rx_errors
87 << ", TX=" << resources.network.tx_errors << std::endl;
88 std::cout << " Dropped: RX=" << resources.network.rx_dropped
89 << ", TX=" << resources.network.tx_dropped << std::endl;
90
91 // Process metrics
92 std::cout << "\nProcess:" << std::endl;
93 std::cout << " Count: " << resources.process.count << std::endl;
94 std::cout << " Threads: " << resources.process.thread_count << std::endl;
95 std::cout << " Handles: " << resources.process.handle_count << std::endl;
96 std::cout << " Open FDs: " << resources.process.open_file_descriptors << std::endl;
97
98 // Context switches
99 std::cout << "\nContext Switches:" << std::endl;
100 std::cout << " Total: " << resources.context_switches.total << std::endl;
101 std::cout << " Per Second: " << resources.context_switches.per_sec << std::endl;
102 std::cout << " Voluntary: " << resources.context_switches.voluntary << std::endl;
103 std::cout << " Non-voluntary: " << resources.context_switches.nonvoluntary << std::endl;
104}
struct kcenon::monitoring::system_resources::cpu_metrics::load_average load
struct kcenon::monitoring::system_resources::disk_metrics::io_throughput io
struct kcenon::monitoring::system_resources::memory_metrics::swap_info swap
struct kcenon::monitoring::system_resources::memory_metrics memory
struct kcenon::monitoring::system_resources::cpu_metrics cpu
struct kcenon::monitoring::system_resources::process_metrics process
struct kcenon::monitoring::system_resources::disk_metrics disk
struct kcenon::monitoring::system_resources::network_metrics network
struct kcenon::monitoring::system_resources::context_switch_metrics context_switches

References kcenon::monitoring::system_resources::memory_metrics::available_bytes, kcenon::monitoring::system_resources::context_switches, kcenon::monitoring::system_resources::cpu_metrics::count, kcenon::monitoring::system_resources::process_metrics::count, kcenon::monitoring::system_resources::cpu, kcenon::monitoring::system_resources::disk, kcenon::monitoring::system_resources::cpu_metrics::load_average::fifteen_min, kcenon::monitoring::system_resources::cpu_metrics::load_average::five_min, kcenon::monitoring::system_resources::process_metrics::handle_count, kcenon::monitoring::system_resources::cpu_metrics::idle_percent, kcenon::monitoring::system_resources::disk_metrics::io, kcenon::monitoring::system_resources::cpu_metrics::load, kcenon::monitoring::system_resources::memory, kcenon::monitoring::system_resources::network, kcenon::monitoring::system_resources::context_switch_metrics::nonvoluntary, kcenon::monitoring::system_resources::cpu_metrics::load_average::one_min, kcenon::monitoring::system_resources::process_metrics::open_file_descriptors, kcenon::monitoring::system_resources::context_switch_metrics::per_sec, kcenon::monitoring::system_resources::process, kcenon::monitoring::system_resources::disk_metrics::io_throughput::read_bytes_per_sec, kcenon::monitoring::system_resources::disk_metrics::io_throughput::read_ops_per_sec, kcenon::monitoring::system_resources::network_metrics::rx_bytes_per_sec, kcenon::monitoring::system_resources::network_metrics::rx_dropped, kcenon::monitoring::system_resources::network_metrics::rx_errors, kcenon::monitoring::system_resources::network_metrics::rx_packets_per_sec, kcenon::monitoring::system_resources::memory_metrics::swap, kcenon::monitoring::system_resources::cpu_metrics::system_percent, kcenon::monitoring::system_resources::process_metrics::thread_count, kcenon::monitoring::system_resources::context_switch_metrics::total, kcenon::monitoring::system_resources::disk_metrics::total_bytes, kcenon::monitoring::system_resources::memory_metrics::total_bytes, kcenon::monitoring::system_resources::network_metrics::tx_bytes_per_sec, kcenon::monitoring::system_resources::network_metrics::tx_dropped, kcenon::monitoring::system_resources::network_metrics::tx_errors, kcenon::monitoring::system_resources::network_metrics::tx_packets_per_sec, kcenon::monitoring::system_resources::cpu_metrics::usage_percent, kcenon::monitoring::system_resources::disk_metrics::usage_percent, kcenon::monitoring::system_resources::memory_metrics::swap_info::usage_percent, kcenon::monitoring::system_resources::memory_metrics::usage_percent, kcenon::monitoring::system_resources::disk_metrics::used_bytes, kcenon::monitoring::system_resources::memory_metrics::swap_info::used_bytes, kcenon::monitoring::system_resources::memory_metrics::used_bytes, kcenon::monitoring::system_resources::cpu_metrics::user_percent, kcenon::monitoring::system_resources::context_switch_metrics::voluntary, kcenon::monitoring::system_resources::disk_metrics::io_throughput::write_bytes_per_sec, and kcenon::monitoring::system_resources::disk_metrics::io_throughput::write_ops_per_sec.

Referenced by main().

Here is the caller graph for this function:

◆ main()

int main ( )

Definition at line 140 of file system_collectors_example.cpp.

140 {
141 std::cout << "=== System Collectors Example ===" << std::endl;
142
143 try {
144 // Step 1: Create and configure system_resource_collector
145 std::cout << "\n1. Creating system_resource_collector..." << std::endl;
146
147 system_metrics_config sys_config;
148 sys_config.collect_cpu = true;
149 sys_config.collect_memory = true;
150 sys_config.collect_disk = true;
151 sys_config.collect_network = true;
152 sys_config.collect_process = true;
153 sys_config.enable_load_history = true;
154 sys_config.load_history_max_samples = 100;
155 sys_config.interval = std::chrono::milliseconds(1000);
156
157 system_resource_collector sys_collector(sys_config);
158
159 // Initialize the collector
160 std::unordered_map<std::string, std::string> init_config;
161 if (!sys_collector.initialize(init_config)) {
162 std::cerr << "Failed to initialize system_resource_collector" << std::endl;
163 return 1;
164 }
165
166 std::cout << " Initialized: " << sys_collector.get_name() << std::endl;
167 std::cout << " Health: " << (sys_collector.is_healthy() ? "OK" : "UNHEALTHY") << std::endl;
168
169 // Step 2: Create network_metrics_collector
170 std::cout << "\n2. Creating network_metrics_collector..." << std::endl;
171
172 network_metrics_collector net_collector;
173 if (!net_collector.initialize(init_config)) {
174 std::cerr << "Failed to initialize network_metrics_collector" << std::endl;
175 return 1;
176 }
177
178 std::cout << " Initialized: " << net_collector.name() << std::endl;
179 std::cout << " Health: " << (net_collector.is_available() ? "OK" : "UNHEALTHY") << std::endl;
180
181 // Step 3: Create process_metrics_collector
182 std::cout << "\n3. Creating process_metrics_collector..." << std::endl;
183
184 process_metrics_collector proc_collector;
185 if (!proc_collector.initialize(init_config)) {
186 std::cerr << "Failed to initialize process_metrics_collector" << std::endl;
187 return 1;
188 }
189
190 std::cout << " Initialized: " << proc_collector.name() << std::endl;
191 std::cout << " Health: " << (proc_collector.is_available() ? "OK" : "UNHEALTHY") << std::endl;
192
193#ifdef THREAD_SYSTEM_AVAILABLE
194 // Step 4: Create thread_system_collector (if available)
195 std::cout << "\n4. Creating thread_system_collector..." << std::endl;
196
197 thread_system_collector thread_collector;
198 if (!thread_collector.initialize(init_config)) {
199 std::cerr << "Failed to initialize thread_system_collector" << std::endl;
200 return 1;
201 }
202
203 std::cout << " Initialized: " << thread_collector.name() << std::endl;
204 std::cout << " Health: " << (thread_collector.is_available() ? "OK" : "UNHEALTHY") << std::endl;
205#else
206 std::cout << "\n4. thread_system_collector not available (THREAD_SYSTEM_AVAILABLE not defined)" << std::endl;
207#endif
208
209#ifdef LOGGER_SYSTEM_AVAILABLE
210 // Step 5: Create logger_system_collector (if available)
211 std::cout << "\n5. Creating logger_system_collector..." << std::endl;
212
213 logger_system_collector logger_collector;
214 if (!logger_collector.initialize(init_config)) {
215 std::cerr << "Failed to initialize logger_system_collector" << std::endl;
216 return 1;
217 }
218
219 std::cout << " Initialized: " << logger_collector.name() << std::endl;
220 std::cout << " Health: " << (logger_collector.is_available() ? "OK" : "UNHEALTHY") << std::endl;
221#else
222 std::cout << "\n5. logger_system_collector not available (LOGGER_SYSTEM_AVAILABLE not defined)" << std::endl;
223#endif
224
225 // Step 6: Collector lifecycle demonstration
226 std::cout << "\n6. Demonstrating collector lifecycle (3 iterations)..." << std::endl;
227
228 for (int i = 0; i < 3; ++i) {
229 std::cout << "\n--- Iteration " << (i + 1) << "/3 ---" << std::endl;
230
231 // Collect system resources
232 auto sys_metrics = sys_collector.collect();
233 std::cout << "System metrics collected: " << sys_metrics.size() << std::endl;
234
235 // Get last collected resources for detailed display
236 auto resources = sys_collector.get_last_resources();
237 display_system_metrics(resources);
238
239 // Collect network metrics
240 auto net_metrics = net_collector.collect();
241 std::cout << "Network metrics collected: " << net_metrics.size() << std::endl;
243
244 // Collect process metrics
245 auto proc_metrics = proc_collector.collect();
246 std::cout << "Process metrics collected: " << proc_metrics.size() << std::endl;
248
249#ifdef THREAD_SYSTEM_AVAILABLE
250 // Collect thread system metrics
251 auto thread_metrics = thread_collector.collect();
252 std::cout << "Thread system metrics collected: " << thread_metrics.size() << std::endl;
253#endif
254
255#ifdef LOGGER_SYSTEM_AVAILABLE
256 // Collect logger system metrics
257 auto logger_metrics = logger_collector.collect();
258 std::cout << "Logger system metrics collected: " << logger_metrics.size() << std::endl;
259#endif
260
261 // Wait before next collection
262 if (i < 2) {
263 std::cout << "\nWaiting 2 seconds before next collection..." << std::endl;
264 std::this_thread::sleep_for(2s);
265 }
266 }
267
268 // Step 7: Display collector statistics
269 std::cout << "\n7. Collector Statistics:" << std::endl;
270
271 auto sys_stats = sys_collector.get_statistics();
272 std::cout << "\nSystem Resource Collector:" << std::endl;
273 for (const auto& [key, value] : sys_stats) {
274 std::cout << " " << key << ": " << value << std::endl;
275 }
276
277 auto net_stats = net_collector.get_statistics();
278 std::cout << "\nNetwork Metrics Collector:" << std::endl;
279 for (const auto& [key, value] : net_stats) {
280 std::cout << " " << key << ": " << value << std::endl;
281 }
282
283 auto proc_stats = proc_collector.get_statistics();
284 std::cout << "\nProcess Metrics Collector:" << std::endl;
285 for (const auto& [key, value] : proc_stats) {
286 std::cout << " " << key << ": " << value << std::endl;
287 }
288
289 // Step 8: Load history demonstration (if enabled)
290 if (sys_config.enable_load_history) {
291 std::cout << "\n8. Load Average History:" << std::endl;
292
293 auto load_history = sys_collector.get_all_load_history();
294 std::cout << " Total samples: " << load_history.size() << std::endl;
295
296 if (!load_history.empty()) {
297 auto load_stats = sys_collector.get_all_load_statistics();
298 std::cout << " 1-min avg: " << load_stats.load_1m_stats.avg << std::endl;
299 std::cout << " 5-min avg: " << load_stats.load_5m_stats.avg << std::endl;
300 std::cout << " 15-min avg: " << load_stats.load_15m_stats.avg << std::endl;
301 }
302 }
303
304 std::cout << "\n=== Example completed successfully ===" << std::endl;
305
306 } catch (const std::exception& e) {
307 std::cerr << "Exception: " << e.what() << std::endl;
308 return 1;
309 }
310
311 return 0;
312}
Unified network metrics collector implementing collector_plugin interface.
auto collect() -> std::vector< metric > override
Collect current metrics from this plugin.
auto is_available() const -> bool override
Check if this plugin is available on the current system.
auto initialize(const config_map &config) -> bool override
auto get_statistics() const -> stats_map override
auto name() const -> std::string_view override
Get the unique name of this plugin.
Unified process-level metrics collector.
bool initialize(const config_map &config) override
Initialize plugin with configuration.
auto collect() -> std::vector< metric > override
Collect current metrics from this plugin.
auto get_statistics() const -> stats_map override
auto is_available() const -> bool override
Check if this plugin is available on the current system.
auto name() const -> std::string_view override
Get the unique name of this plugin.
void display_network_collector_metrics(const std::vector< metric > &metrics)
void display_process_collector_metrics(const std::vector< metric > &metrics)
void display_system_metrics(const system_resources &resources)

References kcenon::monitoring::time_series_statistics::avg, kcenon::monitoring::network_metrics_collector::collect(), kcenon::monitoring::process_metrics_collector::collect(), kcenon::monitoring::system_resource_collector::collect(), kcenon::monitoring::system_metrics_config::collect_cpu, kcenon::monitoring::system_metrics_config::collect_disk, kcenon::monitoring::system_metrics_config::collect_memory, kcenon::monitoring::system_metrics_config::collect_network, kcenon::monitoring::system_metrics_config::collect_process, display_network_collector_metrics(), display_process_collector_metrics(), display_system_metrics(), kcenon::monitoring::system_metrics_config::enable_load_history, kcenon::monitoring::system_resource_collector::get_all_load_history(), kcenon::monitoring::system_resource_collector::get_all_load_statistics(), kcenon::monitoring::system_resource_collector::get_last_resources(), kcenon::monitoring::system_resource_collector::get_name(), kcenon::monitoring::network_metrics_collector::get_statistics(), kcenon::monitoring::process_metrics_collector::get_statistics(), kcenon::monitoring::system_resource_collector::get_statistics(), kcenon::monitoring::network_metrics_collector::initialize(), kcenon::monitoring::process_metrics_collector::initialize(), kcenon::monitoring::system_resource_collector::initialize(), kcenon::monitoring::system_metrics_config::interval, kcenon::monitoring::network_metrics_collector::is_available(), kcenon::monitoring::process_metrics_collector::is_available(), kcenon::monitoring::system_resource_collector::is_healthy(), kcenon::monitoring::load_average_statistics::load_1m_stats, kcenon::monitoring::system_metrics_config::load_history_max_samples, kcenon::monitoring::network_metrics_collector::name(), and kcenon::monitoring::process_metrics_collector::name().

Here is the call graph for this function: