The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
grafana/pkg/services/ngalert/models/instance_test.go

106 lines
2.6 KiB

Alerting: Add alert pausing feature (#60734) * Add field in alert_rule model, add state to alert_instance model, and state to eval * Remove paused state from eval package * Skip paused alert rules in scheduler * Add migration to add is_paused field to alert_rule table * Convert to postable alerts only if not normal, pernding, or paused * Handle paused eval results in state manager * Add Paused state to eval package * Add paused alerts logic in scheduler * Skip alert on scheduler * Remove paused status from eval package * Apply suggestions from code review Co-authored-by: George Robinson <george.robinson@grafana.com> * Remove state * Rethink schedule and manager for paused alerts * Change return to continue * Remove unused var * Rethink alert pausing * Paused alerts storing annotations * Only add one state transition * Revert boolean method renaming refactor * Revert take image refactor * Make registry errors public * Revert method extraction for getting a folder title * Revert variable renaming refactor * Undo unnecessary changes * Revert changes in test * Remove IsPause check in PatchPartiLAlertRule function * Use SetNormal to set state * Fix text by returning to old behaviour on alert rule deletion * Add test in schedule_unit_test.go to test ticks with paused alerts * Add coment to clarify usage of context.Background() * Add comment to clarify resetStateByRuleUID method usage * Move rule get to a more limited scope * Update pkg/services/ngalert/schedule/schedule.go Co-authored-by: George Robinson <george.robinson@grafana.com> * rum gofmt on pkg/services/ngalert/schedule/schedule.go * Remove defer cancel for context * Update pkg/services/ngalert/models/instance_test.go Co-authored-by: Santiago <santiagohernandez.1997@gmail.com> * Update pkg/services/ngalert/models/testing.go Co-authored-by: Santiago <santiagohernandez.1997@gmail.com> * Update pkg/services/ngalert/schedule/schedule_unit_test.go Co-authored-by: Santiago <santiagohernandez.1997@gmail.com> * Update pkg/services/ngalert/schedule/schedule_unit_test.go Co-authored-by: Santiago <santiagohernandez.1997@gmail.com> * Update pkg/services/ngalert/models/instance_test.go Co-authored-by: Santiago <santiagohernandez.1997@gmail.com> * skip scheduler rule state clean up on paused alert rule * Update pkg/services/ngalert/schedule/schedule.go Co-authored-by: Santiago <santiagohernandez.1997@gmail.com> * Fix mock in test * Add (hopefully) final suggestions * Use error channel from recordAnnotationsSync to cancel context * Run make gen-cue * Place pause alert check in channel update after version check * Reduce branching un update channel select * Add if for error and move code inside if in state manager ResetStateByRuleUID * Add reason to logs * Update pkg/services/ngalert/schedule/schedule.go Co-authored-by: George Robinson <george.robinson@grafana.com> * Do not delete alert rule routine, just exit on eval if is paused * Reduce branching and create-close a channel to avoid deadlocks * Separate state deletion and state reset (includes history saving) * Add current pause state in rule route in scheduler * Split clearState and bring errCh closer to RecordStatesAsync call * Change rule to ruleMeta in RecordStatesAsync * copy state to be able to modify it * Add timeout to context creation * Shorten the timeout * Use resetState is rule is paused and deleteState if rule is not paused * Remove Empty state reason * Save every rule change in historian * Add tests for DeleteStateByRuleUID and ResetStateByRuleUID * Remove useless line * Remove outdated comment Co-authored-by: George Robinson <george.robinson@grafana.com> Co-authored-by: Santiago <santiagohernandez.1997@gmail.com> Co-authored-by: Armand Grillet <2117580+armandgrillet@users.noreply.github.com>
2 years ago
package models
import (
"errors"
"fmt"
"testing"
"github.com/stretchr/testify/require"
)
func TestInstanceStateType_IsValid(t *testing.T) {
testCases := []struct {
instanceType InstanceStateType
expectedValidity bool
}{
{
instanceType: InstanceStateFiring,
expectedValidity: true,
},
{
instanceType: InstanceStateNormal,
expectedValidity: true,
},
{
instanceType: InstanceStatePending,
expectedValidity: true,
},
{
instanceType: InstanceStateNoData,
expectedValidity: true,
},
{
instanceType: InstanceStateError,
expectedValidity: true,
},
{
instanceType: InstanceStateType("notAValidInstanceStateType"),
expectedValidity: false,
},
}
for _, tc := range testCases {
t.Run(buildTestInstanceStateTypeIsValidName(tc.instanceType, tc.expectedValidity), func(t *testing.T) {
require.Equal(t, tc.expectedValidity, tc.instanceType.IsValid())
})
}
}
func buildTestInstanceStateTypeIsValidName(instanceType InstanceStateType, expectedValidity bool) string {
if expectedValidity {
return fmt.Sprintf("%q should be valid", instanceType)
}
return fmt.Sprintf("%q should not be valid", instanceType)
}
func TestValidateAlertInstance(t *testing.T) {
testCases := []struct {
name string
orgId int64
uid string
currentState InstanceStateType
err error
}{
{
name: "fails if orgID is empty",
orgId: 0,
uid: "validUid",
currentState: InstanceStateNormal,
err: errors.New("alert instance is invalid due to missing alert rule organisation"),
},
{
name: "fails if uid is empty",
orgId: 1,
uid: "",
currentState: InstanceStateNormal,
err: errors.New("alert instance is invalid due to missing alert rule uid"),
},
{
name: "fails if current state is not valid",
orgId: 1,
uid: "validUid",
currentState: InstanceStateType("notAValidType"),
err: errors.New("alert instance is invalid because the state 'notAValidType' is invalid"),
},
{
name: "ok if validated fields are correct",
orgId: 1,
uid: "validUid",
currentState: InstanceStateNormal,
err: nil,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
instance := AlertInstanceGen(func(instance *AlertInstance) {
instance.AlertInstanceKey.RuleOrgID = tc.orgId
instance.AlertInstanceKey.RuleUID = tc.uid
instance.CurrentState = tc.currentState
})
require.Equal(t, tc.err, ValidateAlertInstance(*instance))
})
}
}