Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
kcenon::logger::basic_monitor Class Reference

Basic monitoring implementation. More...

#include <basic_monitor.h>

Inheritance diagram for kcenon::logger::basic_monitor:
Inheritance graph
Collaboration diagram for kcenon::logger::basic_monitor:
Collaboration graph

Public Member Functions

 basic_monitor ()
 Constructor.
 
 ~basic_monitor () override=default
 Destructor.
 
result< monitoring_datacollect_metrics () const override
 Collect current metrics.
 
result< health_check_resultcheck_health () const override
 Perform health check.
 
common::VoidResult reset_metrics () override
 Reset all metrics.
 
common::VoidResult set_enabled (bool enable) override
 Enable or disable monitoring.
 
bool is_enabled () const override
 Check if monitoring is enabled.
 
std::string get_backend_name () const override
 Get backend name.
 
void increment_counter (const std::string &name, double value=1.0) override
 Increment a counter.
 
void update_gauge (const std::string &name, double value) override
 Update a gauge.
 
void record_histogram (const std::string &name, double value) override
 Record a histogram value.
 
void add_health_issue (const std::string &issue)
 Add a health issue.
 
void clear_health_issues ()
 Clear health issues.
 
- Public Member Functions inherited from kcenon::logger::monitoring_interface
virtual ~monitoring_interface ()=default
 Virtual destructor.
 

Private Attributes

std::mutex mutex_
 
std::atomic< bool > enabled_ {true}
 
std::atomic< uint64_t > messages_logged_ {0}
 
std::atomic< uint64_t > messages_dropped_ {0}
 
std::atomic< uint64_t > errors_encountered_ {0}
 
std::atomic< uint64_t > writers_failed_ {0}
 
std::atomic< uint64_t > total_processing_time_us_ {0}
 
std::atomic< uint64_t > max_processing_time_us_ {0}
 
std::atomic< uint64_t > min_processing_time_us_ {UINT64_MAX}
 
std::atomic< size_t > buffer_usage_bytes_ {0}
 
std::atomic< size_t > max_buffer_usage_bytes_ {0}
 
std::atomic< size_t > queue_size_ {0}
 
std::atomic< size_t > max_queue_size_ {0}
 
std::vector< std::string > health_issues_
 
std::unordered_map< std::string, std::atomic< double > > counters_
 
std::unordered_map< std::string, std::atomic< double > > gauges_
 
std::unordered_map< std::string, std::vector< double > > histograms_
 
std::chrono::system_clock::time_point start_time_
 

Detailed Description

Basic monitoring implementation.

This implementation provides essential monitoring capabilities with minimal overhead and no external dependencies.

Definition at line 33 of file basic_monitor.h.

Constructor & Destructor Documentation

◆ basic_monitor()

kcenon::logger::basic_monitor::basic_monitor ( )
inline

Constructor.

Definition at line 70 of file basic_monitor.h.

70: start_time_(std::chrono::system_clock::now()) {}
std::chrono::system_clock::time_point start_time_

◆ ~basic_monitor()

kcenon::logger::basic_monitor::~basic_monitor ( )
overridedefault

Destructor.

Member Function Documentation

◆ add_health_issue()

void kcenon::logger::basic_monitor::add_health_issue ( const std::string & issue)
inline

Add a health issue.

Parameters
issueIssue description

Definition at line 413 of file basic_monitor.h.

413 {
414 std::lock_guard<std::mutex> lock(mutex_);
415 health_issues_.push_back(issue);
416 }
std::vector< std::string > health_issues_

References health_issues_, and mutex_.

◆ check_health()

result< health_check_result > kcenon::logger::basic_monitor::check_health ( ) const
inlineoverridevirtual

Perform health check.

Returns
Result containing health check result

Implements kcenon::logger::monitoring_interface.

Definition at line 187 of file basic_monitor.h.

