Browse Source

init

improve-anomaly-detector
rozetko 2 years ago
parent
commit
cc17e75214
  1. 4
      client/src/components/pods/anomaly_pod.ts
  2. 4
      client/src/components/pods/pattern_pod.ts
  3. 4
      client/src/components/pods/threshold_pod.ts
  4. 2
      client/src/services/analytics.service.ts
  5. 52
      server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs
  6. 16
      server/src/services/metric_service.rs

4
client/src/components/pods/anomaly_pod.ts

@ -94,7 +94,7 @@ export class AnomalyPod extends HasticPod<UpdateDataCallback> {
public fetchData(): void { public fetchData(): void {
let to = Math.floor(Date.now() / 1000); let to = Math.floor(Date.now() / 1000);
let from = to - 50000; // -50000 seconds let from = to - 2592000; // -100000 seconds
if(!(this.state.xValueRange[0] == 0 && this.state.xValueRange[1] == 1)) { if(!(this.state.xValueRange[0] == 0 && this.state.xValueRange[1] == 1)) {
[from, to] = this.state?.xValueRange; [from, to] = this.state?.xValueRange;
@ -163,4 +163,4 @@ export class AnomalyPod extends HasticPod<UpdateDataCallback> {
.attr('opacity', head ? 0.5 : 0.3) .attr('opacity', head ? 0.5 : 0.3)
} }
} }

4
client/src/components/pods/pattern_pod.ts

@ -71,7 +71,7 @@ export class PatternPod extends HasticPod<UpdateDataCallback> {
public fetchData(): void { public fetchData(): void {
let to = Math.floor(Date.now() / 1000); let to = Math.floor(Date.now() / 1000);
let from = to - 50000; // -50000 seconds let from = to - 2592000; // -100000 seconds
if(!(this.state.xValueRange[0] == 0 && this.state.xValueRange[1] == 1)) { if(!(this.state.xValueRange[0] == 0 && this.state.xValueRange[1] == 1)) {
[from, to] = this.state?.xValueRange; [from, to] = this.state?.xValueRange;
@ -184,4 +184,4 @@ export class PatternPod extends HasticPod<UpdateDataCallback> {
return this._tempIdCounted.toString(); return this._tempIdCounted.toString();
} }
} }

4
client/src/components/pods/threshold_pod.ts

@ -27,7 +27,7 @@ export class ThresholdPod extends HasticPod<UpdateDataCallback> {
public fetchData(): void { public fetchData(): void {
let to = Math.floor(Date.now() / 1000); let to = Math.floor(Date.now() / 1000);
let from = to - 50000; // -50000 seconds let from = to - 2592000; // -100000 seconds
if(!(this.state.xValueRange[0] == 0 && this.state.xValueRange[1] == 1)) { if(!(this.state.xValueRange[0] == 0 && this.state.xValueRange[1] == 1)) {
[from, to] = this.state?.xValueRange; [from, to] = this.state?.xValueRange;
@ -41,4 +41,4 @@ export class ThresholdPod extends HasticPod<UpdateDataCallback> {
.catch(() => { /* set "error" message */ }) .catch(() => { /* set "error" message */ })
} }
} }

2
client/src/services/analytics.service.ts

@ -68,7 +68,7 @@ export async function patchConfig(patchObj: any) {
} }
export function getStatusGenerator(): AsyncIterableIterator<AnalyticStatus> { export function getStatusGenerator(): AsyncIterableIterator<AnalyticStatus> {
return getGenerator<AnalyticStatus>(100, getStatus); return getGenerator<AnalyticStatus>(10000, getStatus);
} }

52
server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs

@ -56,31 +56,31 @@ impl SARIMA {
)); ));
} }
// TODO: ensure capacity with seasonality size // TODO: ensure capacity with seasonality size
let mut res_ts = Vec::<(u64, f64)>::new(); // let mut res_ts = Vec::<(u64, f64)>::new();
let from = ts[0].0; // let from = ts[0].0;
// TODO: unwrap -> ? // // TODO: unwrap -> ?
let to = ts.last().unwrap().0; // let to = ts.last().unwrap().0;
let iter_steps = (self.seasonality / DETECTION_STEP) as usize; // let iter_steps = 5 as usize;
if to - from != self.seasonality_iterations * self.seasonality { // if to - from != self.seasonality_iterations * self.seasonality {
return Err(anyhow::format_err!( // return Err(anyhow::format_err!(
"timeserie to learn from should be {} * sasonality", // "timeserie to learn from should be {} * seasonality",
self.seasonality_iterations // self.seasonality_iterations
)); // ));
} // }
for k in 0..iter_steps { // for k in 0..iter_steps {
let mut vts = Vec::new(); // let mut vts = Vec::new();
for si in 0..self.seasonality_iterations { // for si in 0..self.seasonality_iterations {
vts.push(ts[k + iter_steps * si as usize].1); // vts.push(ts[k + iter_steps * si as usize].1);
} // }
let mut vt: f64 = vts.iter().sum(); // let mut vt: f64 = vts.iter().sum();
vt /= self.seasonality_iterations as f64; // vt /= self.seasonality_iterations as f64;
let t = ts[ts.len() - iter_steps + k].0; // let t = ts[ts.len() - iter_steps + k].0;
res_ts.push((t, vt)); // res_ts.push((t, vt));
} // }
self.ts = res_ts; self.ts = ts.to_vec();
return Ok(()); return Ok(());
} }
@ -194,7 +194,7 @@ impl AnalyticUnit for AnomalyAnalyticUnit {
let utc: DateTime<Utc> = Utc::now(); let utc: DateTime<Utc> = Utc::now();
let to = utc.timestamp() as u64; let to = utc.timestamp() as u64;
let from = to - self.config.seasonality * self.config.seasonality_iterations; let from = to - 86400;
let mr = ms.query(from, to, DETECTION_STEP).await?; let mr = ms.query(from, to, DETECTION_STEP).await?;
if mr.data.keys().len() == 0 { if mr.data.keys().len() == 0 {

16
server/src/services/metric_service.rs

@ -22,14 +22,14 @@ impl MetricService {
let mut mr = self.datasource.query(from, to, step).await?; let mut mr = self.datasource.query(from, to, step).await?;
// let keys: Vec<_> = mr.data.keys().into_iter().collect(); // let keys: Vec<_> = mr.data.keys().into_iter().collect();
if mr.data.keys().len() > 0 { // if mr.data.keys().len() > 0 {
// TODO: it's a hack, should replace all metrics // // TODO: it's a hack, should replace all metrics
let key = mr.data.keys().nth(0).unwrap().clone(); // let key = mr.data.keys().nth(0).unwrap().clone();
let ts = mr.data.get_mut(&key).unwrap(); // let ts = mr.data.get_mut(&key).unwrap();
// TODO: make interpolate_nans_and_gaps_with_zeros configurable // // TODO: make interpolate_nans_and_gaps_with_zeros configurable
*ts = subbeat::utils::interpolate_nans_and_gaps_with_zeros(&ts, from, to, step); // *ts = subbeat::utils::interpolate_nans_and_gaps_with_zeros(&ts, from, to, step);
// mr.data.insert(*k, ts_interpolated); // // mr.data.insert(*k, ts_interpolated);
} // }
return Ok(mr); return Ok(mr);
} }

Loading…
Cancel
Save