Skip to main content

ant_node/payment/
metrics.rs

1//! Quoting metrics tracking for ant-node.
2//!
3//! Tracks the single piece of state that influences quote pricing today:
4//! the number of records currently stored in the node's close range.
5//! See `payment::pricing::calculate_price` for the formula.
6
7use std::sync::atomic::{AtomicUsize, Ordering};
8
9/// Tracker for quoting metrics.
10///
11/// Holds the `close_records_stored` counter consumed by
12/// [`calculate_price`](crate::payment::pricing::calculate_price).
13#[derive(Debug)]
14pub struct QuotingMetricsTracker {
15    close_records_stored: AtomicUsize,
16}
17
18impl QuotingMetricsTracker {
19    /// Create a new metrics tracker.
20    ///
21    /// # Arguments
22    ///
23    /// * `initial_records` - Initial number of records stored
24    #[must_use]
25    pub fn new(initial_records: usize) -> Self {
26        Self {
27            close_records_stored: AtomicUsize::new(initial_records),
28        }
29    }
30
31    /// Record that a record was stored.
32    pub fn record_store(&self) {
33        self.close_records_stored.fetch_add(1, Ordering::SeqCst);
34    }
35
36    /// Get the number of records stored.
37    #[must_use]
38    pub fn records_stored(&self) -> usize {
39        self.close_records_stored.load(Ordering::SeqCst)
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_new_tracker() {
49        let tracker = QuotingMetricsTracker::new(50);
50        assert_eq!(tracker.records_stored(), 50);
51    }
52
53    #[test]
54    fn test_record_store_increments_counter() {
55        let tracker = QuotingMetricsTracker::new(0);
56        assert_eq!(tracker.records_stored(), 0);
57
58        tracker.record_store();
59        assert_eq!(tracker.records_stored(), 1);
60
61        tracker.record_store();
62        tracker.record_store();
63        assert_eq!(tracker.records_stored(), 3);
64    }
65}