14#if KCENON_WITH_COMMON_SYSTEM
15#include <kcenon/common/interfaces/executor_interface.h>
16#include <kcenon/common/interfaces/logger_interface.h>
17#include <kcenon/common/interfaces/monitoring_interface.h>
18#include <kcenon/common/patterns/result.h>
30#include <unordered_map>
34#if KCENON_WITH_COMMON_SYSTEM
37inline std::future<void> make_error_future(
const std::string&
message) {
38 std::promise<void> promise;
39 promise.set_exception(std::make_exception_ptr(std::runtime_error(
message)));
40 auto future = promise.get_future();
45class executor_job final :
public ::kcenon::common::interfaces::IJob {
47 explicit executor_job(std::function<
void()> task, std::string name =
"network_job")
48 : task_(std::move(task)), name_(std::move(name)) {}
50 ::kcenon::common::VoidResult execute()
override {
55 return ::kcenon::common::ok();
56 }
catch (
const std::exception& ex) {
57 return ::kcenon::common::VoidResult(::kcenon::common::error_info{
58 ::kcenon::common::error_codes::INTERNAL_ERROR,
64 std::string get_name()
const override {
return name_; }
67 std::function<void()> task_;
71class common_thread_pool_adapter :
public thread_pool_interface {
73 explicit common_thread_pool_adapter(
74 std::shared_ptr<::kcenon::common::interfaces::IExecutor> executor)
75 : executor_(std::move(executor)) {}
77 std::future<void> submit(std::function<
void()> task)
override {
79 auto future = detail::make_error_future(
"Executor not initialized");
82 auto result = executor_->execute(std::make_unique<executor_job>(std::move(task)));
83 if (result.is_err()) {
84 auto future = detail::make_error_future(result.error().message);
87 auto future = std::move(result.value());
91 std::future<void> submit_delayed(
92 std::function<
void()> task,
93 std::chrono::milliseconds delay)
override {
95 auto future = detail::make_error_future(
"Executor not initialized");
98 auto result = executor_->execute_delayed(
99 std::make_unique<executor_job>(std::move(task)), delay);
100 if (result.is_err()) {
101 auto future = detail::make_error_future(result.error().message);
104 auto future = std::move(result.value());
108 size_t worker_count()
const override {
109 return executor_ ? executor_->worker_count() : 0;
112 bool is_running()
const override {
113 return executor_ ? executor_->is_running() :
false;
116 size_t pending_tasks()
const override {
117 return executor_ ? executor_->pending_tasks() : 0;
120 void shutdown(
bool wait_for_tasks =
true) {
122 executor_->shutdown(wait_for_tasks);
127 std::shared_ptr<::kcenon::common::interfaces::IExecutor> executor_;
130inline ::kcenon::common::interfaces::log_level to_common_log_level(
log_level level) {
131 using common_level = ::kcenon::common::interfaces::log_level;
139 default:
return common_level::info;
143class common_logger_adapter :
public logger_interface {
145 explicit common_logger_adapter(std::shared_ptr<::kcenon::common::interfaces::ILogger> logger)
146 : logger_(std::move(logger)) {}
148 void log(log_level level,
const std::string& message)
override {
152 logger_->log(to_common_log_level(level), message);
155 void log(log_level level,
const std::string& message,
156 const std::string& file,
int line,
157 const std::string& function)
override {
161 ::kcenon::common::interfaces::log_entry entry;
162 entry.level = to_common_log_level(level);
166 entry.function = function;
167 entry.timestamp = std::chrono::system_clock::now();
171 bool is_level_enabled(log_level level)
const override {
173 ? logger_->is_enabled(to_common_log_level(level))
177 void flush()
override {
184 std::shared_ptr<::kcenon::common::interfaces::ILogger> logger_;
187class common_monitoring_adapter :
public monitoring_interface {
189 explicit common_monitoring_adapter(std::shared_ptr<::kcenon::common::interfaces::IMonitor> monitor)
190 : monitor_(std::move(monitor)) {}
192 void report_counter(
const std::string& name,
double value,
193 const std::map<std::string, std::string>& labels = {})
override {
194 record_with_type(name, value,
"counter", labels);
197 void report_gauge(
const std::string& name,
double value,
198 const std::map<std::string, std::string>& labels = {})
override {
199 record_with_type(name, value,
"gauge", labels);
202 void report_histogram(
const std::string& name,
double value,
203 const std::map<std::string, std::string>& labels = {})
override {
204 record_with_type(name, value,
"histogram", labels);
207 void report_health(
const std::string& connection_id,
bool is_alive,
208 double response_time_ms,
size_t missed_heartbeats,
209 double packet_loss_rate)
override {
213 std::unordered_map<std::string, std::string> tags{
214 {
"connection_id", connection_id}
216 monitor_->record_metric(
"network.connection.alive", is_alive ? 1.0 : 0.0, tags);
217 monitor_->record_metric(
"network.connection.rtt_ms", response_time_ms, tags);
218 monitor_->record_metric(
"network.connection.missed_heartbeats",
219 static_cast<double>(missed_heartbeats), tags);
220 monitor_->record_metric(
"network.connection.packet_loss",
221 packet_loss_rate, tags);
225 void record_with_type(
const std::string& name,
227 const std::string& type,
228 const std::map<std::string, std::string>& labels) {
232 std::unordered_map<std::string, std::string> enriched(labels.begin(), labels.end());
233 enriched[
"metric_type"] = type;
234 monitor_->record_metric(name, value, enriched);
237 std::shared_ptr<::kcenon::common::interfaces::IMonitor> monitor_;
Feature flags for network_system.
Logger system integration interface for network_system.
Monitoring system integration interface for network_system.
log_level
Log severity levels.
VoidResult shutdown()
Shutdown the network system.
Thread system integration interface for network_system.