Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
logger_metrics.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
10#pragma once
11
12#include <atomic>
13#include <chrono>
14#include <cstdint>
15#include <map>
16#include <string>
17
19
21
26 std::atomic<uint64_t> messages_logged{0};
27 std::atomic<uint64_t> messages_dropped{0};
28 std::atomic<uint64_t> total_log_time_ns{0};
29 std::atomic<uint64_t> queue_size{0};
30 std::atomic<uint64_t> max_queue_size{0};
31 std::atomic<uint64_t> writer_errors{0};
32 std::atomic<uint64_t> flush_operations{0};
33
34 // Compatibility counters for legacy integrations
35 std::atomic<uint64_t> messages_enqueued{0};
36 std::atomic<uint64_t> messages_processed{0};
37
39 uint64_t messages_written{0};
40 uint64_t bytes_written{0};
41 uint64_t write_failures{0};
42
43 double get_avg_write_time_us() const { return 0.0; }
44 };
45
46 std::map<std::string, writer_stats_compat> writer_stats;
47
48 // Copy constructor to allow copying atomic values
61
63 if (this != &other) {
64 messages_logged.store(other.messages_logged.load());
65 messages_dropped.store(other.messages_dropped.load());
66 total_log_time_ns.store(other.total_log_time_ns.load());
67 queue_size.store(other.queue_size.load());
68 max_queue_size.store(other.max_queue_size.load());
69 writer_errors.store(other.writer_errors.load());
70 flush_operations.store(other.flush_operations.load());
71 messages_enqueued.store(other.messages_enqueued.load());
72 messages_processed.store(other.messages_processed.load());
74 }
75 return *this;
76 }
77
78 // Move constructor
80 : messages_logged(other.messages_logged.load()),
81 messages_dropped(other.messages_dropped.load()),
82 total_log_time_ns(other.total_log_time_ns.load()),
83 queue_size(other.queue_size.load()),
84 max_queue_size(other.max_queue_size.load()),
85 writer_errors(other.writer_errors.load()),
86 flush_operations(other.flush_operations.load()),
87 messages_enqueued(other.messages_enqueued.load()),
88 messages_processed(other.messages_processed.load()),
89 writer_stats(std::move(other.writer_stats)) {}
90
94 double get_messages_per_second() const {
95 auto msgs = messages_logged.load();
96 auto time_ns = total_log_time_ns.load();
97 if (time_ns == 0) return 0.0;
98 return static_cast<double>(msgs) * 1'000'000'000.0 / static_cast<double>(time_ns);
99 }
100
104 uint64_t get_avg_enqueue_time_ns() const {
105 auto msgs = messages_logged.load();
106 auto time_ns = total_log_time_ns.load();
107 if (msgs == 0) return 0;
108 return time_ns / msgs;
109 }
110
115 auto current = queue_size.load();
116 auto max_size = max_queue_size.load();
117 if (max_size == 0) return 0.0;
118 return static_cast<double>(current) * 100.0 / static_cast<double>(max_size);
119 }
120
121 double get_drop_rate_percent() const {
122 auto enqueued = messages_enqueued.load();
123 if (enqueued == 0) {
124 return 0.0;
125 }
126 auto dropped = messages_dropped.load();
127 return static_cast<double>(dropped) * 100.0 / static_cast<double>(enqueued);
128 }
129
130 double get_bytes_per_second() const {
131 return 0.0;
132 }
133
137 void reset() {
138 messages_logged.store(0);
139 messages_dropped.store(0);
140 total_log_time_ns.store(0);
141 queue_size.store(0);
142 max_queue_size.store(0);
143 writer_errors.store(0);
144 flush_operations.store(0);
145 messages_enqueued.store(0);
146 messages_processed.store(0);
147 writer_stats.clear();
148 }
149};
150
154extern LOGGER_SYSTEM_API logger_performance_stats g_logger_stats;
155
159inline void record_message_logged(uint64_t time_ns) {
160 g_logger_stats.messages_logged.fetch_add(1);
163 g_logger_stats.total_log_time_ns.fetch_add(time_ns);
164}
165
170 g_logger_stats.messages_dropped.fetch_add(1);
172}
173
177inline void update_queue_size(uint64_t current_size) {
178 g_logger_stats.queue_size.store(current_size);
179
180 // Update max queue size if necessary
181 uint64_t current_max = g_logger_stats.max_queue_size.load();
182 while (current_size > current_max) {
183 if (g_logger_stats.max_queue_size.compare_exchange_weak(current_max, current_size)) {
184 break;
185 }
186 }
187}
188
192inline void record_writer_error() {
193 g_logger_stats.writer_errors.fetch_add(1);
194}
195
200 g_logger_stats.flush_operations.fetch_add(1);
201}
202
203} // namespace kcenon::logger::metrics
DLL export/import macros for logger_system shared library support.
#define LOGGER_SYSTEM_API
void update_queue_size(uint64_t current_size)
Update queue size metrics.
void record_flush_operation()
Record a flush operation.
void record_message_logged(uint64_t time_ns)
Record a logged message.
LOGGER_SYSTEM_API logger_performance_stats g_logger_stats
Global logger metrics instance.
void record_writer_error()
Record a writer error.
void record_message_dropped()
Record a dropped message.
Performance statistics for logger operations.
logger_performance_stats(logger_performance_stats &&other) noexcept
std::atomic< uint64_t > flush_operations
Number of flush operations.
double get_queue_utilization_percent() const
Get queue utilization percentage.
std::atomic< uint64_t > queue_size
Current queue size.
std::map< std::string, writer_stats_compat > writer_stats
Legacy per-writer statistics.
uint64_t get_avg_enqueue_time_ns() const
Get average enqueue time in nanoseconds.
std::atomic< uint64_t > messages_enqueued
Legacy alias for enqueued messages.
std::atomic< uint64_t > total_log_time_ns
Total time spent logging (nanoseconds)
logger_performance_stats(const logger_performance_stats &other)
std::atomic< uint64_t > writer_errors
Number of writer errors.
double get_messages_per_second() const
Get messages per second.
logger_performance_stats & operator=(const logger_performance_stats &other)
std::atomic< uint64_t > messages_dropped
Messages dropped due to queue full.
std::atomic< uint64_t > messages_processed
Legacy alias for processed messages.
std::atomic< uint64_t > messages_logged
Total messages logged.
std::atomic< uint64_t > max_queue_size
Maximum queue size reached.