@@ -25,7 +25,8 @@ defmodule SentinelCp.Analytics.WafAnomalyDetector do
2525 anomalies =
2626 Enum . flat_map ( observations , fn { metric_type , observed } ->
2727 case Map . get ( baselines , metric_type ) do
28- % { mean: mean , stddev: stddev } when is_number ( mean ) and is_number ( stddev ) and stddev > 0 ->
28+ % { mean: mean , stddev: stddev }
29+ when is_number ( mean ) and is_number ( stddev ) and stddev > 0 ->
2930 detect_spike ( metric_type , observed , mean , stddev , sigma_threshold )
3031
3132 _ ->
@@ -39,7 +40,13 @@ defmodule SentinelCp.Analytics.WafAnomalyDetector do
3940 @ doc """
4041 Detects spike anomalies where the observed value exceeds mean + threshold * stddev.
4142 """
42- def detect_spike ( metric_type , observed , mean , stddev , sigma_threshold \\ @ default_sigma_threshold ) do
43+ def detect_spike (
44+ metric_type ,
45+ observed ,
46+ mean ,
47+ stddev ,
48+ sigma_threshold \\ @ default_sigma_threshold
49+ ) do
4350 deviation = ( observed - mean ) / stddev
4451
4552 if deviation > sigma_threshold do
@@ -49,7 +56,8 @@ defmodule SentinelCp.Analytics.WafAnomalyDetector do
4956 % {
5057 anomaly_type: "spike" ,
5158 severity: severity ,
52- description: "#{ metric_type } spike: #{ Float . round ( observed * 1.0 , 1 ) } observed vs #{ Float . round ( mean , 1 ) } expected (#{ Float . round ( deviation , 1 ) } sigma)" ,
59+ description:
60+ "#{ metric_type } spike: #{ Float . round ( observed * 1.0 , 1 ) } observed vs #{ Float . round ( mean , 1 ) } expected (#{ Float . round ( deviation , 1 ) } sigma)" ,
5361 observed_value: observed * 1.0 ,
5462 expected_mean: mean ,
5563 expected_stddev: stddev ,
@@ -85,7 +93,12 @@ defmodule SentinelCp.Analytics.WafAnomalyDetector do
8593 @ doc """
8694 Detects IP burst anomalies (unusual number of unique attacking IPs).
8795 """
88- def detect_ip_burst ( unique_ips , baseline_mean , baseline_stddev , sigma_threshold \\ @ default_sigma_threshold ) do
96+ def detect_ip_burst (
97+ unique_ips ,
98+ baseline_mean ,
99+ baseline_stddev ,
100+ sigma_threshold \\ @ default_sigma_threshold
101+ ) do
89102 if baseline_stddev > 0 do
90103 detect_spike ( "unique_ips" , unique_ips , baseline_mean , baseline_stddev , sigma_threshold )
91104 |> Enum . map ( & Map . put ( & 1 , :anomaly_type , "ip_burst" ) )
@@ -97,7 +110,12 @@ defmodule SentinelCp.Analytics.WafAnomalyDetector do
97110 @ doc """
98111 Detects rate change anomalies (sudden increase in block rate).
99112 """
100- def detect_rate_change ( current_rate , baseline_mean , baseline_stddev , sigma_threshold \\ @ default_sigma_threshold ) do
113+ def detect_rate_change (
114+ current_rate ,
115+ baseline_mean ,
116+ baseline_stddev ,
117+ sigma_threshold \\ @ default_sigma_threshold
118+ ) do
101119 if baseline_stddev > 0 do
102120 detect_spike ( "block_rate" , current_rate , baseline_mean , baseline_stddev , sigma_threshold )
103121 |> Enum . map ( & Map . put ( & 1 , :anomaly_type , "rate_change" ) )
0 commit comments