elfo_core/logging/
control.rs1use tracing::{Level, Metadata};
2
3use elfo_utils::{CachePadded, RateLimit, RateLimiter};
4
5use super::config::LoggingConfig;
6
7#[derive(Default)]
8#[instability::unstable]
9pub struct LoggingControl {
10 limiters: [CachePadded<RateLimiter>; 5],
11}
12
13impl LoggingControl {
14 pub(crate) fn configure(&self, config: &LoggingConfig) {
15 for limiter in &self.limiters {
16 limiter.configure(RateLimit::Rps(config.max_rate_per_level));
17 }
18 }
19
20 #[instability::unstable]
21 pub fn check(&self, meta: &Metadata<'_>) -> CheckResult {
22 let limiter = &self.limiters[log_level_to_value(*meta.level())];
23 if limiter.acquire() {
24 CheckResult::Passed
25 } else {
26 CheckResult::Limited
27 }
28 }
29}
30
31#[instability::unstable]
32pub enum CheckResult {
33 Passed,
34 NotInterested,
35 Limited,
36}
37
38fn log_level_to_value(level: Level) -> usize {
39 match level {
42 Level::TRACE => 0,
43 Level::DEBUG => 1,
44 Level::INFO => 2,
45 Level::WARN => 3,
46 Level::ERROR => 4,
47 }
48}