use crate::services::{analytic_service::types::{self, HSR}, metric_service::MetricService, segments_service::SegmentsService}; use super::types::{AnalyticUnit, AnalyticUnitConfig, AnomalyConfig, LearningResult}; use async_trait::async_trait; // TODO: move to config const DETECTION_STEP: u64 = 10; pub struct AnomalyAnalyticUnit { config: AnomalyConfig, } impl AnomalyAnalyticUnit { pub fn new(config: AnomalyConfig) -> AnomalyAnalyticUnit { AnomalyAnalyticUnit { config } } } #[async_trait] impl AnalyticUnit for AnomalyAnalyticUnit { fn set_config(&mut self, config: AnalyticUnitConfig) { if let AnalyticUnitConfig::Anomaly(cfg) = config { self.config = cfg; } else { panic!("Bad config!"); } } async fn learn(&mut self, _ms: MetricService, _ss: SegmentsService) -> LearningResult { return LearningResult::Finished; } async fn detect( &self, ms: MetricService, from: u64, to: u64, ) -> anyhow::Result> { let mr = ms.query(from, to, DETECTION_STEP).await.unwrap(); if mr.data.keys().len() == 0 { return Ok(Vec::new()); } let k = mr.data.keys().nth(0).unwrap(); let ts = &mr.data[k]; if ts.len() == 0 { return Ok(Vec::new()); } let ct = ts[0]; // TODO: implement // TODO: decide what to do it from is Some() in the end Ok(Default::default()) } // TODO: use hsr for learning and detections async fn get_hsr( &self, ms: MetricService, from: u64, to: u64, ) -> anyhow::Result { let mr = ms.query(from, to, DETECTION_STEP).await.unwrap(); if mr.data.keys().len() == 0 { return Ok(HSR::TimeSerie(Vec::new())); } let k = mr.data.keys().nth(0).unwrap(); let ts = mr.data[k].clone(); Ok(HSR::TimeSerie(ts)) } }