118 [[nodiscard]]
bool should_sample(
const log_entry& entry);
126 [[nodiscard]]
bool should_sample(log_level level,
127 const std::string& message);
136 [[nodiscard]]
bool should_sample(log_level level,
137 const std::string& message,
138 const std::optional<std::string>& category);
173 [[nodiscard]]
bool is_enabled()
const;
179 void set_enabled(
bool enabled);
185 [[nodiscard]]
double get_effective_rate()
const;
193 [[nodiscard]]
bool should_bypass_level(log_level level)
const;
201 [[nodiscard]]
bool should_bypass_field(
const log_entry& entry)
const;
209 [[nodiscard]]
double get_field_rate(
const log_entry& entry)
const;
216 [[nodiscard]]
double get_category_rate(
const std::string& category)
const;
223 [[nodiscard]]
bool random_sample(
double rate);
229 [[nodiscard]]
bool rate_limit_sample();
235 [[nodiscard]]
bool adaptive_sample();
243 [[nodiscard]]
bool hash_sample(
const std::string& message,
double rate);
248 void update_adaptive_rate();
254 [[nodiscard]] std::uint64_t xorshift64();
261 [[nodiscard]]
static std::uint64_t fnv1a_hash(
const std::string& str);
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};
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};
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};
300 static std::unique_ptr<log_sampler> create_disabled();
307 static std::unique_ptr<log_sampler> create_random(
double rate);
314 static std::unique_ptr<log_sampler> create_rate_limited(std::size_t max_per_second);
322 static std::unique_ptr<log_sampler> create_adaptive(
323 std::size_t threshold = 10000,
324 double min_rate = 0.01);
332 static std::unique_ptr<log_sampler> create_production(
333 double base_rate = 0.1,
334 std::vector<log_level> critical_levels = {
Data structures for representing log entries and source locations kcenon.
Represents a single log entry with all associated metadata.