From 18a8cdb0ae0d7d067810ebfaf3cff1d90734af6c Mon Sep 17 00:00:00 2001 From: Nitish Tiwari Date: Sat, 1 Apr 2023 13:19:22 +0530 Subject: [PATCH 1/3] Add support for regex based rule in alerts Fixes #305 --- server/src/alerts/rule.rs | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/server/src/alerts/rule.rs b/server/src/alerts/rule.rs index ce37c8e4e..97f3a9d0c 100644 --- a/server/src/alerts/rule.rs +++ b/server/src/alerts/rule.rs @@ -120,6 +120,7 @@ impl ColumnRule { NumericOperator::GreaterThanEquals => "greater than or equal to", NumericOperator::LessThan => "less than", NumericOperator::LessThanEquals => "less than or equal to", + NumericOperator::Regex => "matches regex", }, value, repeats @@ -138,10 +139,11 @@ impl ColumnRule { "{} column {} {}, {} times", column, match operator { - StringOperator::Exact => "was equal to", - StringOperator::NotExact => "was not equal to", - StringOperator::Contains => "contained", - StringOperator::NotContains => "did not contain", + StringOperator::Exact => "equal to", + StringOperator::NotExact => "not equal to", + StringOperator::Contains => "contains", + StringOperator::NotContains => "does not contain", + StringOperator::Regex => "matches regex", }, value, repeats @@ -293,7 +295,7 @@ mod tests { pub mod base { use serde::{Deserialize, Serialize}; - + use regex::Regex; use self::ops::{NumericOperator, StringOperator}; #[derive(Debug, Serialize, Deserialize)] @@ -328,6 +330,10 @@ pub mod base { NumericOperator::LessThanEquals => { number.as_f64().unwrap() <= self.value.as_f64().unwrap() } + NumericOperator::Regex => { + let re: Regex = regex::Regex::new(&self.value.to_string()).unwrap(); + re.is_match(&number.to_string()) + } }; Some(res) @@ -361,6 +367,10 @@ pub mod base { StringOperator::NotContains => !string .to_ascii_lowercase() .contains(&self.value.to_ascii_lowercase()), + StringOperator::Regex => { + let re: Regex = regex::Regex::new(&self.value).unwrap(); + re.is_match(&string) + } } } else { match self.operator { @@ -368,6 +378,10 @@ pub mod base { StringOperator::NotExact => !string.eq(&self.value), StringOperator::Contains => string.contains(&self.value), StringOperator::NotContains => !string.contains(&self.value), + StringOperator::Regex => { + let re: Regex = regex::Regex::new(&self.value).unwrap(); + re.is_match(&string) + } } }; @@ -393,6 +407,8 @@ pub mod base { LessThan, #[serde(alias = "<=")] LessThanEquals, + #[serde(alias = "~")] + Regex, } impl Default for NumericOperator { @@ -412,7 +428,8 @@ pub mod base { Contains, #[serde(alias = "!%")] NotContains, - // =~ and !~ reserved for regex + #[serde(alias = "~")] + Regex, } impl Default for StringOperator { From c4160d3d91bf079532cc1e770c871b00c7d6c56f Mon Sep 17 00:00:00 2001 From: Nitish Tiwari Date: Sat, 1 Apr 2023 13:21:32 +0530 Subject: [PATCH 2/3] Fmt fix --- server/src/alerts/rule.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/alerts/rule.rs b/server/src/alerts/rule.rs index 97f3a9d0c..525908889 100644 --- a/server/src/alerts/rule.rs +++ b/server/src/alerts/rule.rs @@ -294,9 +294,9 @@ mod tests { } pub mod base { - use serde::{Deserialize, Serialize}; - use regex::Regex; use self::ops::{NumericOperator, StringOperator}; + use regex::Regex; + use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] From 06af335b77ad1bcacc61121c027c0e9df0570b5c Mon Sep 17 00:00:00 2001 From: Nitish Tiwari Date: Sat, 1 Apr 2023 13:22:51 +0530 Subject: [PATCH 3/3] clippy fix --- server/src/alerts/rule.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/alerts/rule.rs b/server/src/alerts/rule.rs index 525908889..2eb5722a0 100644 --- a/server/src/alerts/rule.rs +++ b/server/src/alerts/rule.rs @@ -369,7 +369,7 @@ pub mod base { .contains(&self.value.to_ascii_lowercase()), StringOperator::Regex => { let re: Regex = regex::Regex::new(&self.value).unwrap(); - re.is_match(&string) + re.is_match(string) } } } else { @@ -380,7 +380,7 @@ pub mod base { StringOperator::NotContains => !string.contains(&self.value), StringOperator::Regex => { let re: Regex = regex::Regex::new(&self.value).unwrap(); - re.is_match(&string) + re.is_match(string) } } };