use std::sync::atomic::{AtomicUsize, Ordering};
pub const AND_CANDIDATES_SEEN_METRIC: &str = "and_candidates_seen";
pub const AND_CANDIDATES_PRUNED_BEFORE_RETURN_METRIC: &str = "and_candidates_pruned_before_return";
pub const AND_FULL_SCORES_METRIC: &str = "and_full_scores";
pub const FREQS_COLLECTED_METRIC: &str = "freqs_collected";
pub trait MetricsCollector: Send + Sync {
fn record_parts_loaded(&self, num_parts: usize);
fn record_part_load(&self) {
self.record_parts_loaded(1);
}
fn record_index_loads(&self, num_indexes: usize);
fn record_index_load(&self) {
self.record_index_loads(1);
}
fn record_comparisons(&self, num_comparisons: usize);
fn record_and_candidates_seen(&self, _num_candidates: usize) {}
fn record_and_candidates_pruned_before_return(&self, _num_candidates: usize) {}
fn record_and_full_scores(&self, _num_scores: usize) {}
fn record_freqs_collected(&self, _num_collections: usize) {}
fn io_stats(&self) -> Option<lance_io::scheduler::IoStats> {
None
}
}
pub struct NoOpMetricsCollector;
impl MetricsCollector for NoOpMetricsCollector {
fn record_parts_loaded(&self, _num_parts: usize) {}
fn record_index_loads(&self, _num_indexes: usize) {}
fn record_comparisons(&self, _num_comparisons: usize) {}
}
#[derive(Default)]
pub struct LocalMetricsCollector {
pub parts_loaded: AtomicUsize,
pub index_loads: AtomicUsize,
pub comparisons: AtomicUsize,
}
impl LocalMetricsCollector {
pub fn dump_into(self, other: &dyn MetricsCollector) {
other.record_parts_loaded(self.parts_loaded.load(Ordering::Relaxed));
other.record_index_loads(self.index_loads.load(Ordering::Relaxed));
other.record_comparisons(self.comparisons.load(Ordering::Relaxed));
}
}
impl MetricsCollector for LocalMetricsCollector {
fn record_parts_loaded(&self, num_parts: usize) {
self.parts_loaded.fetch_add(num_parts, Ordering::Relaxed);
}
fn record_index_loads(&self, num_indexes: usize) {
self.index_loads.fetch_add(num_indexes, Ordering::Relaxed);
}
fn record_comparisons(&self, num_comparisons: usize) {
self.comparisons
.fetch_add(num_comparisons, Ordering::Relaxed);
}
}