Skip to main content

elfo_core/logging/
control.rs

1use 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    // The compiler should optimize this expression because `tracing::Level` is
40    // based on the same values internally.
41    match level {
42        Level::TRACE => 0,
43        Level::DEBUG => 1,
44        Level::INFO => 2,
45        Level::WARN => 3,
46        Level::ERROR => 4,
47    }
48}