#[cfg(all(feature = "metrics", feature = "native"))]
mod imp {
pub struct Timer(std::time::Instant);
impl Timer {
#[inline]
pub fn start() -> Self {
Timer(std::time::Instant::now())
}
#[inline]
pub fn secs(&self) -> f64 {
self.0.elapsed().as_secs_f64()
}
}
#[allow(clippy::too_many_arguments)]
pub fn bmp_query(
field: u32,
secs: f64,
sbs_scored: usize,
sbs_total: usize,
blocks_scored: usize,
blocks_total: usize,
docmap_lookups: usize,
) {
let field = field.to_string();
metrics::histogram!("hermes_bmp_query_duration_seconds", "field" => field.clone())
.record(secs);
metrics::counter!("hermes_bmp_superblocks_visited_total", "field" => field.clone())
.increment(sbs_scored as u64);
metrics::counter!("hermes_bmp_superblocks_skipped_total", "field" => field.clone())
.increment(sbs_total.saturating_sub(sbs_scored) as u64);
metrics::counter!("hermes_bmp_blocks_scored_total", "field" => field.clone())
.increment(blocks_scored as u64);
metrics::counter!("hermes_bmp_blocks_skipped_total", "field" => field.clone())
.increment(blocks_total.saturating_sub(blocks_scored) as u64);
metrics::histogram!("hermes_bmp_blocks_scored_per_query", "field" => field.clone())
.record(blocks_scored as f64);
metrics::counter!("hermes_bmp_docmap_lookups_total", "field" => field.clone())
.increment(docmap_lookups as u64);
metrics::histogram!("hermes_bmp_docmap_lookups_per_query", "field" => field)
.record(docmap_lookups as f64);
}
pub fn maxscore_query(secs: f64, docs_returned: usize) {
metrics::histogram!("hermes_sparse_maxscore_query_duration_seconds").record(secs);
metrics::histogram!("hermes_sparse_maxscore_docs_returned").record(docs_returned as f64);
}
pub fn dense_l1(field: u32, kind: &'static str, secs: f64, candidates: usize) {
let field = field.to_string();
metrics::histogram!("hermes_dense_l1_duration_seconds", "field" => field.clone(), "kind" => kind)
.record(secs);
metrics::histogram!("hermes_dense_l1_candidates", "field" => field, "kind" => kind)
.record(candidates as f64);
}
pub fn dense_rerank(
field: u32,
total_secs: f64,
resolve_secs: f64,
read_secs: f64,
vectors: usize,
) {
let field = field.to_string();
metrics::histogram!("hermes_dense_rerank_duration_seconds", "field" => field.clone())
.record(total_secs);
metrics::histogram!("hermes_dense_rerank_resolve_duration_seconds", "field" => field.clone())
.record(resolve_secs);
metrics::histogram!("hermes_dense_rerank_read_duration_seconds", "field" => field.clone())
.record(read_secs);
metrics::histogram!("hermes_dense_rerank_vectors", "field" => field).record(vectors as f64);
}
pub fn directory_read(op: &'static str, secs: f64, bytes: usize) {
metrics::histogram!("hermes_directory_read_duration_seconds", "op" => op).record(secs);
metrics::histogram!("hermes_directory_read_bytes", "op" => op).record(bytes as f64);
}
pub fn store_get(secs: f64) {
metrics::histogram!("hermes_store_get_duration_seconds").record(secs);
}
pub fn cold_write(bytes: usize) {
metrics::counter!("hermes_cold_write_bytes_total").increment(bytes as u64);
}
}
#[cfg(not(all(feature = "metrics", feature = "native")))]
mod imp {
pub struct Timer;
impl Timer {
#[inline(always)]
pub fn start() -> Self {
Timer
}
#[inline(always)]
pub fn secs(&self) -> f64 {
0.0
}
}
#[inline(always)]
pub fn bmp_query(_: u32, _: f64, _: usize, _: usize, _: usize, _: usize, _: usize) {}
#[inline(always)]
pub fn maxscore_query(_: f64, _: usize) {}
#[inline(always)]
pub fn dense_l1(_: u32, _: &'static str, _: f64, _: usize) {}
#[inline(always)]
pub fn dense_rerank(_: u32, _: f64, _: f64, _: f64, _: usize) {}
#[inline(always)]
pub fn directory_read(_: &'static str, _: f64, _: usize) {}
#[inline(always)]
pub fn store_get(_: f64) {}
#[inline(always)]
pub fn cold_write(_: usize) {}
}
pub(crate) use imp::*;