Browse Source

alerting continue

pull/25/head
Alexey Velikiy 3 years ago
parent
commit
c7993cbae2
  1. 6
      server/config.example.toml
  2. 53
      server/src/config.rs
  3. 2
      server/src/main.rs
  4. 3
      server/src/services/analytic_service/analytic_service.rs

6
server/config.example.toml

@ -16,6 +16,8 @@ query = "rate(go_memstats_alloc_bytes_total[5m])"
# |> yield(name: "mean") # |> yield(name: "mean")
# """ # """
[webhook] [alerting]
endpoint = "http://localhost:8086" type = "webhook"
interval = 10 # in seconds
endpoint = "http://localhost:9092"

53
server/src/config.rs

@ -1,20 +1,39 @@
use subbeat::types::{DatasourceConfig, InfluxConfig, PrometheusConfig}; use subbeat::types::{DatasourceConfig, InfluxConfig, PrometheusConfig};
#[derive(Clone)]
pub struct WebhookAlertingConfig {
endpoint: String
}
#[derive(Clone)]
pub enum AlertingType {
Webhook(WebhookAlertingConfig)
}
#[derive(Clone)]
pub struct AlertingConfig {
alerting_type: AlertingType,
interval: u64 // interval in seconds
}
#[derive(Clone)]
pub struct Config { pub struct Config {
pub port: u16, pub port: u16,
pub datasource_config: DatasourceConfig, pub datasource_config: DatasourceConfig,
pub endpoint: Option<String>, pub alerting: Option<AlertingConfig>,
} }
impl Clone for Config { // impl Clone for Config {
fn clone(&self) -> Self { // fn clone(&self) -> Self {
return Config { // return Config {
port: self.port, // port: self.port,
datasource_config: self.datasource_config.clone(), // datasource_config: self.datasource_config.clone(),
endpoint: self.endpoint.clone(), // alerting: self.alerting.clone()
}; // };
} // }
} // }
fn resolve_datasource(config: &mut config::Config) -> anyhow::Result<DatasourceConfig> { fn resolve_datasource(config: &mut config::Config) -> anyhow::Result<DatasourceConfig> {
if config.get::<String>("prometheus.url").is_ok() { if config.get::<String>("prometheus.url").is_ok() {
@ -39,6 +58,10 @@ fn resolve_datasource(config: &mut config::Config) -> anyhow::Result<DatasourceC
// TODO: use actual config and env variables // TODO: use actual config and env variables
impl Config { impl Config {
pub fn new() -> anyhow::Result<Config> { pub fn new() -> anyhow::Result<Config> {
// TODO: parse alerting config
// TODO: throw error on bad config
let mut config = config::Config::default(); let mut config = config::Config::default();
if std::path::Path::new("config.toml").exists() { if std::path::Path::new("config.toml").exists() {
@ -52,15 +75,15 @@ impl Config {
config.set("port", "8000").unwrap(); config.set("port", "8000").unwrap();
} }
let mut endpoint = None; // let mut endpoint = None;
if config.get::<String>("webhook.endpoint").is_ok() { // if config.get::<String>("webhook.endpoint").is_ok() {
endpoint = Some(config.get("webhook.endpoint").unwrap()); // endpoint = Some(config.get("webhook.endpoint").unwrap());
} // }
Ok(Config { Ok(Config {
port: config.get::<u16>("port").unwrap(), port: config.get::<u16>("port").unwrap(),
datasource_config: resolve_datasource(&mut config)?, datasource_config: resolve_datasource(&mut config)?,
endpoint, alerting: None,
}) })
} }
} }

2
server/src/main.rs

@ -15,7 +15,7 @@ async fn main() -> anyhow::Result<()> {
let mut analytic_service = analytic_service::AnalyticService::new( let mut analytic_service = analytic_service::AnalyticService::new(
metric_service.clone(), metric_service.clone(),
segments_service.clone(), segments_service.clone(),
config.endpoint, config.alerting
); );
let api = api::API::new( let api = api::API::new(

3
server/src/services/analytic_service/analytic_service.rs

@ -8,6 +8,7 @@ use super::{
types::{AnalyticServiceMessage, DetectionTask, LearningStatus, RequestType, ResponseType}, types::{AnalyticServiceMessage, DetectionTask, LearningStatus, RequestType, ResponseType},
}; };
use crate::config::AlertingConfig;
use crate::services::analytic_service::analytic_unit::resolve; use crate::services::analytic_service::analytic_unit::resolve;
use crate::services::{ use crate::services::{
metric_service::MetricService, metric_service::MetricService,
@ -48,7 +49,7 @@ impl AnalyticService {
pub fn new( pub fn new(
metric_service: MetricService, metric_service: MetricService,
segments_service: segments_service::SegmentsService, segments_service: segments_service::SegmentsService,
endpoint: Option<String>, alerting: Option<AlertingConfig>,
) -> AnalyticService { ) -> AnalyticService {
let (tx, rx) = mpsc::channel::<AnalyticServiceMessage>(32); let (tx, rx) = mpsc::channel::<AnalyticServiceMessage>(32);

Loading…
Cancel
Save