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 {
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)) {
[from, to] = this.state?.xValueRange;
@ -163,4 +163,4 @@ export class AnomalyPod extends HasticPod<UpdateDataCallback> {
.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 {
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)) {
[from, to] = this.state?.xValueRange;
@ -184,4 +184,4 @@ export class PatternPod extends HasticPod<UpdateDataCallback> {
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 {
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)) {
[from, to] = this.state?.xValueRange;
@ -41,4 +41,4 @@ export class ThresholdPod extends HasticPod<UpdateDataCallback> {
.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> {
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
let mut res_ts = Vec::<(u64, f64)>::new();
let from = ts[0].0;
// TODO: unwrap -> ?
let to = ts.last().unwrap().0;
let iter_steps = (self.seasonality / DETECTION_STEP) as usize;
if to - from != self.seasonality_iterations * self.seasonality {
return Err(anyhow::format_err!(
"timeserie to learn from should be {} * sasonality",
self.seasonality_iterations
));
}
for k in 0..iter_steps {
let mut vts = Vec::new();
for si in 0..self.seasonality_iterations {
vts.push(ts[k + iter_steps * si as usize].1);
}
let mut vt: f64 = vts.iter().sum();
vt /= self.seasonality_iterations as f64;
let t = ts[ts.len() - iter_steps + k].0;
res_ts.push((t, vt));
}
self.ts = res_ts;
// let mut res_ts = Vec::<(u64, f64)>::new();
// let from = ts[0].0;
// // TODO: unwrap -> ?
// let to = ts.last().unwrap().0;
// let iter_steps = 5 as usize;
// if to - from != self.seasonality_iterations * self.seasonality {
// return Err(anyhow::format_err!(
// "timeserie to learn from should be {} * seasonality",
// self.seasonality_iterations
// ));
// }
// for k in 0..iter_steps {
// let mut vts = Vec::new();
// for si in 0..self.seasonality_iterations {
// vts.push(ts[k + iter_steps * si as usize].1);
// }
// let mut vt: f64 = vts.iter().sum();
// vt /= self.seasonality_iterations as f64;
// let t = ts[ts.len() - iter_steps + k].0;
// res_ts.push((t, vt));
// }
self.ts = ts.to_vec();
return Ok(());
}
@ -194,7 +194,7 @@ impl AnalyticUnit for AnomalyAnalyticUnit {
let utc: DateTime<Utc> = Utc::now();
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?;
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 keys: Vec<_> = mr.data.keys().into_iter().collect();
if mr.data.keys().len() > 0 {
// 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);
}
// if mr.data.keys().len() > 0 {
// // 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);
// }
return Ok(mr);
}

Loading…
Cancel
Save