mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-14 11:35:54 +08:00
fix: use better value for threshold value in alert description (#5844)
This commit is contained in:
parent
3544ffdcc6
commit
6019b38da5
@ -591,6 +591,16 @@ func (r *PromRule) shouldAlert(series pql.Series) (pql.Sample, bool) {
|
||||
break
|
||||
}
|
||||
}
|
||||
// use min value from the series
|
||||
if shouldAlert {
|
||||
var minValue float64 = math.Inf(1)
|
||||
for _, smpl := range series.Floats {
|
||||
if smpl.F < minValue {
|
||||
minValue = smpl.F
|
||||
}
|
||||
}
|
||||
alertSmpl = pql.Sample{F: minValue, Metric: series.Metric}
|
||||
}
|
||||
} else if r.compareOp() == ValueIsBelow {
|
||||
for _, smpl := range series.Floats {
|
||||
if smpl.F >= r.targetVal() {
|
||||
@ -598,6 +608,15 @@ func (r *PromRule) shouldAlert(series pql.Series) (pql.Sample, bool) {
|
||||
break
|
||||
}
|
||||
}
|
||||
if shouldAlert {
|
||||
var maxValue float64 = math.Inf(-1)
|
||||
for _, smpl := range series.Floats {
|
||||
if smpl.F > maxValue {
|
||||
maxValue = smpl.F
|
||||
}
|
||||
}
|
||||
alertSmpl = pql.Sample{F: maxValue, Metric: series.Metric}
|
||||
}
|
||||
} else if r.compareOp() == ValueIsEq {
|
||||
for _, smpl := range series.Floats {
|
||||
if smpl.F != r.targetVal() {
|
||||
@ -612,6 +631,14 @@ func (r *PromRule) shouldAlert(series pql.Series) (pql.Sample, bool) {
|
||||
break
|
||||
}
|
||||
}
|
||||
if shouldAlert {
|
||||
for _, smpl := range series.Floats {
|
||||
if !math.IsInf(smpl.F, 0) && !math.IsNaN(smpl.F) {
|
||||
alertSmpl = pql.Sample{F: smpl.F, Metric: series.Metric}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case OnAverage:
|
||||
// If the average of all samples matches the condition, the rule is firing.
|
||||
|
@ -35,6 +35,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp string
|
||||
matchType string
|
||||
target float64
|
||||
expectedAlertSample v3.Point
|
||||
}{
|
||||
// Test cases for Equals Always
|
||||
{
|
||||
@ -51,6 +52,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "2", // Always
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -112,6 +114,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -127,6 +130,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -142,6 +146,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -173,6 +178,39 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "2", // Always
|
||||
target: 1.5,
|
||||
expectedAlertSample: v3.Point{Value: 2.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
Floats: []pql.FPoint{
|
||||
{F: 11.0},
|
||||
{F: 4.0},
|
||||
{F: 3.0},
|
||||
{F: 7.0},
|
||||
{F: 12.0},
|
||||
},
|
||||
},
|
||||
expectAlert: true,
|
||||
compareOp: "1", // Above
|
||||
matchType: "2", // Always
|
||||
target: 2.0,
|
||||
expectedAlertSample: v3.Point{Value: 3.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
Floats: []pql.FPoint{
|
||||
{F: 11.0},
|
||||
{F: 4.0},
|
||||
{F: 3.0},
|
||||
{F: 7.0},
|
||||
{F: 12.0},
|
||||
},
|
||||
},
|
||||
expectAlert: true,
|
||||
compareOp: "2", // Below
|
||||
matchType: "2", // Always
|
||||
target: 13.0,
|
||||
expectedAlertSample: v3.Point{Value: 12.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -204,6 +242,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "1", // Once
|
||||
target: 4.5,
|
||||
expectedAlertSample: v3.Point{Value: 10.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -265,6 +304,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "2", // Always
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -296,6 +336,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -326,6 +367,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -341,6 +383,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
// Test cases for Less Than Always
|
||||
{
|
||||
@ -357,6 +400,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "2", // Always
|
||||
target: 4,
|
||||
expectedAlertSample: v3.Point{Value: 1.5},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -388,6 +432,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "1", // Once
|
||||
target: 4,
|
||||
expectedAlertSample: v3.Point{Value: 2.5},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -419,6 +464,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "3", // OnAverage
|
||||
target: 6.0,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -449,6 +495,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "3", // OnAverage
|
||||
target: 4.5,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -479,6 +526,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "3", // OnAverage
|
||||
target: 4.5,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -494,6 +542,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "3", // OnAverage
|
||||
target: 12.0,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
// Test cases for InTotal
|
||||
{
|
||||
@ -510,6 +559,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "4", // InTotal
|
||||
target: 30.0,
|
||||
expectedAlertSample: v3.Point{Value: 30.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -536,6 +586,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "4", // InTotal
|
||||
target: 9.0,
|
||||
expectedAlertSample: v3.Point{Value: 10.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -559,6 +610,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "4", // InTotal
|
||||
target: 10.0,
|
||||
expectedAlertSample: v3.Point{Value: 20.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
@ -583,6 +635,7 @@ func TestPromRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "4", // InTotal
|
||||
target: 30.0,
|
||||
expectedAlertSample: v3.Point{Value: 20.0},
|
||||
},
|
||||
{
|
||||
values: pql.Series{
|
||||
|
@ -1205,6 +1205,16 @@ func (r *ThresholdRule) shouldAlert(series v3.Series) (Sample, bool) {
|
||||
break
|
||||
}
|
||||
}
|
||||
// use min value from the series
|
||||
if shouldAlert {
|
||||
var minValue float64 = math.Inf(1)
|
||||
for _, smpl := range series.Points {
|
||||
if smpl.Value < minValue {
|
||||
minValue = smpl.Value
|
||||
}
|
||||
}
|
||||
alertSmpl = Sample{Point: Point{V: minValue}, Metric: lblsNormalized, MetricOrig: lbls}
|
||||
}
|
||||
} else if r.compareOp() == ValueIsBelow {
|
||||
for _, smpl := range series.Points {
|
||||
if smpl.Value >= r.targetVal() {
|
||||
@ -1212,6 +1222,15 @@ func (r *ThresholdRule) shouldAlert(series v3.Series) (Sample, bool) {
|
||||
break
|
||||
}
|
||||
}
|
||||
if shouldAlert {
|
||||
var maxValue float64 = math.Inf(-1)
|
||||
for _, smpl := range series.Points {
|
||||
if smpl.Value > maxValue {
|
||||
maxValue = smpl.Value
|
||||
}
|
||||
}
|
||||
alertSmpl = Sample{Point: Point{V: maxValue}, Metric: lblsNormalized, MetricOrig: lbls}
|
||||
}
|
||||
} else if r.compareOp() == ValueIsEq {
|
||||
for _, smpl := range series.Points {
|
||||
if smpl.Value != r.targetVal() {
|
||||
@ -1226,6 +1245,15 @@ func (r *ThresholdRule) shouldAlert(series v3.Series) (Sample, bool) {
|
||||
break
|
||||
}
|
||||
}
|
||||
// use any non-inf or nan value from the series
|
||||
if shouldAlert {
|
||||
for _, smpl := range series.Points {
|
||||
if !math.IsInf(smpl.Value, 0) && !math.IsNaN(smpl.Value) {
|
||||
alertSmpl = Sample{Point: Point{V: smpl.Value}, Metric: lblsNormalized, MetricOrig: lbls}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case OnAverage:
|
||||
// If the average of all samples matches the condition, the rule is firing.
|
||||
|
@ -47,6 +47,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp string
|
||||
matchType string
|
||||
target float64
|
||||
expectedAlertSample v3.Point
|
||||
}{
|
||||
// Test cases for Equals Always
|
||||
{
|
||||
@ -63,6 +64,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "2", // Always
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -124,6 +126,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -139,6 +142,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -154,6 +158,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 0.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -185,6 +190,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "2", // Always
|
||||
target: 1.5,
|
||||
expectedAlertSample: v3.Point{Value: 2.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -216,6 +222,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "1", // Once
|
||||
target: 4.5,
|
||||
expectedAlertSample: v3.Point{Value: 10.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -277,6 +284,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "2", // Always
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -308,6 +316,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -338,6 +347,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -353,6 +363,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "1", // Once
|
||||
target: 0.0,
|
||||
expectedAlertSample: v3.Point{Value: 1.0},
|
||||
},
|
||||
// Test cases for Less Than Always
|
||||
{
|
||||
@ -369,6 +380,23 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "2", // Always
|
||||
target: 4,
|
||||
expectedAlertSample: v3.Point{Value: 1.5},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
Points: []v3.Point{
|
||||
{Value: 1.5},
|
||||
{Value: 2.5},
|
||||
{Value: 1.5},
|
||||
{Value: 3.5},
|
||||
{Value: 1.5},
|
||||
},
|
||||
},
|
||||
expectAlert: true,
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "2", // Always
|
||||
target: 4,
|
||||
expectedAlertSample: v3.Point{Value: 3.5},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -400,6 +428,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "1", // Once
|
||||
target: 4,
|
||||
expectedAlertSample: v3.Point{Value: 2.5},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -431,6 +460,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "3", // OnAverage
|
||||
target: 6.0,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -461,6 +491,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "3", // OnAverage
|
||||
target: 4.5,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -491,6 +522,39 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "3", // OnAverage
|
||||
target: 4.5,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
Points: []v3.Point{
|
||||
{Value: 11.0},
|
||||
{Value: 4.0},
|
||||
{Value: 3.0},
|
||||
{Value: 7.0},
|
||||
{Value: 12.0},
|
||||
},
|
||||
},
|
||||
expectAlert: true,
|
||||
compareOp: "1", // Above
|
||||
matchType: "2", // Always
|
||||
target: 2.0,
|
||||
expectedAlertSample: v3.Point{Value: 3.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
Points: []v3.Point{
|
||||
{Value: 11.0},
|
||||
{Value: 4.0},
|
||||
{Value: 3.0},
|
||||
{Value: 7.0},
|
||||
{Value: 12.0},
|
||||
},
|
||||
},
|
||||
expectAlert: true,
|
||||
compareOp: "2", // Below
|
||||
matchType: "2", // Always
|
||||
target: 13.0,
|
||||
expectedAlertSample: v3.Point{Value: 12.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -506,6 +570,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "3", // OnAverage
|
||||
target: 12.0,
|
||||
expectedAlertSample: v3.Point{Value: 6.0},
|
||||
},
|
||||
// Test cases for InTotal
|
||||
{
|
||||
@ -522,6 +587,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "3", // Equals
|
||||
matchType: "4", // InTotal
|
||||
target: 30.0,
|
||||
expectedAlertSample: v3.Point{Value: 30.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -548,6 +614,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "4", // Not Equals
|
||||
matchType: "4", // InTotal
|
||||
target: 9.0,
|
||||
expectedAlertSample: v3.Point{Value: 10.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -571,6 +638,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "1", // Greater Than
|
||||
matchType: "4", // InTotal
|
||||
target: 10.0,
|
||||
expectedAlertSample: v3.Point{Value: 20.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -595,6 +663,7 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
compareOp: "2", // Less Than
|
||||
matchType: "4", // InTotal
|
||||
target: 30.0,
|
||||
expectedAlertSample: v3.Point{Value: 20.0},
|
||||
},
|
||||
{
|
||||
values: v3.Series{
|
||||
@ -626,8 +695,11 @@ func TestThresholdRuleShouldAlert(t *testing.T) {
|
||||
values.Points[i].Timestamp = time.Now().UnixMilli()
|
||||
}
|
||||
|
||||
_, shoulAlert := rule.shouldAlert(c.values)
|
||||
smpl, shoulAlert := rule.shouldAlert(c.values)
|
||||
assert.Equal(t, c.expectAlert, shoulAlert, "Test case %d", idx)
|
||||
if shoulAlert {
|
||||
assert.Equal(t, c.expectedAlertSample.Value, smpl.V, "Test case %d", idx)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user