Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
sampling_config.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
25#include <vector>
26#include <string>
27#include <unordered_map>
28#include <cstddef>
29#include <cstdint>
30
31#include <kcenon/common/interfaces/logger_interface.h>
32
34
35// Type alias for log_level
36using log_level = common::interfaces::log_level;
37
50enum class sampling_strategy : std::uint8_t {
51 random,
53 adaptive,
55};
56
81 bool enabled = false;
82
90 double rate = 1.0;
91
97
103 std::vector<log_level> always_log_levels = {
104 log_level::error,
105 log_level::critical
106 };
107
120 std::unordered_map<std::string, double> category_rates;
121
140 std::unordered_map<std::string, std::unordered_map<std::string, double>> field_rates;
141
154 std::vector<std::string> always_log_fields;
155
156 // Rate limiting specific settings
157
162 std::size_t rate_limit_per_second = 1000;
163
168 std::size_t rate_limit_window_ms = 1000;
169
170 // Adaptive sampling specific settings
171
177 bool adaptive_enabled = false;
178
183 std::size_t adaptive_threshold = 10000;
184
189 double adaptive_min_rate = 0.01;
190
191 // Hash-based sampling specific settings
192
197 std::uint64_t hash_seed = 0;
198
204 return sampling_config{};
205 }
206
212 static sampling_config random_sampling(double sample_rate) {
213 sampling_config config;
214 config.enabled = true;
215 config.rate = sample_rate;
217 return config;
218 }
219
225 static sampling_config rate_limited(std::size_t max_per_second) {
226 sampling_config config;
227 config.enabled = true;
229 config.rate_limit_per_second = max_per_second;
230 return config;
231 }
232
239 static sampling_config adaptive(std::size_t threshold, double min_rate = 0.01) {
240 sampling_config config;
241 config.enabled = true;
243 config.adaptive_enabled = true;
244 config.adaptive_threshold = threshold;
245 config.adaptive_min_rate = min_rate;
246 return config;
247 }
248
255 static sampling_config hash_based(double sample_rate, std::uint64_t seed = 0) {
256 sampling_config config;
257 config.enabled = true;
258 config.rate = sample_rate;
260 config.hash_seed = seed;
261 return config;
262 }
263
277 sampling_config with_always_log(std::vector<log_level> levels) && {
278 always_log_levels = std::move(levels);
279 return std::move(*this);
280 }
281
289 sampling_config with_always_log(std::vector<log_level> levels) const & {
290 sampling_config copy = *this;
291 copy.always_log_levels = std::move(levels);
292 return copy;
293 }
294};
295
309 std::uint64_t total_count = 0;
310
314 std::uint64_t sampled_count = 0;
315
319 std::uint64_t dropped_count = 0;
320
324 std::uint64_t bypassed_count = 0;
325
330 double effective_rate = 1.0;
331
335 bool is_throttling = false;
336
341 [[nodiscard]] double actual_ratio() const {
342 if (total_count == 0) {
343 return 1.0;
344 }
345 return static_cast<double>(sampled_count + bypassed_count) /
346 static_cast<double>(total_count);
347 }
348
352 void reset() {
353 total_count = 0;
354 sampled_count = 0;
355 dropped_count = 0;
356 bypassed_count = 0;
357 effective_rate = 1.0;
358 is_throttling = false;
359 }
360};
361
362} // namespace kcenon::logger::sampling
common::interfaces::log_level log_level
sampling_strategy
Defines the sampling algorithm to use.
@ hash_based
Deterministic sampling based on message hash.
@ random
Simple random sampling based on probability.
@ rate_limiting
Rate-based sampling (N logs per time window)
@ adaptive
Adaptive sampling that adjusts based on volume.
Configuration for log sampling behavior.
static sampling_config random_sampling(double sample_rate)
Create a random sampling configuration.
double rate
Base sampling rate (0.0 to 1.0)
static sampling_config rate_limited(std::size_t max_per_second)
Create a rate limiting configuration.
std::size_t adaptive_threshold
Threshold (messages/second) to trigger adaptive sampling.
std::vector< std::string > always_log_fields
std::unordered_map< std::string, std::unordered_map< std::string, double > > field_rates
std::unordered_map< std::string, double > category_rates
std::size_t rate_limit_per_second
Maximum logs per second for rate limiting strategy.
std::size_t rate_limit_window_ms
Time window for rate limiting (milliseconds)
std::uint64_t hash_seed
Seed for hash-based sampling.
static sampling_config hash_based(double sample_rate, std::uint64_t seed=0)
Create a hash-based sampling configuration.
sampling_config with_always_log(std::vector< log_level > levels) const &
Set log levels that bypass sampling (fluent interface, lvalue overload)
bool adaptive_enabled
Enable adaptive sampling.
double adaptive_min_rate
Minimum sampling rate when adaptive sampling is active.
static sampling_config disabled()
Create a default sampling configuration (disabled)
static sampling_config adaptive(std::size_t threshold, double min_rate=0.01)
Create an adaptive sampling configuration.
sampling_strategy strategy
Sampling strategy to use.
sampling_config with_always_log(std::vector< log_level > levels) &&
std::vector< log_level > always_log_levels
Log levels that are never sampled (always logged)
bool enabled
Enable or disable sampling.
Statistics about sampling behavior.
std::uint64_t sampled_count
Number of messages that passed sampling (were logged)
std::uint64_t bypassed_count
Number of messages that bypassed sampling (always_log levels)
double actual_ratio() const
Calculate the actual sampling ratio.
std::uint64_t dropped_count
Number of messages dropped due to sampling.
double effective_rate
Current effective sampling rate.
bool is_throttling
Whether adaptive sampling is currently reducing the rate.
std::uint64_t total_count
Total number of log messages considered for sampling.