11#ifndef KCENON_MONITORING_ADAPTERS_THREAD_TO_MONITORING_ADAPTER_H
12#define KCENON_MONITORING_ADAPTERS_THREAD_TO_MONITORING_ADAPTER_H
41#if !defined(MONITORING_THREAD_SYSTEM_AVAILABLE)
42# if defined(MONITORING_HAS_THREAD_SYSTEM)
43# define MONITORING_THREAD_SYSTEM_AVAILABLE 1
44# elif __has_include(<kcenon/thread/thread_pool.h>)
45# define MONITORING_THREAD_SYSTEM_AVAILABLE 1
47# define MONITORING_THREAD_SYSTEM_AVAILABLE 0
52#if MONITORING_THREAD_SYSTEM_AVAILABLE
53# include <kcenon/thread/interfaces/service_container.h>
54# if __has_include(<kcenon/common/interfaces/monitoring_interface.h>)
55# include <kcenon/common/interfaces/monitoring_interface.h>
56# define MONITORING_HAS_COMMON_INTERFACES 1
60namespace kcenon {
namespace monitoring {
65 std::chrono::milliseconds
interval{std::chrono::milliseconds{1000}};
70 :
bus_(std::move(bus)) {}
75#if MONITORING_THREAD_SYSTEM_AVAILABLE
77# if defined(MONITORING_HAS_COMMON_INTERFACES)
80 auto&
container = kcenon::thread::service_container::global();
81 auto monitorable =
container.resolve<kcenon::common::interfaces::IMonitorable>();
82 return static_cast<bool>(monitorable);
96 std::vector<metric> out;
98#if MONITORING_THREAD_SYSTEM_AVAILABLE && defined(MONITORING_HAS_COMMON_INTERFACES)
100 auto&
container = kcenon::thread::service_container::global();
101 auto monitorable =
container.resolve<kcenon::common::interfaces::IMonitorable>();
105 auto monitoring_result = monitorable->get_monitoring_data();
106 if (!monitoring_result.is_err()) {
107 const auto& snap = monitoring_result.value();
109 for (
const auto& m : snap.metrics) {
110 metric adapted{m.name, m.value, {}};
111 out.emplace_back(std::move(adapted));
120 return common::ok(std::move(out));
125#if MONITORING_THREAD_SYSTEM_AVAILABLE
127 "thread.pool.jobs_pending",
128 "thread.pool.jobs_completed",
129 "thread.pool.worker_threads"
148 worker_ = std::thread([
this, cfg]() {
154 std::this_thread::sleep_for(cfg.
interval);
174 std::shared_ptr<event_bus>
bus_;
Event containing collected metrics batch.
thread_to_monitoring_adapter(std::shared_ptr< event_bus > bus)
bool is_thread_system_available() const
std::atomic< bool > running_
common::Result< std::vector< metric > > collect_metrics()
common::VoidResult stop_collection()
~thread_to_monitoring_adapter()
std::shared_ptr< event_bus > bus_
common::VoidResult start_collection(const collection_config &cfg)
std::vector< std::string > get_metric_types() const
Lightweight event bus implementation for monitoring system.
Common event type definitions for monitoring system.
Adapter for metric types to support interface definitions.
Result pattern type definitions for monitoring system.
Basic metric structure for interface compatibility.
std::chrono::milliseconds interval