Browse Source

analytic service begin

pull/25/head
Alexey Velikiy 3 years ago
parent
commit
cce69772cc
  1. 4
      server/Cargo.lock
  2. 2
      server/Cargo.toml
  3. 49
      server/src/analytic_unit.rs
  4. 1
      server/src/main.rs
  5. 1
      server/src/services.rs
  6. 53
      server/src/services/analytic_service.rs
  7. 4
      server/src/services/segments_service.rs

4
server/Cargo.lock generated

@ -1214,9 +1214,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "subbeat"
version = "0.0.5"
version = "0.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8575d807b45953cb0d42ec24574039393a5c41fc97c2750384d3370344632c3"
checksum = "d735937243354d601d8c45f3630db14aeb71a69750fe1c10eb826ac9d9492510"
dependencies = [
"anyhow",
"async-trait",

2
server/Cargo.toml

@ -13,7 +13,7 @@ parking_lot = "0.11.2"
serde = { version = "1.0", features = ["derive"] }
fastrand = "1.5.0"
# subbeat = { path = "../../../subbeat/subbeat/" }
subbeat = "0.0.5"
subbeat = "0.0.6"
config = "0.11.0"
openssl = { version = "=0.10.33", features = ["vendored"] }
rusqlite = "0.26.1"

49
server/src/analytic_unit.rs

@ -1,50 +1,3 @@
use anyhow;
use hastic::services::metric_service::MetricService;
use hastic::services::segments_service::Segment;
use hastic::{config::Config, services::segments_service::SegmentType};
use subbeat::metric::{Metric, MetricResult};
struct AnalyticUnit {
metric_service: MetricService,
}
impl AnalyticUnit {
fn new(config: &Config) -> AnalyticUnit {
AnalyticUnit {
metric_service: MetricService::new(&config.prom_url, &config.query),
}
}
pub async fn get_detections(&self, from: u64, to: u64) -> anyhow::Result<Vec<Segment>> {
let prom = self.metric_service.get_prom();
let mr = prom.query(from, to, 10).await?;
let key = mr.data.keys().nth(0).unwrap();
let ts = &mr.data[key];
let mut result = Vec::<Segment>::new();
let mut from: Option<u64> = None;
for (t, v) in ts {
if *v > 100.0 {
if from.is_some() {
continue;
} else {
from = Some(*t);
}
} else {
if from.is_some() {
result.push(Segment {
id: None,
from: from.unwrap(),
to: *t,
segment_type: SegmentType::Detection,
});
from = None;
}
}
}
Ok(result)
}
// TODO: fields
}

1
server/src/main.rs

@ -1,6 +1,5 @@
use anyhow;
mod analytic_unit;
mod api;
#[tokio::main]

1
server/src/services.rs

@ -1,3 +1,4 @@
pub mod metric_service;
pub mod segments_service;
pub mod user_service;
pub mod analytic_service;

53
server/src/services/analytic_service.rs

@ -0,0 +1,53 @@
use crate::config::Config;
use super::{metric_service::MetricService, segments_service::{Segment, SegmentType}};
use subbeat::metric::Metric;
use anyhow;
struct AnalyticService {
metric_service: MetricService,
}
impl AnalyticService {
fn new(config: &Config) -> AnalyticService {
AnalyticService {
metric_service: MetricService::new(&config.prom_url, &config.query),
}
}
pub async fn get_detections(&self, from: u64, to: u64) -> anyhow::Result<Vec<Segment>> {
let prom = self.metric_service.get_prom();
let mr = prom.query(from, to, 10).await?;
let key = mr.data.keys().nth(0).unwrap();
let ts = &mr.data[key];
let mut result = Vec::<Segment>::new();
let mut from: Option<u64> = None;
for (t, v) in ts {
if *v > 100.0 {
if from.is_some() {
continue;
} else {
from = Some(*t);
}
} else {
if from.is_some() {
result.push(Segment {
id: None,
from: from.unwrap(),
to: *t,
segment_type: SegmentType::Detection,
});
from = None;
}
}
}
Ok(result)
}
}

4
server/src/services/segments_service.rs

@ -91,8 +91,6 @@ impl SegmentsService {
.collect();
// merging
// TODO extract intersected ids
// TODO: merge with other segments
let sgms = self.get_segments_intersected(segment.from, segment.to)?;
let mut min = segment.from;
let mut max = segment.to;
@ -153,7 +151,7 @@ impl SegmentsService {
"DELETE FROM segment where ?1 <= start AND end <= ?2",
params![from, to],
)?;
return Ok(res);
Ok(res)
}
pub fn delete_segments(&self, ids: &Vec<SegmentId>) -> anyhow::Result<usize> {

Loading…
Cancel
Save