187 {
188 health_check_result result;
189
190 // Check error rate
191 uint64_t errors = errors_encountered_.load();
192 uint64_t messages = messages_logged_.load();
193 if (messages > 0) {
194 double error_rate = static_cast<double>(errors) / messages;
195 if (error_rate > 0.1) { // More than 10% error rate
196 result.add_issue("High error rate: " +
197 std::to_string(error_rate * 100) + "%");
198 result.set_status(health_status::unhealthy);
199 } else if (error_rate > 0.05) { // More than 5% error rate
200 result.add_issue("Elevated error rate: " +
201 std::to_string(error_rate * 100) + "%");
202 result.set_status(health_status::degraded);
203 }
204 }
205
206 // Check dropped messages
207 uint64_t dropped = messages_dropped_.load();
208 if (dropped > 0) {
209 if (messages > 0) {
210 double drop_rate = static_cast<double>(dropped) / messages;
211 if (drop_rate > 0.01) { // More than 1% drop rate
212 result.add_issue("Messages being dropped: " +
213 std::to_string(dropped) + " total");
214 if (result.get_status() == health_status::healthy) {
215 result.set_status(health_status::degraded);
216 }
217 }
218 }
219 }
220
221 // Check writer failures
222 uint64_t writer_failures = writers_failed_.load();
223 if (writer_failures > 0) {
224 result.add_issue("Writer failures detected: " +
225 std::to_string(writer_failures));
226 if (result.get_status() == health_status::healthy) {
227 result.set_status(health_status::degraded);
228 }
229 }
230
231 // Check queue size
232 size_t queue_size = queue_size_.load();
233 size_t max_queue = max_queue_size_.load();
234 if (max_queue > 0 && queue_size > max_queue * 0.9) {
235 result.add_issue("Queue near capacity: " +
236 std::to_string(queue_size) + "/" +
237 std::to_string(max_queue));
238 if (result.get_status() == health_status::healthy) {
239 result.set_status(health_status::degraded);
240 }
241 }
242
243 // Add any custom health issues
244 {
245 std::lock_guard<std::mutex> lock(mutex_);
246 for (const auto& issue : health_issues_) {
247 result.add_issue(issue);
248 }
249 }
250
251 // Set overall message
252 if (result.is_healthy()) {
253 result.set_message("All systems operational");
254 } else {
255 result.set_message("Issues detected - check details");
256 }
257
258 return result;
259 }
std::atomic< uint64_t > messages_logged_
std::atomic< size_t > queue_size_
std::atomic< uint64_t > writers_failed_
std::atomic< uint64_t > messages_dropped_
std::atomic< size_t > max_queue_size_
std::atomic< uint64_t > errors_encountered_

References errors_encountered_, health_issues_, max_queue_size_, messages_dropped_, messages_logged_, mutex_, queue_size_, and writers_failed_.

◆ clear_health_issues()

void kcenon::logger::basic_monitor::clear_health_issues ( )
inline

Clear health issues.

Definition at line 421 of file basic_monitor.h.

421 {
422 std::lock_guard<std::mutex> lock(mutex_);
423 health_issues_.clear();
424 }

References health_issues_, and mutex_.

◆ collect_metrics()

result< monitoring_data > kcenon::logger::basic_monitor::collect_metrics ( ) const
inlineoverridevirtual

Collect current metrics.

Returns
Result containing monitoring data

Implements kcenon::logger::monitoring_interface.

Definition at line 81 of file basic_monitor.h.

