Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
metric_collector_interface.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
18#include <algorithm>
19#include <chrono>
20#include <concepts>
21#include <functional>
22#include <memory>
23#include <string>
24#include <type_traits>
25#include <vector>
26
30#include "observer_interface.h"
31
32#if KCENON_HAS_COMMON_SYSTEM
33#include <kcenon/common/concepts/service.h>
34#endif
35
36namespace kcenon { namespace monitoring {
37
38namespace concepts {
39
59template <typename T>
60concept Validatable = requires(const T t) {
61 { t.validate() };
62};
63
70template <typename T>
71concept MetricSourceLike = requires(const T t) {
72 { t.get_current_metrics() };
73 { t.get_source_name() } -> std::convertible_to<std::string>;
74 { t.is_healthy() } -> std::convertible_to<bool>;
75};
76
83template <typename T>
84concept MetricCollectorLike = requires(T t) {
85 { t.collect_metrics() };
86 { t.is_collecting() } -> std::convertible_to<bool>;
87 { t.get_metric_types() };
88};
89
90} // namespace concepts
91
123public:
124 enum class filter_type {
128 };
129
132
133 void add_metric_type(const std::string& type) {
134 metric_types_.push_back(type);
135 }
136
137 bool should_collect(const std::string& metric_type) const {
138 switch (type_) {
140 return true;
142 return std::find(metric_types_.begin(), metric_types_.end(), metric_type) != metric_types_.end();
144 return std::find(metric_types_.begin(), metric_types_.end(), metric_type) == metric_types_.end();
145 }
146 return true;
147 }
148
149private:
151 std::vector<std::string> metric_types_;
152};
153
182 std::chrono::milliseconds interval{std::chrono::seconds(1)};
184 bool batch_collection{false};
185 size_t batch_size{100};
187
196 [[nodiscard]] common::VoidResult validate() const {
197 if (interval.count() <= 0) {
198 return common::VoidResult::err(error_info(monitoring_error_code::invalid_configuration, "Collection interval must be positive").to_common_error());
199 }
200 if (batch_collection && batch_size == 0) {
201 return common::VoidResult::err(error_info(monitoring_error_code::invalid_configuration, "Batch size must be positive when batch collection is enabled").to_common_error());
202 }
203 return common::ok();
204 }
205};
206
207// Compile-time verification that collection_config satisfies Validatable concept
208static_assert(concepts::Validatable<collection_config>,
209 "collection_config must satisfy Validatable concept");
210
252public:
253 virtual ~interface_metric_collector() = default;
254
259 virtual common::Result<std::vector<metric>> collect_metrics() = 0;
260
266 virtual common::VoidResult start_collection(const collection_config& config) = 0;
267
272 virtual common::VoidResult stop_collection() = 0;
273
278 virtual bool is_collecting() const = 0;
279
284 virtual std::vector<std::string> get_metric_types() const = 0;
285
290 virtual collection_config get_config() const = 0;
291
297 virtual common::VoidResult update_config(const collection_config& config) = 0;
298
303 virtual common::Result<std::vector<metric>> force_collect() = 0;
304
309 virtual metric_stats get_stats() const = 0;
310
314 virtual void reset_stats() = 0;
315};
316
352public:
353 virtual ~interface_metric_source() = default;
354
359 virtual std::vector<metric> get_current_metrics() const = 0;
360
365 virtual std::string get_source_name() const = 0;
366
371 virtual bool is_healthy() const = 0;
372};
373
413public:
415
421 virtual common::VoidResult register_source(std::shared_ptr<interface_metric_source> source) = 0;
422
428 virtual common::VoidResult unregister_source(const std::string& source_name) = 0;
429
434 virtual std::vector<std::string> get_registered_sources() const = 0;
435};
436
437} } // namespace kcenon::monitoring
Interface for collectors that aggregate metrics from multiple sources.
virtual common::VoidResult register_source(std::shared_ptr< interface_metric_source > source)=0
Register a metric source.
virtual std::vector< std::string > get_registered_sources() const =0
Get all registered sources.
virtual common::VoidResult unregister_source(const std::string &source_name)=0
Unregister a metric source.
Pure virtual interface for metric collectors.
virtual common::Result< std::vector< metric > > force_collect()=0
Force immediate metric collection.
virtual collection_config get_config() const =0
Get current collection configuration.
virtual common::VoidResult update_config(const collection_config &config)=0
Update collection configuration.
virtual std::vector< std::string > get_metric_types() const =0
Get the types of metrics this collector supports.
virtual bool is_collecting() const =0
Check if collector is currently active.
virtual void reset_stats()=0
Reset collector statistics.
virtual common::VoidResult stop_collection()=0
Stop automatic metric collection.
virtual common::Result< std::vector< metric > > collect_metrics()=0
Collect metrics based on current configuration.
virtual common::VoidResult start_collection(const collection_config &config)=0
Start automatic metric collection.
virtual metric_stats get_stats() const =0
Get collector statistics.
Interface for components that provide metrics.
virtual std::string get_source_name() const =0
Get the name of this metric source.
virtual bool is_healthy() const =0
Check if this source is healthy.
virtual std::vector< metric > get_current_metrics() const =0
Get current metrics from this source.
Interface for components that can be observed.
Filter configuration for metric collection.
void add_metric_type(const std::string &type)
bool should_collect(const std::string &metric_type) const
metric_filter(filter_type type=filter_type::include_all)
A type that can validate its own state.
Unified feature flags header for monitoring_system.
Adapter for metric types to support interface definitions.
metric_type
Metric types supported by exporters.
Observer pattern interface for monitoring system event handling.
Result pattern type definitions for monitoring system.
Configuration for metric collection.
common::VoidResult validate() const
Validate the configuration.
Extended error information with context.
Statistics about metric collection.