use serde::Serialize;
#[derive(Serialize)]
struct MetricsExport {
queries_total: u64,
errors_total: u64,
retries_total: u64,
connections: u64,
latency_ms: LatencyStats,
rate_qps: RateStats,
}
#[derive(Serialize)]
struct LatencyStats {
min: u64,
max: u64,
mean: u64,
p50: u64,
p95: u64,
p99: u64,
p999: u64,
}
#[derive(Serialize)]
struct RateStats {
mean: f64,
one_minute: f64,
five_minutes: f64,
fifteen_minutes: f64,
}
fn export_json(metrics: &Metrics) -> Result<String, Box<dyn std::error::Error>> {
let snapshot = metrics.get_snapshot()?;
let export = MetricsExport {
queries_total: metrics.get_queries_num(),
errors_total: metrics.get_errors_num(),
retries_total: metrics.get_retries_num(),
connections: metrics.get_total_connections(),
latency_ms: LatencyStats {
min: snapshot.min,
max: snapshot.max,
mean: snapshot.mean,
p50: snapshot.median,
p95: snapshot.percentile_95,
p99: snapshot.percentile_99,
p999: snapshot.percentile_99_9,
},
rate_qps: RateStats {
mean: metrics.get_mean_rate(),
one_minute: metrics.get_one_minute_rate(),
five_minutes: metrics.get_five_minute_rate(),
fifteen_minutes: metrics.get_fifteen_minute_rate(),
},
};
Ok(serde_json::to_string_pretty(&export)?)
}