Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
container_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
16#include <atomic>
17#include <chrono>
18#include <cstdint>
19#include <memory>
20#include <mutex>
21#include <string>
22#include <unordered_map>
23#include <vector>
24
27
28namespace kcenon {
29namespace monitoring {
30
35 // Container identification
36 std::string container_id;
37 std::string container_name;
38 std::string image_name;
39
40 // CPU metrics
41 double cpu_usage_percent{0.0};
42 uint64_t cpu_usage_ns{0};
43
44 // Memory metrics
45 uint64_t memory_usage_bytes{0};
46 uint64_t memory_limit_bytes{0};
48
49 // Network metrics (counters)
50 uint64_t network_rx_bytes{0};
51 uint64_t network_tx_bytes{0};
52
53 // Block I/O metrics (counters)
54 uint64_t blkio_read_bytes{0};
55 uint64_t blkio_write_bytes{0};
56
57 // Process metrics
58 uint64_t pids_current{0};
59 uint64_t pids_limit{0};
60
61 // Timestamp
62 std::chrono::system_clock::time_point timestamp;
63};
64
69 std::string container_id;
70 std::string container_name;
71 std::string image_name;
72 std::string cgroup_path;
73 bool is_running{false};
74};
75
79enum class cgroup_version : uint8_t {
80 none = 0,
81 v1 = 1,
82 v2 = 2
83};
84
89 public:
92
93 // Non-copyable, non-moveable due to internal state
98
104
109 std::vector<container_info> enumerate_containers();
110
117
122 bool is_containerized() const;
123
124 private:
125 mutable std::mutex mutex_;
127 bool version_detected_{false};
128
129 // Previous CPU stats for calculating usage percentage
130 struct cpu_stats {
131 uint64_t usage_ns{0};
132 std::chrono::steady_clock::time_point timestamp;
133 };
134 std::unordered_map<std::string, cpu_stats> prev_cpu_stats_;
135
136 // Platform-specific methods
137#if defined(__linux__)
138 cgroup_version detect_cgroup_version_linux() const;
139 std::vector<container_info> enumerate_containers_cgroup_v2();
140 std::vector<container_info> enumerate_containers_cgroup_v1();
141 container_metrics collect_metrics_cgroup_v2(const container_info& info);
142 container_metrics collect_metrics_cgroup_v1(const container_info& info);
143
144 // Helper methods for cgroup parsing
145 uint64_t read_cgroup_value(const std::string& path, const std::string& key = "") const;
146 std::unordered_map<std::string, uint64_t> read_cgroup_stat(const std::string& path) const;
147#endif
148};
149
155 public:
157 ~container_collector() override = default;
158
159 // Non-copyable, non-moveable due to internal state
164
165 // collector_plugin implementation
166 auto name() const -> std::string_view override { return "container"; }
167 auto collect() -> std::vector<metric> override;
168 auto interval() const -> std::chrono::milliseconds override { return std::chrono::seconds(10); }
169 auto is_available() const -> bool override;
170 auto get_metric_types() const -> std::vector<std::string> override;
171
172 auto get_metadata() const -> plugin_metadata override {
173 return plugin_metadata{
174 .name = name(),
175 .description = "Container metrics from Docker and cgroups",
176 .category = plugin_category::system,
177 .version = "1.0.0",
178 .dependencies = {},
179 .requires_platform_support = true // Linux-specific
180 };
181 }
182
183 auto initialize(const config_map& config) -> bool override;
184 void shutdown() override {}
185 auto get_statistics() const -> stats_map override;
186
192
198
199 private:
201
202 // Configuration
203 bool enabled_{true};
206
207 // Statistics
208 mutable std::mutex stats_mutex_;
209 std::atomic<size_t> collection_count_{0};
210 std::atomic<size_t> collection_errors_{0};
211 std::atomic<size_t> containers_found_{0};
212 std::vector<container_metrics> last_metrics_;
213
214 // Helper methods
215 metric create_metric(const std::string& name, double value, const container_metrics& container,
216 const std::string& unit = "") const;
217 void add_container_metrics(std::vector<metric>& metrics, const container_metrics& container);
218};
219
220} // namespace monitoring
221} // namespace kcenon
Pure virtual interface for metric collector plugins.
auto initialize(const config_map &config) -> bool override
Initialize plugin with configuration.
container_collector(container_collector &&)=delete
auto interval() const -> std::chrono::milliseconds override
Get the collection interval for this plugin.
std::vector< container_metrics > get_last_metrics() const
auto get_metadata() const -> plugin_metadata override
Get plugin metadata.
std::unique_ptr< container_info_collector > collector_
std::vector< container_metrics > last_metrics_
void add_container_metrics(std::vector< metric > &metrics, const container_metrics &container)
metric create_metric(const std::string &name, double value, const container_metrics &container, const std::string &unit="") const
auto name() const -> std::string_view override
Get the unique name of this plugin.
void shutdown() override
Shutdown plugin and release resources.
container_collector & operator=(const container_collector &)=delete
auto collect() -> std::vector< metric > override
Collect current metrics from this plugin.
auto get_statistics() const -> stats_map override
Get plugin statistics.
container_collector(const container_collector &)=delete
auto is_available() const -> bool override
Check if this plugin is available on the current system.
auto get_metric_types() const -> std::vector< std::string > override
Get supported metric types.
container_collector & operator=(container_collector &&)=delete
std::vector< container_info > enumerate_containers()
std::unordered_map< std::string, cpu_stats > prev_cpu_stats_
container_info_collector(container_info_collector &&)=delete
container_info_collector & operator=(const container_info_collector &)=delete
container_metrics collect_container_metrics(const container_info &info)
container_info_collector(const container_info_collector &)=delete
container_info_collector & operator=(container_info_collector &&)=delete
Plugin interface for metric collectors.
Adapter for metric types to support interface definitions.
@ v2
Unified cgroups v2 hierarchy.
@ none
Not in a cgroup or not Linux.
std::unordered_map< std::string, double > stats_map
Type alias for statistics map.
@ system
System integration (threads, loggers, containers)
std::unordered_map< std::string, std::string > config_map
Type alias for configuration map.
@ info
Informational, no action required.
std::string cgroup_path
Path to cgroup directory.
uint64_t pids_limit
Process limit (0 = unlimited)
std::string container_id
Short container ID.
double memory_usage_percent
Memory usage percentage.
std::string image_name
Image name (Docker only)
uint64_t memory_limit_bytes
Memory limit in bytes.
uint64_t memory_usage_bytes
Current memory usage in bytes.
double cpu_usage_percent
CPU utilization percentage.
uint64_t network_tx_bytes
Total bytes transmitted.
uint64_t blkio_write_bytes
Total bytes written to disk.
uint64_t blkio_read_bytes
Total bytes read from disk.
std::chrono::system_clock::time_point timestamp
uint64_t cpu_usage_ns
Total CPU time in nanoseconds.
uint64_t pids_current
Current number of processes.
uint64_t network_rx_bytes
Total bytes received.
std::string container_name
Container name (Docker only)
Basic metric structure for interface compatibility.
Metadata describing a collector plugin.