#![allow(deprecated)]
use crate::cli::MetricsArgs;
use crate::manager::{get_typed_client, MANAGER};
use crate::metrics::get_metrics_string;
use anyhow::Result;
use dashmap::DashMap;
use std::sync::Arc;
pub async fn execute(args: &MetricsArgs) -> Result<()> {
if args.prometheus {
let output = get_metrics_string();
println!("{}", output);
return Ok(());
}
if args.json {
let output = get_metrics_string();
println!("{}", output);
return Ok(());
}
println!("=== Cache Metrics ===\n");
let metrics = &crate::metrics::GLOBAL_METRICS;
if let Some(ref service_name) = args.service {
let client = get_typed_client(service_name)?;
let _ = client;
println!("Service: {}", service_name);
let mut total_requests = 0;
let mut hits = 0;
let requests = &*metrics.requests_total;
for entry in requests.iter() {
let key = entry.key();
let count = entry.value();
if key.starts_with(service_name) {
total_requests += *count;
if key.ends_with(":hit") {
hits += count;
}
}
}
println!("\nRequests:");
println!(" Total: {}", total_requests);
if total_requests > 0 {
let hit_rate = (hits as f64 / total_requests as f64 * 100.0).round();
println!(" Hits: {} ({:.1}%)", hits, hit_rate);
println!(" Misses: {}", total_requests - hits);
}
if let Some(status) = metrics.l2_health_status.get(service_name) {
let status_str = match *status {
0 => "Degraded",
1 => "Healthy",
2 => "Recovering",
_ => "Unknown",
};
println!("\nHealth: {}", status_str);
}
if let Some(wal_count) = metrics.wal_entries.get(service_name) {
println!("\nWAL Entries: {}", *wal_count);
}
if let Some(batch_size) = metrics.batch_buffer_size.get(service_name) {
println!("Batch Buffer: {}", *batch_size);
}
} else {
println!("All Services:\n");
let manager: &DashMap<String, Arc<dyn crate::CacheOps>> = &MANAGER;
for entry in manager.iter() {
let service_name: &String = entry.key();
let mut total_requests = 0;
let mut hits = 0;
let requests: &DashMap<String, u64> = &metrics.requests_total;
for metric_entry in requests.iter() {
let key: &String = metric_entry.key();
let count: &u64 = metric_entry.value();
if key.starts_with(service_name) {
total_requests += count;
if key.ends_with(":hit") {
hits += count;
}
}
}
print!(" {}: {} reqs", service_name, total_requests);
if total_requests > 0 {
let hit_rate = (hits as f64 / total_requests as f64 * 100.0).round();
print!(", {:.1}% hit rate", hit_rate);
}
println!();
}
}
Ok(())
}