use candid::{CandidType, Principal};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub enum MetricValue {
Counter(i64),
Gauge(f64),
TimeSeries(f64),
Log(String),
}
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub struct Metric {
pub name: String,
pub key: String,
pub value: MetricValue,
}
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub enum StoredMetric {
Counter { name: String, value: i64 },
Gauge { name: String, value: f64 },
TimeSeries { name: String, total: u64 },
Log { name: String, total: u64 },
}
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub struct LogPage {
pub name: String,
pub entries: Vec<(u64, String)>,
pub total: u64,
pub offset: u64,
}
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub struct TimeSeriesPage {
pub name: String,
pub points: Vec<(u64, f64)>,
pub total: u64,
}
#[derive(Clone, Debug)]
pub struct AnalyticsClient {
pub backend_canister_id: Principal,
}
impl AnalyticsClient {
pub fn new(backend_canister_id: Principal) -> Self {
Self {
backend_canister_id,
}
}
pub fn record_metric(&self, metric: Metric) -> Result<(), String> {
ic_cdk::call::Call::bounded_wait(self.backend_canister_id, "record_metric").with_args(&(metric,)).oneway().map_err(|e| e.to_string())?;
Ok(())
}
}