use std::sync::atomic::{AtomicU64, Ordering};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FoldStats {
pub kind: u16,
pub channel_prefix: String,
pub entries: u64,
pub applies_inserted: u64,
pub applies_replaced: u64,
pub applies_rejected: u64,
pub applies_total: u64,
pub expiries: u64,
pub evictions: u64,
pub queries: u64,
pub snapshots_taken: u64,
pub snapshots_restored: u64,
pub has_audit_sink: bool,
}
#[derive(Debug, Default)]
pub struct FoldMetrics {
entries: AtomicU64,
applies_inserted: AtomicU64,
applies_replaced: AtomicU64,
applies_rejected: AtomicU64,
expiries: AtomicU64,
evictions: AtomicU64,
queries: AtomicU64,
snapshots_taken: AtomicU64,
snapshots_restored: AtomicU64,
}
impl FoldMetrics {
pub fn new() -> Self {
Self::default()
}
#[inline]
pub(super) fn on_insert(&self) {
self.applies_inserted.fetch_add(1, Ordering::Relaxed);
self.entries.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_replace(&self) {
self.applies_replaced.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_reject(&self) {
self.applies_rejected.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_evict(&self) {
self.evictions.fetch_add(1, Ordering::Relaxed);
self.entries.fetch_sub(1, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_expire(&self) {
self.expiries.fetch_add(1, Ordering::Relaxed);
self.entries.fetch_sub(1, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_query(&self) {
self.queries.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_snapshot_taken(&self) {
self.snapshots_taken.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_snapshot_restored(&self, new_entry_count: u64) {
self.snapshots_restored.fetch_add(1, Ordering::Relaxed);
self.entries.store(new_entry_count, Ordering::Relaxed);
}
pub fn entries(&self) -> u64 {
self.entries.load(Ordering::Relaxed)
}
pub fn applies_inserted(&self) -> u64 {
self.applies_inserted.load(Ordering::Relaxed)
}
pub fn applies_replaced(&self) -> u64 {
self.applies_replaced.load(Ordering::Relaxed)
}
pub fn applies_rejected(&self) -> u64 {
self.applies_rejected.load(Ordering::Relaxed)
}
pub fn applies_total(&self) -> u64 {
self.applies_inserted() + self.applies_replaced() + self.applies_rejected()
}
pub fn expiries(&self) -> u64 {
self.expiries.load(Ordering::Relaxed)
}
pub fn evictions(&self) -> u64 {
self.evictions.load(Ordering::Relaxed)
}
pub fn queries(&self) -> u64 {
self.queries.load(Ordering::Relaxed)
}
pub fn snapshots_taken(&self) -> u64 {
self.snapshots_taken.load(Ordering::Relaxed)
}
pub fn snapshots_restored(&self) -> u64 {
self.snapshots_restored.load(Ordering::Relaxed)
}
}