81 {
82 if (!enabled_.load()) {
83 return result<monitoring_data>{error_code::metrics_not_available,
84 "Monitoring is disabled"};
85 }
86
87 monitoring_data data;
88
89 // Core metrics
90 data.add_metric("messages_logged",
91 static_cast<double>(messages_logged_.load()),
93 data.add_metric("messages_dropped",
94 static_cast<double>(messages_dropped_.load()),
96 data.add_metric("errors_encountered",
97 static_cast<double>(errors_encountered_.load()),
99 data.add_metric("writers_failed",
100 static_cast<double>(writers_failed_.load()),
102
103 // Performance metrics
104 uint64_t total_time = total_processing_time_us_.load();
105 uint64_t messages = messages_logged_.load();
106 if (messages > 0) {
107 data.add_metric("avg_processing_time_us",
108 static_cast<double>(total_time) / messages,
110 }
111 data.add_metric("max_processing_time_us",
112 static_cast<double>(max_processing_time_us_.load()),
114
115 uint64_t min_time = min_processing_time_us_.load();
116 if (min_time != UINT64_MAX) {
117 data.add_metric("min_processing_time_us",
118 static_cast<double>(min_time),
120 }
121
122 // Resource metrics
123 data.add_metric("buffer_usage_bytes",
124 static_cast<double>(buffer_usage_bytes_.load()),
126 data.add_metric("max_buffer_usage_bytes",
127 static_cast<double>(max_buffer_usage_bytes_.load()),
129 data.add_metric("queue_size",
130 static_cast<double>(queue_size_.load()),
132 data.add_metric("max_queue_size",
133 static_cast<double>(max_queue_size_.load()),
135
136 // Uptime
137 auto now = std::chrono::system_clock::now();
138 auto uptime = std::chrono::duration_cast<std::chrono::seconds>(
139 now - start_time_).count();
140 data.add_metric("uptime_seconds",
141 static_cast<double>(uptime),
143
144 // Add custom counters and gauges
145 {
146 std::lock_guard<std::mutex> lock(mutex_);
147
148 for (const auto& [name, value] : counters_) {
149 data.add_metric(name, value.load(), metric_type::counter);
150 }
151
152 for (const auto& [name, value] : gauges_) {
153 data.add_metric(name, value.load(), metric_type::gauge);
154 }
155
156 // Calculate histogram summaries
157 for (const auto& [name, values] : histograms_) {
158 if (!values.empty()) {
159 double sum = 0;
160 double min_val = values[0];
161 double max_val = values[0];
162
163 for (double v : values) {
164 sum += v;
165 min_val = std::min(min_val, v);
166 max_val = std::max(max_val, v);
167 }
168
169 double avg = sum / values.size();
170 data.add_metric(name + "_avg", avg, metric_type::summary);
171 data.add_metric(name + "_min", min_val, metric_type::summary);
172 data.add_metric(name + "_max", max_val, metric_type::summary);
173 data.add_metric(name + "_count",
174 static_cast<double>(values.size()),
176 }
177 }
178 }
179
180 return data;
181 }
std::atomic< size_t > max_buffer_usage_bytes_
std::unordered_map< std::string, std::vector< double > > histograms_
std::unordered_map< std::string, std::atomic< double > > counters_
std::atomic< bool > enabled_
std::atomic< size_t > buffer_usage_bytes_
std::unordered_map< std::string, std::atomic< double > > gauges_
std::atomic< uint64_t > min_processing_time_us_
std::atomic< uint64_t > total_processing_time_us_
std::atomic< uint64_t > max_processing_time_us_
@ gauge
A metric that can go up or down (e.g., queue depth).
@ counter
A monotonically increasing metric (e.g., total messages).
@ summary
Statistical summary.

References kcenon::logger::monitoring_data::add_metric(), buffer_usage_bytes_, kcenon::logger::counter, counters_, enabled_, errors_encountered_, kcenon::logger::gauge, gauges_, histograms_, max_buffer_usage_bytes_, max_processing_time_us_, max_queue_size_, messages_dropped_, messages_logged_, kcenon::logger::metrics_not_available, min_processing_time_us_, mutex_, queue_size_, start_time_, kcenon::logger::summary, total_processing_time_us_, and writers_failed_.

Here is the call graph for this function:

◆ get_backend_name()

std::string kcenon::logger::basic_monitor::get_backend_name ( ) const
inlineoverridevirtual

Get backend name.

Returns
"basic" for this implementation

Implements kcenon::logger::monitoring_interface.

Definition at line 315 of file basic_monitor.h.

315 {
316 return "basic";
317 }

◆ increment_counter()

void kcenon::logger::basic_monitor::increment_counter ( const std::string & name,
double value = 1.0 )
inlineoverridevirtual

Increment a counter.

Parameters
nameCounter name
valueIncrement value

Implements kcenon::logger::monitoring_interface.

Definition at line 324 of file basic_monitor.h.

324 {
325 if (!enabled_.load()) return;
326
327 if (name == "messages_logged") {
328 messages_logged_ += static_cast<uint64_t>(value);
329 } else if (name == "messages_dropped") {
330 messages_dropped_ += static_cast<uint64_t>(value);
331 } else if (name == "errors_encountered") {
332 errors_encountered_ += static_cast<uint64_t>(value);
333 } else if (name == "writers_failed") {
334 writers_failed_ += static_cast<uint64_t>(value);
335 } else {
336 std::lock_guard<std::mutex> lock(mutex_);
337 counters_[name] += value;
338 }
339 }

References counters_, enabled_, errors_encountered_, messages_dropped_, messages_logged_, mutex_, and writers_failed_.

◆ is_enabled()

bool kcenon::logger::basic_monitor::is_enabled ( ) const
inlineoverridevirtual

Check if monitoring is enabled.

Returns
true if enabled

Implements kcenon::logger::monitoring_interface.

Definition at line 307 of file basic_monitor.h.

307 {
308 return enabled_.load();
309 }

References enabled_.

◆ record_histogram()

void kcenon::logger::basic_monitor::record_histogram ( const std::string & name,
double value )
inlineoverridevirtual

Record a histogram value.

Parameters
nameHistogram name
valueValue to record

Implements kcenon::logger::monitoring_interface.

Definition at line 376 of file basic_monitor.h.

376 {
377 if (!enabled_.load()) return;
378
379 if (name == "processing_time_us") {
380 uint64_t us_value = static_cast<uint64_t>(value);
381 total_processing_time_us_ += us_value;
382
383 // Update max
384 uint64_t max_val = max_processing_time_us_.load();
385 while (us_value > max_val &&
386 !max_processing_time_us_.compare_exchange_weak(max_val, us_value)) {
387 // Loop until successful
388 }
389
390 // Update min
391 uint64_t min_val = min_processing_time_us_.load();
392 while (us_value < min_val &&
393 !min_processing_time_us_.compare_exchange_weak(min_val, us_value)) {
394 // Loop until successful
395 }
396 } else {
397 std::lock_guard<std::mutex> lock(mutex_);
398 histograms_[name].push_back(value);
399
400 // Limit histogram size to prevent unbounded growth
401 if (histograms_[name].size() > 10000) {
402 // Keep only recent values
403 histograms_[name].erase(histograms_[name].begin(),
404 histograms_[name].begin() + 5000);
405 }
406 }
407 }
@ size
Rotate based on file size only.

References enabled_, histograms_, max_processing_time_us_, min_processing_time_us_, mutex_, kcenon::logger::size, and total_processing_time_us_.

◆ reset_metrics()

common::VoidResult kcenon::logger::basic_monitor::reset_metrics ( )
inlineoverridevirtual

Reset all metrics.

Returns
Result indicating success

Implements kcenon::logger::monitoring_interface.

Definition at line 265 of file basic_monitor.h.

265 {
269 writers_failed_ = 0;
270
273 min_processing_time_us_ = UINT64_MAX;
274
277 queue_size_ = 0;
278 max_queue_size_ = 0;
279
280 {
281 std::lock_guard<std::mutex> lock(mutex_);
282 counters_.clear();
283 gauges_.clear();
284 histograms_.clear();
285 health_issues_.clear();
286 }
287
288 start_time_ = std::chrono::system_clock::now();
289
290 return common::ok();
291 }
VoidResult ok()

References buffer_usage_bytes_, counters_, errors_encountered_, gauges_, health_issues_, histograms_, max_buffer_usage_bytes_, max_processing_time_us_, max_queue_size_, messages_dropped_, messages_logged_, min_processing_time_us_, mutex_, kcenon::common::ok(), queue_size_, start_time_, total_processing_time_us_, and writers_failed_.

Here is the call graph for this function:

◆ set_enabled()

common::VoidResult kcenon::logger::basic_monitor::set_enabled ( bool enable)
inlineoverridevirtual

Enable or disable monitoring.

Parameters
enabletrue to enable
Returns
Result indicating success

Implements kcenon::logger::monitoring_interface.

Definition at line 298 of file basic_monitor.h.

298 {
299 enabled_ = enable;
300 return common::ok();
301 }

References enabled_, and kcenon::common::ok().

Here is the call graph for this function:

◆ update_gauge()

void kcenon::logger::basic_monitor::update_gauge ( const std::string & name,
double value )
inlineoverridevirtual

Update a gauge.

Parameters
nameGauge name
valueNew value

Implements kcenon::logger::monitoring_interface.

Definition at line 346 of file basic_monitor.h.

346 {
347 if (!enabled_.load()) return;
348
349 if (name == "buffer_usage_bytes") {
350 buffer_usage_bytes_ = static_cast<size_t>(value);
351 size_t max_val = max_buffer_usage_bytes_.load();
352 while (value > max_val &&
353 !max_buffer_usage_bytes_.compare_exchange_weak(max_val,
354 static_cast<size_t>(value))) {
355 // Loop until successful
356 }
357 } else if (name == "queue_size") {
358 queue_size_ = static_cast<size_t>(value);
359 size_t max_val = max_queue_size_.load();
360 while (value > max_val &&
361 !max_queue_size_.compare_exchange_weak(max_val,
362 static_cast<size_t>(value))) {
363 // Loop until successful
364 }
365 } else {
366 std::lock_guard<std::mutex> lock(mutex_);
367 gauges_[name] = value;
368 }
369 }

References buffer_usage_bytes_, enabled_, gauges_, max_buffer_usage_bytes_, max_queue_size_, mutex_, and queue_size_.

Member Data Documentation

◆ buffer_usage_bytes_

std::atomic<size_t> kcenon::logger::basic_monitor::buffer_usage_bytes_ {0}
private

Definition at line 50 of file basic_monitor.h.

50{0};

Referenced by collect_metrics(), reset_metrics(), and update_gauge().

◆ counters_

std::unordered_map<std::string, std::atomic<double> > kcenon::logger::basic_monitor::counters_
mutableprivate

Definition at line 59 of file basic_monitor.h.

Referenced by collect_metrics(), increment_counter(), and reset_metrics().

◆ enabled_

std::atomic<bool> kcenon::logger::basic_monitor::enabled_ {true}
private

◆ errors_encountered_

std::atomic<uint64_t> kcenon::logger::basic_monitor::errors_encountered_ {0}
private

Definition at line 41 of file basic_monitor.h.

41{0};

Referenced by check_health(), collect_metrics(), increment_counter(), and reset_metrics().

◆ gauges_

std::unordered_map<std::string, std::atomic<double> > kcenon::logger::basic_monitor::gauges_
mutableprivate

Definition at line 60 of file basic_monitor.h.

Referenced by collect_metrics(), reset_metrics(), and update_gauge().

◆ health_issues_

std::vector<std::string> kcenon::logger::basic_monitor::health_issues_
mutableprivate

Definition at line 56 of file basic_monitor.h.

Referenced by add_health_issue(), check_health(), clear_health_issues(), and reset_metrics().

◆ histograms_

std::unordered_map<std::string, std::vector<double> > kcenon::logger::basic_monitor::histograms_
mutableprivate

Definition at line 61 of file basic_monitor.h.

Referenced by collect_metrics(), record_histogram(), and reset_metrics().

◆ max_buffer_usage_bytes_

std::atomic<size_t> kcenon::logger::basic_monitor::max_buffer_usage_bytes_ {0}
private

Definition at line 51 of file basic_monitor.h.

51{0};

Referenced by collect_metrics(), reset_metrics(), and update_gauge().

◆ max_processing_time_us_

std::atomic<uint64_t> kcenon::logger::basic_monitor::max_processing_time_us_ {0}
private

Definition at line 46 of file basic_monitor.h.

46{0};

Referenced by collect_metrics(), record_histogram(), and reset_metrics().

◆ max_queue_size_

std::atomic<size_t> kcenon::logger::basic_monitor::max_queue_size_ {0}
private

Definition at line 53 of file basic_monitor.h.

53{0};

Referenced by check_health(), collect_metrics(), reset_metrics(), and update_gauge().

◆ messages_dropped_

std::atomic<uint64_t> kcenon::logger::basic_monitor::messages_dropped_ {0}
private

Definition at line 40 of file basic_monitor.h.

40{0};

Referenced by check_health(), collect_metrics(), increment_counter(), and reset_metrics().

◆ messages_logged_

std::atomic<uint64_t> kcenon::logger::basic_monitor::messages_logged_ {0}
private

Definition at line 39 of file basic_monitor.h.

39{0};

Referenced by check_health(), collect_metrics(), increment_counter(), and reset_metrics().

◆ min_processing_time_us_

std::atomic<uint64_t> kcenon::logger::basic_monitor::min_processing_time_us_ {UINT64_MAX}
private

Definition at line 47 of file basic_monitor.h.

47{UINT64_MAX};

Referenced by collect_metrics(), record_histogram(), and reset_metrics().

◆ mutex_

std::mutex kcenon::logger::basic_monitor::mutex_
mutableprivate

◆ queue_size_

std::atomic<size_t> kcenon::logger::basic_monitor::queue_size_ {0}
private

Definition at line 52 of file basic_monitor.h.

52{0};

Referenced by check_health(), collect_metrics(), reset_metrics(), and update_gauge().

◆ start_time_

std::chrono::system_clock::time_point kcenon::logger::basic_monitor::start_time_
private

Definition at line 64 of file basic_monitor.h.

Referenced by collect_metrics(), and reset_metrics().

◆ total_processing_time_us_

std::atomic<uint64_t> kcenon::logger::basic_monitor::total_processing_time_us_ {0}
private

Definition at line 45 of file basic_monitor.h.

45{0};

Referenced by collect_metrics(), record_histogram(), and reset_metrics().

◆ writers_failed_

std::atomic<uint64_t> kcenon::logger::basic_monitor::writers_failed_ {0}
private

Definition at line 42 of file basic_monitor.h.

42{0};

Referenced by check_health(), collect_metrics(), increment_counter(), and reset_metrics().


The documentation for this class was generated from the following file: