Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
plugin_metric_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
12#pragma once
13
14#include <algorithm>
15#include <atomic>
16#include <chrono>
17#include <condition_variable>
18#include <functional>
19#include <map>
20#include <memory>
21#include <mutex>
22#include <optional>
23#include <queue>
24#include <string>
25#include <thread>
26#include <typeindex>
27#include <unordered_map>
28#include <utility>
29#include <vector>
30
35
36namespace kcenon { namespace monitoring {
37
43 public:
44 virtual ~metric_collector_plugin() = default;
45
51 virtual bool initialize(const std::unordered_map<std::string, std::string>& config) = 0;
52
57 virtual std::vector<metric> collect() = 0;
58
63 virtual std::string get_name() const = 0;
64
69 virtual std::vector<std::string> get_metric_types() const = 0;
70
75 virtual bool is_healthy() const = 0;
76
81 virtual std::unordered_map<std::string, double> get_statistics() const = 0;
82};
83
88 // Collection interval in milliseconds
89 std::chrono::milliseconds collection_interval{1000};
90
91 // Maximum batch size for metric collection
92 size_t max_batch_size{1000};
93
94 // Enable caching of metrics
95 bool enable_caching{true};
96
97 // Cache TTL in seconds
98 std::chrono::seconds cache_ttl{60};
99
100 // Enable real-time streaming
101 bool enable_streaming{false};
102
103 // Number of worker threads for collection
104 size_t worker_threads{2};
105
106 // Enable metric aggregation
108
109 // Aggregation window in seconds
110 std::chrono::seconds aggregation_window{10};
111};
112
118 public:
121
122 // Disable copy
125
126 // Enable move
129
135 bool register_plugin(std::unique_ptr<metric_collector_plugin> plugin);
136
142 bool unregister_plugin(const std::string& plugin_name);
143
148 std::vector<std::string> get_registered_plugins() const;
149
154 bool start();
155
159 void stop();
160
165 bool is_running() const;
166
167 // Missing methods from interface
168 common::VoidResult start_collection(const collection_config& config) override;
169 common::VoidResult stop_collection() override;
170 bool is_collecting() const override;
172 metric_stats get_stats() const override;
173 void reset_stats() override;
174
180 std::vector<metric> get_cached_metrics(const std::optional<std::string>& plugin_name = std::nullopt) const;
181
187 std::vector<metric_stats> get_aggregated_metrics(size_t window_seconds = 60) const;
188
193 common::Result<std::vector<metric>> force_collect() override;
194
195 // interface_metric_collector implementation
196 common::Result<std::vector<metric>> collect_metrics() override;
197 common::VoidResult register_observer(std::shared_ptr<interface_monitoring_observer> observer) override;
198 common::VoidResult unregister_observer(std::shared_ptr<interface_monitoring_observer> observer) override;
199 std::vector<std::string> get_metric_types() const override;
200 common::VoidResult update_config(const collection_config& config) override;
201
202 private:
203 // Plugin management
204 mutable std::mutex plugins_mutex_;
205 std::unordered_map<std::string, std::unique_ptr<metric_collector_plugin>> plugins_;
206
207 // Observer management
208 mutable std::mutex observers_mutex_;
209 std::vector<std::weak_ptr<interface_monitoring_observer>> observers_;
210
211 // Metric cache
214 std::chrono::steady_clock::time_point timestamp;
215 std::string plugin_name;
216 };
217 mutable std::mutex cache_mutex_;
218 std::vector<cached_metric> metric_cache_;
219
220 // Collection state
221 std::atomic<bool> running_{false};
222 std::vector<std::thread> worker_threads_;
223 std::condition_variable work_cv_;
224 mutable std::mutex work_mutex_;
225
226 // Configuration
228
229 // Statistics
230 std::atomic<size_t> total_metrics_collected_{0};
231 std::atomic<size_t> collection_errors_{0};
232 std::chrono::steady_clock::time_point start_time_;
233
234 // Internal methods
236 void collect_from_plugin(const std::string& name, metric_collector_plugin* plugin);
237 void notify_observers(const metric& m);
240};
241
246 public:
252 static std::unique_ptr<metric_collector_plugin> create_system_resource_collector(
253 const std::unordered_map<std::string, std::string>& config = {});
254
260 static std::unique_ptr<metric_collector_plugin> create_thread_system_collector(
261 const std::unordered_map<std::string, std::string>& config = {});
262
268 static std::unique_ptr<metric_collector_plugin> create_logger_system_collector(
269 const std::unordered_map<std::string, std::string>& config = {});
270
276 static void register_factory(
277 const std::string& type,
278 std::function<std::unique_ptr<metric_collector_plugin>(const std::unordered_map<std::string, std::string>&)>
279 factory);
280
287 static std::unique_ptr<metric_collector_plugin> create(const std::string& type,
288 const std::unordered_map<std::string, std::string>& config = {});
289
290 private:
291 static std::unordered_map<
292 std::string, std::function<std::unique_ptr<metric_collector_plugin>(const std::unordered_map<std::string, std::string>&)>>
294 static std::mutex factories_mutex_;
295};
296
297} } // namespace kcenon::monitoring
Pure virtual interface for metric collectors.
virtual bool initialize(const std::unordered_map< std::string, std::string > &config)=0
virtual std::unordered_map< std::string, double > get_statistics() const =0
virtual std::vector< std::string > get_metric_types() const =0
virtual std::string get_name() const =0
virtual std::vector< metric > collect()=0
static std::unordered_map< std::string, std::function< std::unique_ptr< metric_collector_plugin >(const std::unordered_map< std::string, std::string > &)> > factories_
static std::unique_ptr< metric_collector_plugin > create(const std::string &type, const std::unordered_map< std::string, std::string > &config={})
static std::unique_ptr< metric_collector_plugin > create_thread_system_collector(const std::unordered_map< std::string, std::string > &config={})
static void register_factory(const std::string &type, std::function< std::unique_ptr< metric_collector_plugin >(const std::unordered_map< std::string, std::string > &)> factory)
static std::unique_ptr< metric_collector_plugin > create_logger_system_collector(const std::unordered_map< std::string, std::string > &config={})
static std::unique_ptr< metric_collector_plugin > create_system_resource_collector(const std::unordered_map< std::string, std::string > &config={})
plugin_metric_collector & operator=(plugin_metric_collector &&)=delete
common::VoidResult unregister_observer(std::shared_ptr< interface_monitoring_observer > observer) override
Unregister an observer.
plugin_metric_collector(const plugin_collector_config &config={})
common::VoidResult update_config(const collection_config &config) override
Update collection configuration.
std::vector< metric > get_cached_metrics(const std::optional< std::string > &plugin_name=std::nullopt) const
std::unordered_map< std::string, std::unique_ptr< metric_collector_plugin > > plugins_
plugin_metric_collector & operator=(const plugin_metric_collector &)=delete
common::VoidResult stop_collection() override
Stop automatic metric collection.
common::Result< std::vector< metric > > collect_metrics() override
Collect metrics based on current configuration.
std::vector< std::string > get_registered_plugins() const
plugin_metric_collector(const plugin_metric_collector &)=delete
bool register_plugin(std::unique_ptr< metric_collector_plugin > plugin)
std::vector< std::weak_ptr< interface_monitoring_observer > > observers_
plugin_metric_collector(plugin_metric_collector &&)=delete
void collect_from_plugin(const std::string &name, metric_collector_plugin *plugin)
std::vector< metric_stats > get_aggregated_metrics(size_t window_seconds=60) const
void reset_stats() override
Reset collector statistics.
common::Result< std::vector< metric > > force_collect() override
collection_config get_config() const override
Get current collection configuration.
bool is_collecting() const override
Check if collector is currently active.
std::vector< std::string > get_metric_types() const override
Get the types of metrics this collector supports.
std::chrono::steady_clock::time_point start_time_
bool unregister_plugin(const std::string &plugin_name)
metric_stats get_stats() const override
Get collector statistics.
common::VoidResult start_collection(const collection_config &config) override
Start automatic metric collection.
common::VoidResult register_observer(std::shared_ptr< interface_monitoring_observer > observer) override
Register an observer for events.
Abstract interface for metric collection components.
Common metric type definitions for efficient storage.
Adapter for metric types to support interface definitions.
Observer pattern interface for monitoring system event handling.
Configuration for metric collection.
Statistics about metric collection.
Basic metric structure for interface compatibility.