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 index bffea52..c00f64b 100644 --- a/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs +++ b/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs @@ -9,6 +9,7 @@ use super::types::{AnalyticUnit, AnalyticUnitConfig, AnomalyConfig, LearningResu use async_trait::async_trait; use subbeat::metric::MetricResult; +use chrono::prelude::*; struct SARIMA { pub ts: Vec, @@ -24,10 +25,10 @@ impl SARIMA { } } - pub fn learn(ts: Vec<(u64, f64)>) { + pub fn learn(&mut self, ts: &Vec<(u64, f64)>) { // TODO: compute avg based on seasonality } - pub fn predict(timestamp: u64, value: f64) -> (f64, f64, f64) { + pub fn predict(&self, timestamp: u64, value: f64) -> (f64, f64, f64) { // TODO: implement return (0.0, 0.0, 0.0); } @@ -112,10 +113,24 @@ impl AnalyticUnit for AnomalyAnalyticUnit { panic!("Bad config!"); } } - async fn learn(&mut self, _ms: MetricService, _ss: SegmentsService) -> LearningResult { + async fn learn(&mut self, ms: MetricService, _ss: SegmentsService) -> LearningResult { - let sarima = SARIMA::new(self.config.seasonality); - // TODO: ensue that learning runs on seasonaliy change + let mut sarima = SARIMA::new(self.config.seasonality); + + let utc: DateTime = Utc::now(); + let to = utc.timestamp() as u64; + let from = to - self.config.seasonality * 3; + + let mr = ms.query(from, to, DETECTION_STEP).await.unwrap(); + if mr.data.keys().len() == 0 { + return LearningResult::FinishedEmpty; + } + + let k = mr.data.keys().nth(0).unwrap(); + let ts = &mr.data[k]; + sarima.learn(ts); + + // TODO: ensure that learning reruns on seasonaliy change // TODO: load data to learning // TODO: update model to work online diff --git a/server/src/services/analytic_service/analytic_unit/pattern_analytic_unit.rs b/server/src/services/analytic_service/analytic_unit/pattern_analytic_unit.rs index 67c14b0..2055f2e 100644 --- a/server/src/services/analytic_service/analytic_unit/pattern_analytic_unit.rs +++ b/server/src/services/analytic_service/analytic_unit/pattern_analytic_unit.rs @@ -51,6 +51,7 @@ impl fmt::Debug for LearningResults { } } +// TODO: maye remove this because metric service works with interpolate_nans_and_gaps_with_zeros fn nan_to_zero(n: f64) -> f64 { if n.is_nan() { return 0.; @@ -429,8 +430,6 @@ impl AnalyticUnit for PatternAnalyticUnit { if to.is_some() { results.push((from.unwrap(), to.unwrap())); - from = None; - to = None; } Ok(results) diff --git a/server/src/services/metric_service.rs b/server/src/services/metric_service.rs index 7a1a476..14a5091 100644 --- a/server/src/services/metric_service.rs +++ b/server/src/services/metric_service.rs @@ -26,6 +26,7 @@ impl MetricService { // TODO: it's a hack, should replace all metrics let key = mr.data.keys().nth(0).unwrap().clone(); let ts = mr.data.get_mut(&key).unwrap(); + // TODO: make interpolate_nans_and_gaps_with_zeros configurable *ts = subbeat::utils::interpolate_nans_and_gaps_with_zeros(&ts, from, to, step); // mr.data.insert(*k, ts_interpolated); }