use candid::{CandidType, Principal};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub enum MetricValue {
Counter(i64),
Gauge(f64),
Histogram { x: f64, y: 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 },
Histogram { 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 HistogramPage {
pub name: String,
pub points: Vec<(f64, f64)>,
pub total: u64,
}
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub enum TransformerOutput {
Scalar(f64),
Series(Vec<(f64, f64)>),
Text(String),
}
#[derive(Clone, Debug, CandidType, Deserialize, Serialize)]
pub struct TransformerInfo {
pub name: String,
pub key: String,
pub script: String,
pub created_at: 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::unbounded_wait(self.backend_canister_id, "record_metric").with_args(&(metric,)).oneway().map_err(|e| e.to_string())?;
Ok(())
}
}