diff --git a/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs b/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs new file mode 100644 index 0000000..5baba0f --- /dev/null +++ b/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs @@ -0,0 +1,47 @@ +use crate::services::{ + analytic_service::types, metric_service::MetricService, segments_service::SegmentsService, +}; + +use super::types::{AnalyticUnit, 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 { + 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]; + + // TODO: implement + // TODO: decide what to do it from is Some() in the end + + Ok(Default::default()) + } +} diff --git a/server/src/services/analytic_service/analytic_unit/mod.rs b/server/src/services/analytic_service/analytic_unit/mod.rs index 56f7e98..5ab7d2e 100644 --- a/server/src/services/analytic_service/analytic_unit/mod.rs +++ b/server/src/services/analytic_service/analytic_unit/mod.rs @@ -1,5 +1,6 @@ pub mod pattern_analytic_unit; pub mod threshold_analytic_unit; +pub mod anomaly_analytic_unit; pub mod types; use self::{ diff --git a/server/src/services/analytic_service/analytic_unit/types.rs b/server/src/services/analytic_service/analytic_unit/types.rs index 0470212..beeb7c0 100644 --- a/server/src/services/analytic_service/analytic_unit/types.rs +++ b/server/src/services/analytic_service/analytic_unit/types.rs @@ -12,6 +12,11 @@ pub struct PatternConfig { pub model_score: f32, } +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct AnomalyConfig { + pub sesonality: bool, +} + #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ThresholdConfig { pub threashold: f64,