106 lines
3.3 KiB
Rust
106 lines
3.3 KiB
Rust
use lazy_static::lazy_static;
|
|
use prometheus::{
|
|
register_counter, register_counter_vec, register_gauge, register_gauge_vec,
|
|
register_histogram_vec, Counter, CounterVec, Encoder, Gauge, GaugeVec, HistogramVec, Opts,
|
|
Registry, TextEncoder,
|
|
};
|
|
|
|
pub mod health;
|
|
pub mod recorder;
|
|
|
|
pub use health::{
|
|
CollectionHealth, HealthChecker, HealthResponse, HealthStatus, ReadinessResponse,
|
|
};
|
|
pub use recorder::MetricsRecorder;
|
|
|
|
lazy_static! {
|
|
pub static ref REGISTRY: Registry = Registry::new();
|
|
|
|
// Search metrics
|
|
pub static ref SEARCH_REQUESTS_TOTAL: CounterVec = register_counter_vec!(
|
|
Opts::new("ruvector_search_requests_total", "Total search requests"),
|
|
&["collection", "status"]
|
|
).unwrap();
|
|
|
|
pub static ref SEARCH_LATENCY_SECONDS: HistogramVec = register_histogram_vec!(
|
|
"ruvector_search_latency_seconds",
|
|
"Search latency in seconds",
|
|
&["collection"],
|
|
vec![0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0]
|
|
).unwrap();
|
|
|
|
// Insert metrics
|
|
pub static ref INSERT_REQUESTS_TOTAL: CounterVec = register_counter_vec!(
|
|
Opts::new("ruvector_insert_requests_total", "Total insert requests"),
|
|
&["collection", "status"]
|
|
).unwrap();
|
|
|
|
pub static ref INSERT_LATENCY_SECONDS: HistogramVec = register_histogram_vec!(
|
|
"ruvector_insert_latency_seconds",
|
|
"Insert latency in seconds",
|
|
&["collection"],
|
|
vec![0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0]
|
|
).unwrap();
|
|
|
|
pub static ref VECTORS_INSERTED_TOTAL: CounterVec = register_counter_vec!(
|
|
Opts::new("ruvector_vectors_inserted_total", "Total vectors inserted"),
|
|
&["collection"]
|
|
).unwrap();
|
|
|
|
// Delete metrics
|
|
pub static ref DELETE_REQUESTS_TOTAL: CounterVec = register_counter_vec!(
|
|
Opts::new("ruvector_delete_requests_total", "Total delete requests"),
|
|
&["collection", "status"]
|
|
).unwrap();
|
|
|
|
// Collection metrics
|
|
pub static ref VECTORS_TOTAL: GaugeVec = register_gauge_vec!(
|
|
Opts::new("ruvector_vectors_total", "Total vectors stored"),
|
|
&["collection"]
|
|
).unwrap();
|
|
|
|
pub static ref COLLECTIONS_TOTAL: Gauge = register_gauge!(
|
|
Opts::new("ruvector_collections_total", "Total number of collections")
|
|
).unwrap();
|
|
|
|
// System metrics
|
|
pub static ref MEMORY_USAGE_BYTES: Gauge = register_gauge!(
|
|
Opts::new("ruvector_memory_usage_bytes", "Memory usage in bytes")
|
|
).unwrap();
|
|
|
|
pub static ref UPTIME_SECONDS: Counter = register_counter!(
|
|
Opts::new("ruvector_uptime_seconds", "Uptime in seconds")
|
|
).unwrap();
|
|
}
|
|
|
|
/// Gather all metrics in Prometheus text format
|
|
pub fn gather_metrics() -> String {
|
|
let encoder = TextEncoder::new();
|
|
let metric_families = prometheus::gather();
|
|
let mut buffer = Vec::new();
|
|
encoder.encode(&metric_families, &mut buffer).unwrap();
|
|
String::from_utf8(buffer).unwrap()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_gather_metrics() {
|
|
let metrics = gather_metrics();
|
|
assert!(metrics.contains("ruvector"));
|
|
}
|
|
|
|
#[test]
|
|
fn test_record_search() {
|
|
SEARCH_REQUESTS_TOTAL
|
|
.with_label_values(&["test", "success"])
|
|
.inc();
|
|
|
|
SEARCH_LATENCY_SECONDS
|
|
.with_label_values(&["test"])
|
|
.observe(0.001);
|
|
}
|
|
}
|