mirror of https://github.com/grafana/grafana
Alerting: Update state history service to filter states transitions (#58863)
* rename the method to better reflect its behavior * make historian filter transition on itself * call historian with all changespull/58867/head
parent
18d09cd3fe
commit
a85adeed96
@ -0,0 +1,100 @@ |
|||||||
|
package historian |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/require" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/services/ngalert/eval" |
||||||
|
"github.com/grafana/grafana/pkg/services/ngalert/models" |
||||||
|
"github.com/grafana/grafana/pkg/services/ngalert/state" |
||||||
|
) |
||||||
|
|
||||||
|
func TestShouldAnnotate(t *testing.T) { |
||||||
|
allStates := []eval.State{ |
||||||
|
eval.Normal, |
||||||
|
eval.Alerting, |
||||||
|
eval.Pending, |
||||||
|
eval.NoData, |
||||||
|
eval.Error, |
||||||
|
} |
||||||
|
|
||||||
|
type Transition struct { |
||||||
|
State eval.State |
||||||
|
StateReason string |
||||||
|
PreviousState eval.State |
||||||
|
PreviousStateReason string |
||||||
|
} |
||||||
|
|
||||||
|
transition := func(from eval.State, fromReason string, to eval.State, toReason string) Transition { |
||||||
|
return Transition{ |
||||||
|
PreviousState: from, |
||||||
|
PreviousStateReason: fromReason, |
||||||
|
State: to, |
||||||
|
StateReason: toReason, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
noTransition := func(state eval.State, stateReason string) Transition { |
||||||
|
return transition(state, stateReason, state, stateReason) |
||||||
|
} |
||||||
|
|
||||||
|
knownReasons := []string{ |
||||||
|
"", |
||||||
|
models.StateReasonMissingSeries, |
||||||
|
eval.Error.String(), |
||||||
|
eval.NoData.String(), |
||||||
|
} |
||||||
|
|
||||||
|
allCombinations := make([]Transition, 0, len(allStates)*len(allStates)*len(knownReasons)*len(knownReasons)) |
||||||
|
for _, from := range allStates { |
||||||
|
for _, reasonFrom := range knownReasons { |
||||||
|
for _, to := range allStates { |
||||||
|
for _, reasonTo := range knownReasons { |
||||||
|
allCombinations = append(allCombinations, transition(from, reasonFrom, to, reasonTo)) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
negativeTransitions := map[Transition]struct{}{ |
||||||
|
noTransition(eval.Normal, ""): {}, |
||||||
|
noTransition(eval.Normal, eval.Error.String()): {}, |
||||||
|
noTransition(eval.Normal, eval.NoData.String()): {}, |
||||||
|
noTransition(eval.Normal, models.StateReasonMissingSeries): {}, |
||||||
|
noTransition(eval.Alerting, ""): {}, |
||||||
|
noTransition(eval.Alerting, eval.Error.String()): {}, |
||||||
|
noTransition(eval.Alerting, eval.NoData.String()): {}, |
||||||
|
noTransition(eval.Alerting, models.StateReasonMissingSeries): {}, |
||||||
|
noTransition(eval.Pending, ""): {}, |
||||||
|
noTransition(eval.Pending, eval.Error.String()): {}, |
||||||
|
noTransition(eval.Pending, eval.NoData.String()): {}, |
||||||
|
noTransition(eval.Pending, models.StateReasonMissingSeries): {}, |
||||||
|
noTransition(eval.NoData, ""): {}, |
||||||
|
noTransition(eval.NoData, eval.Error.String()): {}, |
||||||
|
noTransition(eval.NoData, eval.NoData.String()): {}, |
||||||
|
noTransition(eval.NoData, models.StateReasonMissingSeries): {}, |
||||||
|
noTransition(eval.Error, ""): {}, |
||||||
|
noTransition(eval.Error, eval.Error.String()): {}, |
||||||
|
noTransition(eval.Error, eval.NoData.String()): {}, |
||||||
|
noTransition(eval.Error, models.StateReasonMissingSeries): {}, |
||||||
|
|
||||||
|
transition(eval.Normal, "", eval.Normal, models.StateReasonMissingSeries): {}, |
||||||
|
transition(eval.Normal, eval.Error.String(), eval.Normal, models.StateReasonMissingSeries): {}, |
||||||
|
transition(eval.Normal, eval.NoData.String(), eval.Normal, models.StateReasonMissingSeries): {}, |
||||||
|
} |
||||||
|
|
||||||
|
for _, tc := range allCombinations { |
||||||
|
_, ok := negativeTransitions[tc] |
||||||
|
trans := state.StateTransition{ |
||||||
|
State: &state.State{State: tc.State, StateReason: tc.StateReason}, |
||||||
|
PreviousState: tc.PreviousState, |
||||||
|
PreviousStateReason: tc.PreviousStateReason, |
||||||
|
} |
||||||
|
|
||||||
|
t.Run(fmt.Sprintf("%s -> %s should be %v", trans.PreviousFormatted(), trans.Formatted(), !ok), func(t *testing.T) { |
||||||
|
require.Equal(t, !ok, shouldAnnotate(trans)) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue