Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
log_sampler.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
34#include "sampling_config.h"
37#include <kcenon/common/interfaces/logger_interface.h>
38
39#include <atomic>
40#include <chrono>
41#include <memory>
42#include <mutex>
43#include <shared_mutex>
44#include <optional>
45
47
48// Type alias for log_level (may already be available from sampling_config.h, but explicit here for clarity)
49using log_level = common::interfaces::log_level;
50
72public:
77 explicit log_sampler(const sampling_config& config = sampling_config{});
78
82 ~log_sampler() = default;
83
88 log_sampler(const log_sampler&) = delete;
89
94
98 log_sampler(log_sampler&& other) noexcept;
99
103 log_sampler& operator=(log_sampler&& other) noexcept;
104
118 [[nodiscard]] bool should_sample(const log_entry& entry);
119
126 [[nodiscard]] bool should_sample(log_level level,
127 const std::string& message);
128
136 [[nodiscard]] bool should_sample(log_level level,
137 const std::string& message,
138 const std::optional<std::string>& category);
139
146 void set_config(const sampling_config& config);
147
152 [[nodiscard]] sampling_config get_config() const;
153
160 [[nodiscard]] sampling_stats get_stats() const;
161
167 void reset_stats();
168
173 [[nodiscard]] bool is_enabled() const;
174
179 void set_enabled(bool enabled);
180
185 [[nodiscard]] double get_effective_rate() const;
186
187private:
193 [[nodiscard]] bool should_bypass_level(log_level level) const;
194
201 [[nodiscard]] bool should_bypass_field(const log_entry& entry) const;
202
209 [[nodiscard]] double get_field_rate(const log_entry& entry) const;
210
216 [[nodiscard]] double get_category_rate(const std::string& category) const;
217
223 [[nodiscard]] bool random_sample(double rate);
224
229 [[nodiscard]] bool rate_limit_sample();
230
235 [[nodiscard]] bool adaptive_sample();
236
243 [[nodiscard]] bool hash_sample(const std::string& message, double rate);
244
248 void update_adaptive_rate();
249
254 [[nodiscard]] std::uint64_t xorshift64();
255
261 [[nodiscard]] static std::uint64_t fnv1a_hash(const std::string& str);
262
263 // Configuration
265 mutable std::shared_mutex config_mutex_;
266
267 // Statistics (atomic for lock-free access)
268 std::atomic<std::uint64_t> total_count_{0};
269 std::atomic<std::uint64_t> sampled_count_{0};
270 std::atomic<std::uint64_t> dropped_count_{0};
271 std::atomic<std::uint64_t> bypassed_count_{0};
272
273 // Random sampling state
274 std::atomic<std::uint64_t> rng_state_;
275
276 // Rate limiting state
277 std::atomic<std::uint64_t> rate_limit_count_{0};
278 std::atomic<std::chrono::steady_clock::time_point::rep> rate_limit_window_start_{0};
280
281 // Adaptive sampling state
282 std::atomic<double> effective_rate_{1.0};
283 std::atomic<std::uint64_t> adaptive_window_count_{0};
284 std::atomic<std::chrono::steady_clock::time_point::rep> adaptive_window_start_{0};
285 std::atomic<bool> is_throttling_{false};
286};
287
295public:
300 static std::unique_ptr<log_sampler> create_disabled();
301
307 static std::unique_ptr<log_sampler> create_random(double rate);
308
314 static std::unique_ptr<log_sampler> create_rate_limited(std::size_t max_per_second);
315
322 static std::unique_ptr<log_sampler> create_adaptive(
323 std::size_t threshold = 10000,
324 double min_rate = 0.01);
325
332 static std::unique_ptr<log_sampler> create_production(
333 double base_rate = 0.1,
334 std::vector<log_level> critical_levels = {
335 log_level::warn,
336 log_level::error,
337 log_level::fatal
338 });
339};
340
341} // namespace kcenon::logger::sampling
Thread-safe log sampler with multiple strategy support.
Definition log_sampler.h:71
log_sampler(const log_sampler &)=delete
Copy constructor (deleted)
log_sampler & operator=(const log_sampler &)=delete
Copy assignment operator (deleted)
std::atomic< std::uint64_t > rng_state_
Factory for creating pre-configured samplers.
Data structures for representing log entries and source locations kcenon.
DLL export/import macros for logger_system shared library support.
#define LOGGER_SYSTEM_API
common::interfaces::log_level log_level
Configuration structures and enums for log sampling kcenon.
Represents a single log entry with all associated metadata.
Definition log_entry.h:155
Configuration for log sampling behavior.
Statistics about sampling behavior.