use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use tokio::sync::Mutex;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TelemetryMetrics {
pub tool_invocations: u64,
pub successful_operations: u64,
pub failed_operations: u64,
pub total_tokens: u64,
pub avg_latency_ms: f64,
}
#[derive(Debug)]
pub struct Telemetry {
metrics: Mutex<TelemetryMetrics>,
pub metadata: HashMap<String, String>,
}
impl Telemetry {
pub fn new() -> Self {
Self {
metrics: Mutex::new(TelemetryMetrics::default()),
metadata: HashMap::new(),
}
}
pub async fn record_tool_invocation(&self, success: bool, latency_ms: u64, tokens: u64) {
let mut metrics = self.metrics.lock().await;
metrics.tool_invocations += 1;
if success {
metrics.successful_operations += 1;
} else {
metrics.failed_operations += 1;
}
metrics.total_tokens += tokens;
let n = metrics.tool_invocations as f64;
metrics.avg_latency_ms = metrics.avg_latency_ms * (n - 1.0) / n + latency_ms as f64 / n;
}
pub async fn get_metrics(&self) -> TelemetryMetrics {
self.metrics.lock().await.clone()
}
pub async fn start_swarm(&self, _task_id: &str, _agent_count: usize) {}
pub async fn record_swarm_progress(&self, _task_id: &str, _completed: usize, _total: usize) {}
pub async fn complete_swarm(&self, _success: bool) -> TelemetryMetrics {
self.metrics.lock().await.clone()
}
}
impl Default for Telemetry {
fn default() -> Self {
Self::new()
}
}