#include <iostream>
#include <thread>
#include <chrono>
#include <iomanip>
#ifdef THREAD_SYSTEM_AVAILABLE
#endif
#ifdef LOGGER_SYSTEM_AVAILABLE
#endif
using namespace std::chrono_literals;
std::cout << "\n=== System Resource Metrics ===" << std::endl;
std::cout << "CPU:" << std::endl;
std::cout << " Usage: " << std::fixed << std::setprecision(2)
std::cout <<
" Core Count: " << resources.
cpu.
count << std::endl;
std::cout << " Load Average: "
std::cout << "\nMemory:" << std::endl;
std::cout <<
" Total: " << (resources.
memory.
total_bytes / (1024.0 * 1024.0 * 1024.0))
<< " GB" << std::endl;
std::cout <<
" Used: " << (resources.
memory.
used_bytes / (1024.0 * 1024.0 * 1024.0))
<< " GB" << std::endl;
std::cout << "\nDisk:" << std::endl;
std::cout <<
" Total: " << (resources.
disk.
total_bytes / (1024.0 * 1024.0 * 1024.0))
<< " GB" << std::endl;
std::cout <<
" Used: " << (resources.
disk.
used_bytes / (1024.0 * 1024.0 * 1024.0))
std::cout << "\nNetwork:" << std::endl;
std::cout << "\nProcess:" << std::endl;
std::cout <<
" Count: " << resources.
process.
count << std::endl;
std::cout << "\nContext Switches:" << std::endl;
}
std::cout << "\n=== Network Collector Metrics ===" << std::endl;
for (const auto& m : metrics) {
std::cout << " " << m.name << ": ";
std::visit([](const auto& val) { std::cout << val; }, m.value);
auto unit_it = m.tags.find("unit");
if (unit_it != m.tags.end() && !unit_it->second.empty()) {
std::cout << " " << unit_it->second;
}
std::cout << std::endl;
}
}
std::cout << "\n=== Process Collector Metrics ===" << std::endl;
for (const auto& m : metrics) {
std::cout << " " << m.name << ": ";
std::visit([](const auto& val) { std::cout << val; }, m.value);
auto unit_it = m.tags.find("unit");
if (unit_it != m.tags.end() && !unit_it->second.empty()) {
std::cout << " " << unit_it->second;
}
std::cout << std::endl;
}
}
std::cout << "=== System Collectors Example ===" << std::endl;
try {
std::cout << "\n1. Creating system_resource_collector..." << std::endl;
sys_config.
interval = std::chrono::milliseconds(1000);
std::unordered_map<std::string, std::string> init_config;
if (!sys_collector.initialize(init_config)) {
std::cerr << "Failed to initialize system_resource_collector" << std::endl;
return 1;
}
std::cout << " Initialized: " << sys_collector.get_name() << std::endl;
std::cout << " Health: " << (sys_collector.is_healthy() ? "OK" : "UNHEALTHY") << std::endl;
std::cout << "\n2. Creating network_metrics_collector..." << std::endl;
std::cerr << "Failed to initialize network_metrics_collector" << std::endl;
return 1;
}
std::cout <<
" Initialized: " << net_collector.
name() << std::endl;
std::cout <<
" Health: " << (net_collector.
is_available() ?
"OK" :
"UNHEALTHY") << std::endl;
std::cout << "\n3. Creating process_metrics_collector..." << std::endl;
std::cerr << "Failed to initialize process_metrics_collector" << std::endl;
return 1;
}
std::cout <<
" Initialized: " << proc_collector.
name() << std::endl;
std::cout <<
" Health: " << (proc_collector.
is_available() ?
"OK" :
"UNHEALTHY") << std::endl;
#ifdef THREAD_SYSTEM_AVAILABLE
std::cout << "\n4. Creating thread_system_collector..." << std::endl;
thread_system_collector thread_collector;
if (!thread_collector.initialize(init_config)) {
std::cerr << "Failed to initialize thread_system_collector" << std::endl;
return 1;
}
std::cout << " Initialized: " << thread_collector.name() << std::endl;
std::cout << " Health: " << (thread_collector.is_available() ? "OK" : "UNHEALTHY") << std::endl;
#else
std::cout << "\n4. thread_system_collector not available (THREAD_SYSTEM_AVAILABLE not defined)" << std::endl;
#endif
#ifdef LOGGER_SYSTEM_AVAILABLE
std::cout << "\n5. Creating logger_system_collector..." << std::endl;
logger_system_collector logger_collector;
if (!logger_collector.initialize(init_config)) {
std::cerr << "Failed to initialize logger_system_collector" << std::endl;
return 1;
}
std::cout << " Initialized: " << logger_collector.name() << std::endl;
std::cout << " Health: " << (logger_collector.is_available() ? "OK" : "UNHEALTHY") << std::endl;
#else
std::cout << "\n5. logger_system_collector not available (LOGGER_SYSTEM_AVAILABLE not defined)" << std::endl;
#endif
std::cout << "\n6. Demonstrating collector lifecycle (3 iterations)..." << std::endl;
for (int i = 0; i < 3; ++i) {
std::cout << "\n--- Iteration " << (i + 1) << "/3 ---" << std::endl;
auto sys_metrics = sys_collector.collect();
std::cout << "System metrics collected: " << sys_metrics.size() << std::endl;
auto resources = sys_collector.get_last_resources();
auto net_metrics = net_collector.
collect();
std::cout << "Network metrics collected: " << net_metrics.size() << std::endl;
auto proc_metrics = proc_collector.
collect();
std::cout << "Process metrics collected: " << proc_metrics.size() << std::endl;
#ifdef THREAD_SYSTEM_AVAILABLE
auto thread_metrics = thread_collector.collect();
std::cout << "Thread system metrics collected: " << thread_metrics.size() << std::endl;
#endif
#ifdef LOGGER_SYSTEM_AVAILABLE
auto logger_metrics = logger_collector.collect();
std::cout << "Logger system metrics collected: " << logger_metrics.size() << std::endl;
#endif
if (i < 2) {
std::cout << "\nWaiting 2 seconds before next collection..." << std::endl;
std::this_thread::sleep_for(2s);
}
}
std::cout << "\n7. Collector Statistics:" << std::endl;
auto sys_stats = sys_collector.get_statistics();
std::cout << "\nSystem Resource Collector:" << std::endl;
for (const auto& [key, value] : sys_stats) {
std::cout << " " << key << ": " << value << std::endl;
}
std::cout << "\nNetwork Metrics Collector:" << std::endl;
for (const auto& [key, value] : net_stats) {
std::cout << " " << key << ": " << value << std::endl;
}
std::cout << "\nProcess Metrics Collector:" << std::endl;
for (const auto& [key, value] : proc_stats) {
std::cout << " " << key << ": " << value << std::endl;
}
std::cout << "\n8. Load Average History:" << std::endl;
auto load_history = sys_collector.get_all_load_history();
std::cout << " Total samples: " << load_history.size() << std::endl;
if (!load_history.empty()) {
auto load_stats = sys_collector.get_all_load_statistics();
std::cout << " 1-min avg: " << load_stats.load_1m_stats.avg << std::endl;
std::cout << " 5-min avg: " << load_stats.load_5m_stats.avg << std::endl;
std::cout << " 15-min avg: " << load_stats.load_15m_stats.avg << std::endl;
}
}
std::cout << "\n=== Example completed successfully ===" << std::endl;
} catch (const std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
return 1;
}
return 0;
}
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.
Metric collector for logger_system log statistics.
Unified network metrics collector for socket buffers and TCP states.
Unified process-level metrics collector.
std::chrono::milliseconds interval
size_t load_history_max_samples
struct kcenon::monitoring::system_resources::cpu_metrics::load_average load
size_t write_bytes_per_sec
size_t read_bytes_per_sec
struct kcenon::monitoring::system_resources::disk_metrics::io_throughput io
struct kcenon::monitoring::system_resources::memory_metrics::swap_info swap
size_t tx_packets_per_sec
size_t rx_packets_per_sec
size_t open_file_descriptors
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
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)
System resource collector for CPU, memory, and disk metrics.
Metric collector for thread_system pool and queue statistics.