11 breaking releases

0.25.0 Dec 2, 2024
0.24.0 Oct 31, 2024
0.23.0 Sep 30, 2024
0.20.0 Jun 27, 2024
0.1.0 Dec 4, 2023

#594 in Asynchronous

Download history 1115/week @ 2024-08-21 1215/week @ 2024-08-28 1434/week @ 2024-09-04 761/week @ 2024-09-11 946/week @ 2024-09-18 1660/week @ 2024-09-25 946/week @ 2024-10-02 675/week @ 2024-10-09 900/week @ 2024-10-16 1076/week @ 2024-10-23 2232/week @ 2024-10-30 1073/week @ 2024-11-06 1995/week @ 2024-11-13 2015/week @ 2024-11-20 2371/week @ 2024-11-27 1470/week @ 2024-12-04

7,951 downloads per month
Used in 55 crates (4 directly)

MIT/Apache

285KB
4.5K SLoC

Rate-limited logging for frequent events

Often we want to tell the user about an event that is undesirable when it happens, but which can happen very frequently. In that case, we don't want to log "There was a problem!" a thousand times per hour. Instead, we'd like our logs to look more like "connecting to the guard X: error (problem occurred 1310/2000 times in the last hour)"

This crate is part of arti, and is not adapted for use outside of it: it assumes that your logging system is tracing, and that you are using tor_rtcompat for your asynchronous runtime.

Setup

Before you can use this crate, you need to call install_runtime, or messages won't be collected.

Example

use tor_log_ratelim::log_ratelim;
# use std::num::ParseIntError;
pub fn parse_u8(source: &str, s: &str) -> u8 {
    let r: Result<u8, ParseIntError> = s.parse();
    log_ratelim!(
        // The activity we were performing
        "parsing an integer from {}", source;
        // A Result to decide whether it succeeded 
        r; 
        // An error message to report on failure, with rate limiting,
        // after some time has elapsed.
        // The error itself is always reported.
        Err(_) => WARN, "Had to use default";
        // A success message to report (without rate limiting)
        // on every success.
        Ok(v) => TRACE, "Got {}", v;
    );
    r.unwrap_or(0)
}

The above example might produce WARN outputs more or less like these:

WARN: Parsing an integer from cache: error (Problem occurred 7/10 times in the last minute): Had to use default: invalid digit found in string"
WARN: Parsing an integer from cache: error (Problem occurred 81/92 times in the last 5 minutes): Had to use default: number too large to fit in target type"
WARN: Parsing an integer from cache: now working (Problem occurred 0/106 times in the last 5 minutes)

and TRACE outputs like these:

TRACE: Parsing an integer from cache: Got 7
TRACE: Parsing an integer from cache: Got 14
TRACE: Parsing an integer from the network: Got 2

For more information on log_ratelim!, and simpler ways to invoke it, see its documentation.

Dependencies

~2.1–3.5MB
~63K SLoC