Skip to content

Commit

Permalink
PC-9523 Add timeToBurnEntireBudget alerting condition (#78)
Browse files Browse the repository at this point in the history
  • Loading branch information
piotrkwarcinski authored Jul 24, 2023
1 parent 2887015 commit c7469a1
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 21 deletions.
16 changes: 8 additions & 8 deletions manifest/v1alpha/datasources_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
//go:build unit_test

package v1alpha

import (
Expand All @@ -9,6 +7,8 @@ import (

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/nobl9/nobl9-go/manifest"
)

func TestHistoricalRetrievalDuration_durationInMinutes(t *testing.T) {
Expand Down Expand Up @@ -69,33 +69,33 @@ func TestHistoricalRetrievalDuration_durationInMinutes_unsupportedUnit(t *testin

func TestGetDataRetrievalMaxDuration(t *testing.T) {
for _, test := range []struct {
Kind Kind
Kind manifest.Kind
SourceType string
Valid bool
Expected HistoricalRetrievalDuration
}{
{
Kind: KindAgent,
Kind: manifest.KindAgent,
SourceType: CloudWatch.String(),
Valid: true,
Expected: agentDataRetrievalMaxDuration[CloudWatch.String()],
},
{
Kind: KindAgent,
Kind: manifest.KindAgent,
SourceType: "",
},
{
Kind: KindDirect,
Kind: manifest.KindDirect,
SourceType: CloudWatch.String(),
Valid: true,
Expected: directDataRetrievalMaxDuration[CloudWatch.String()],
},
{
Kind: KindDirect,
Kind: manifest.KindDirect,
SourceType: "invalid",
},
{
Kind: KindSLO,
Kind: manifest.KindSLO,
SourceType: "",
},
} {
Expand Down
8 changes: 5 additions & 3 deletions manifest/v1alpha/measurement.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ const (
MeasurementBurnedBudget Measurement = iota + 1
MeasurementAverageBurnRate
MeasurementTimeToBurnBudget
MeasurementTimeToBurnEntireBudget
)

func getMeasurements() map[string]Measurement {
return map[string]Measurement{
"burnedBudget": MeasurementBurnedBudget,
"averageBurnRate": MeasurementAverageBurnRate,
"timeToBurnBudget": MeasurementTimeToBurnBudget,
"burnedBudget": MeasurementBurnedBudget,
"averageBurnRate": MeasurementAverageBurnRate,
"timeToBurnBudget": MeasurementTimeToBurnBudget,
"timeToBurnEntireBudget": MeasurementTimeToBurnEntireBudget,
}
}

Expand Down
2 changes: 0 additions & 2 deletions manifest/v1alpha/timetravel_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
//go:build unit_test

package v1alpha

import (
Expand Down
2 changes: 0 additions & 2 deletions manifest/v1alpha/twindow/twindow_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
//go:build unit_test

package twindow

import (
Expand Down
15 changes: 11 additions & 4 deletions manifest/v1alpha/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -2123,7 +2123,8 @@ func alertPolicyConditionWithLastsForMeasurementValidation(sl v.StructLevel) {
condition := sl.Current().Interface().(AlertCondition)

switch condition.Measurement {
case MeasurementTimeToBurnBudget.String():
case MeasurementTimeToBurnBudget.String(),
MeasurementTimeToBurnEntireBudget.String():
valueDuration, ok := condition.Value.(string)
if !ok {
sl.ReportError(condition, "measurement", "Measurement", "invalidValueDuration", "")
Expand All @@ -2136,8 +2137,8 @@ func alertPolicyConditionWithLastsForMeasurementValidation(sl v.StructLevel) {
if duration <= 0 {
sl.ReportError(condition, "measurement", "Measurement", "negativeOrZeroValueDuration", "")
}
case MeasurementBurnedBudget.String():
case MeasurementAverageBurnRate.String():
case MeasurementBurnedBudget.String(),
MeasurementAverageBurnRate.String():
_, ok := condition.Value.(float64)
if !ok {
sl.ReportError(condition, "measurement", "Measurement", "invalidValue", "")
Expand All @@ -2156,6 +2157,8 @@ func alertPolicyConditionWithAlertingWindowMeasurementValidation(sl v.StructLeve
if !ok {
sl.ReportError(condition, "value", "Value", "invalidValue", "")
}
case MeasurementTimeToBurnEntireBudget.String():
sl.ReportError(condition, "measurement", "Measurement", "timeToBurnEntireBudgetNotSupportedWithAlertingWindow", "")
case MeasurementTimeToBurnBudget.String():
sl.ReportError(condition, "measurement", "Measurement", "timeToBurnBudgetNotSupportedWithAlertingWindow", "")
case MeasurementBurnedBudget.String():
Expand Down Expand Up @@ -2195,7 +2198,7 @@ func alertPolicyConditionOperatorLimitsValidation(sl v.StructLevel) {
switch condition.Measurement {
case MeasurementTimeToBurnBudget.String():
if condition.Operator != LessThan.String() {
sl.ReportError(condition, "value", "Value", "valueOperatorForTimeToBurnBudgetLessThenRequired", "")
sl.ReportError(condition, "value", "Value", "valueOperatorForTimeToBurnBudgetLessThanRequired", "")
}
case MeasurementBurnedBudget.String():
if condition.Operator != GreaterThanEqual.String() {
Expand All @@ -2205,6 +2208,10 @@ func alertPolicyConditionOperatorLimitsValidation(sl v.StructLevel) {
if condition.Operator != GreaterThanEqual.String() {
sl.ReportError(condition, "value", "Value", "valueOperatorBurnRateGreaterThanEqualRequired", "")
}
case MeasurementTimeToBurnEntireBudget.String():
if condition.Operator != "" {
sl.ReportError(condition, "op", "Operator", "operatorFieldIsDeprecated", "")
}
}
}

Expand Down
40 changes: 38 additions & 2 deletions manifest/v1alpha/validator_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
//go:build unit_test

package v1alpha

import (
Expand All @@ -9,6 +7,7 @@ import (

v "github.com/go-playground/validator/v10"
"github.com/stretchr/testify/assert"
"golang.org/x/exp/slices"

"github.com/nobl9/nobl9-go/manifest"
)
Expand Down Expand Up @@ -954,3 +953,40 @@ func TestIsBadOverTotalEnabledForDataSource_cloudwatch(t *testing.T) {
r := isBadOverTotalEnabledForDataSource(slo)
assert.True(t, r)
}

func TestAlertConditionOpSupport(t *testing.T) {
allOps := []string{"gt", "lt", "lte", "gte", "noop"}
validate := NewValidator()
for condition, allowedOps := range map[AlertCondition][]string{
{
Measurement: MeasurementTimeToBurnEntireBudget.String(),
LastsForDuration: "10m",
Value: "30m",
}: {},
{
Measurement: MeasurementTimeToBurnBudget.String(),
LastsForDuration: "10m",
Value: "30m",
}: {"lt"},
{
Measurement: MeasurementBurnedBudget.String(),
Value: 30.0,
}: {"gte"},
{
Measurement: MeasurementAverageBurnRate.String(),
Value: 30.0,
}: {"gte"},
} {
t.Run(condition.Measurement, func(t *testing.T) {
for _, op := range allOps {
condition.Operator = op
err := validate.Check(condition)
if slices.Contains(allowedOps, op) {
assert.NoError(t, err)
} else {
assert.Error(t, err)
}
}
})
}
}

0 comments on commit c7469a1

Please sign in to comment.