Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
process_metrics_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
25#include <atomic>
26#include <chrono>
27#include <cstdint>
28#include <memory>
29#include <string>
30#include <unordered_map>
31#include <vector>
32
35
36namespace kcenon {
37namespace monitoring {
38
39// =============================================================================
40// Metrics structures
41// =============================================================================
42
47struct fd_metrics {
48 uint64_t fd_used_system{0};
49 uint64_t fd_max_system{0};
50 uint64_t fd_used_process{0};
51 uint64_t fd_soft_limit{0};
52 uint64_t fd_hard_limit{0};
53 double fd_usage_percent{0.0};
55 std::chrono::system_clock::time_point timestamp;
56};
57
63 std::string mount_point;
64 std::string filesystem_type;
65 std::string device;
66 uint64_t inodes_total{0};
67 uint64_t inodes_used{0};
68 uint64_t inodes_free{0};
70};
71
77 std::vector<filesystem_inode_info> filesystems;
78 uint64_t total_inodes{0};
79 uint64_t total_inodes_used{0};
80 uint64_t total_inodes_free{0};
82 double max_usage_percent{0.0};
84 bool metrics_available{false};
85 std::chrono::system_clock::time_point timestamp;
86};
87
97
110
127
138
139// =============================================================================
140// Forward declarations
141// =============================================================================
142
143namespace platform {
144class metrics_provider;
145}
146
147// =============================================================================
148// Info collectors (internal implementation)
149// =============================================================================
150
171
192
217
218// =============================================================================
219// Main collector
220// =============================================================================
221
241 public:
244 ~process_metrics_collector() override = default;
245
250
251 // collector_plugin interface implementation
252 auto name() const -> std::string_view override { return "process_metrics_collector"; }
253 auto collect() -> std::vector<metric> override;
254 auto interval() const -> std::chrono::milliseconds override { return collection_interval_; }
255 auto is_available() const -> bool override;
260 bool is_healthy() const;
261 auto get_metric_types() const -> std::vector<std::string> override;
262
263 // Configuration
264 bool initialize(const config_map& config) override;
265
270 auto get_statistics() const -> stats_map override;
271
272 // Accessors
277
278 // Availability checks
282
283 private:
287
290 std::chrono::milliseconds collection_interval_{std::chrono::seconds(5)};
291 mutable std::mutex metrics_mutex_;
292
293 // Statistics tracking
294 mutable std::atomic<uint64_t> collection_count_{0};
295 mutable std::atomic<uint64_t> collection_errors_{0};
296
297 void collect_fd_metrics(std::vector<metric>& metrics);
298 void collect_inode_metrics(std::vector<metric>& metrics);
299 void collect_context_switch_metrics(std::vector<metric>& metrics);
300
301 void add_fd_metrics(std::vector<metric>& metrics, const fd_metrics& fd_data);
302 void add_inode_metrics(std::vector<metric>& metrics, const inode_metrics& inode_data);
303 void add_context_switch_metrics(std::vector<metric>& metrics,
304 const context_switch_metrics& cs_data);
305};
306
307} // namespace monitoring
308} // namespace kcenon
Pure virtual interface for metric collector plugins.
Context switch data collector using platform abstraction layer.
double calculate_rate(uint64_t current_switches)
context_switch_info_collector & operator=(context_switch_info_collector &&)=delete
context_switch_info_collector(context_switch_info_collector &&)=delete
std::unique_ptr< platform::metrics_provider > provider_
std::chrono::steady_clock::time_point last_collection_time_
context_switch_info_collector & operator=(const context_switch_info_collector &)=delete
context_switch_info_collector(const context_switch_info_collector &)=delete
File descriptor data collector using platform abstraction layer.
fd_info_collector(const fd_info_collector &)=delete
fd_info_collector(fd_info_collector &&)=delete
std::unique_ptr< platform::metrics_provider > provider_
fd_info_collector & operator=(fd_info_collector &&)=delete
fd_info_collector & operator=(const fd_info_collector &)=delete
Inode data collector using platform abstraction layer.
inode_info_collector(const inode_info_collector &)=delete
std::unique_ptr< platform::metrics_provider > provider_
inode_info_collector & operator=(inode_info_collector &&)=delete
inode_info_collector(inode_info_collector &&)=delete
inode_info_collector & operator=(const inode_info_collector &)=delete
Unified process-level metrics collector.
auto get_metric_types() const -> std::vector< std::string > override
Get supported metric types.
void add_context_switch_metrics(std::vector< metric > &metrics, const context_switch_metrics &cs_data)
bool initialize(const config_map &config) override
Initialize plugin with configuration.
process_metrics_collector & operator=(process_metrics_collector &&)=delete
process_metrics_collector(process_metrics_config config)
auto interval() const -> std::chrono::milliseconds override
Get the collection interval for this plugin.
std::unique_ptr< fd_info_collector > fd_collector_
auto collect() -> std::vector< metric > override
Collect current metrics from this plugin.
process_metrics_collector(const process_metrics_collector &)=delete
std::unique_ptr< inode_info_collector > inode_collector_
auto get_statistics() const -> stats_map override
void collect_fd_metrics(std::vector< metric > &metrics)
std::unique_ptr< context_switch_info_collector > cs_collector_
auto is_available() const -> bool override
Check if this plugin is available on the current system.
context_switch_metrics get_last_context_switch_metrics() const
process_metrics_collector & operator=(const process_metrics_collector &)=delete
void add_inode_metrics(std::vector< metric > &metrics, const inode_metrics &inode_data)
void collect_inode_metrics(std::vector< metric > &metrics)
process_metrics_collector(process_metrics_collector &&)=delete
auto name() const -> std::string_view override
Get the unique name of this plugin.
void collect_context_switch_metrics(std::vector< metric > &metrics)
void add_fd_metrics(std::vector< metric > &metrics, const fd_metrics &fd_data)
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.
std::unordered_map< std::string, std::string > config_map
Type alias for configuration map.
@ platform
Platform/system power domain.
Aggregated context switch metrics for system and process.
std::chrono::system_clock::time_point timestamp
File descriptor usage metrics.
std::chrono::system_clock::time_point timestamp
Inode usage information for a single filesystem.
Aggregated inode usage metrics for all filesystems.
std::chrono::system_clock::time_point timestamp
std::vector< filesystem_inode_info > filesystems
Context switch information for the current process.
Configuration for selective metric collection.
std::chrono::system_clock::time_point timestamp