use crate::infra::{CacheStats, GLOBAL_UNIFIED_METRICS};
#[cfg(feature = "metrics")]
pub fn get_enhanced_stats() -> CacheStats {
GLOBAL_UNIFIED_METRICS.snapshot().into()
}
#[cfg(feature = "metrics")]
pub fn export_prometheus_format() -> String {
GLOBAL_UNIFIED_METRICS.export_prometheus()
}
#[cfg(feature = "metrics")]
pub fn export_prometheus_standard() -> String {
GLOBAL_UNIFIED_METRICS.export_prometheus_standard()
}
#[cfg(feature = "metrics")]
pub fn export_json_format() -> Result<String, serde_json::Error> {
GLOBAL_UNIFIED_METRICS.export_json()
}
#[cfg(all(test, feature = "metrics"))]
mod tests {
use super::*;
use crate::infra::convenience;
#[test]
#[serial_test::serial]
fn test_get_enhanced_stats_returns_cache_stats() {
convenience::reset();
let stats = get_enhanced_stats();
assert!(stats.total_operations >= stats.l1_hits + stats.l1_misses);
}
#[test]
#[serial_test::serial]
fn test_export_prometheus_format_returns_valid_output() {
convenience::reset();
let prom = export_prometheus_format();
assert!(prom.contains("# Cache Metrics Snapshot"));
assert!(prom.contains("cache_l1_hits_total"));
assert!(prom.contains("cache_l1_misses_total"));
assert!(prom.contains("cache_l2_hits_total"));
assert!(prom.contains("cache_l2_misses_total"));
assert!(prom.contains("cache_operations_total"));
assert!(prom.contains("cache_errors_total"));
}
#[test]
#[serial_test::serial]
fn test_export_prometheus_standard_is_compliant() {
convenience::reset();
let prom = export_prometheus_standard();
assert!(prom.contains("# HELP oxcache_hits_total "));
assert!(prom.contains("# TYPE oxcache_hits_total counter\n"));
assert!(prom.contains("# HELP oxcache_misses_total "));
assert!(prom.contains("# TYPE oxcache_misses_total counter\n"));
assert!(prom.contains("# HELP oxcache_evictions_total "));
assert!(prom.contains("# TYPE oxcache_evictions_total counter\n"));
assert!(prom.contains("# HELP oxcache_operation_duration_seconds "));
assert!(prom.contains("# TYPE oxcache_operation_duration_seconds histogram\n"));
assert!(prom.contains("oxcache_hits_total{layer=\"l1\"} "));
assert!(prom.contains("oxcache_misses_total{layer=\"l1\"} "));
assert!(prom.contains("oxcache_evictions_total "));
assert!(prom.contains("oxcache_operation_duration_seconds_bucket{le="));
assert!(prom.contains("oxcache_operation_duration_seconds_bucket{le=\"+Inf\"} "));
assert!(prom.contains("oxcache_operation_duration_seconds_sum "));
assert!(prom.contains("oxcache_operation_duration_seconds_count "));
}
#[test]
#[serial_test::serial]
fn test_export_json_format_returns_valid_json() {
convenience::reset();
let json = export_json_format().unwrap();
assert!(json.contains("counters"));
assert!(json.contains("l1_hits"));
assert!(json.contains("l1_misses"));
assert!(json.contains("l2_hits"));
assert!(json.contains("l2_misses"));
assert!(json.contains("total_operations"));
assert!(json.contains("dynamic_metrics"));
}
#[test]
fn test_export_json_format_is_pretty_printed() {
let json = export_json_format().unwrap();
assert!(json.contains("\n"));
assert!(json.contains(" "));
}
}