@ -2,7 +2,6 @@ package store_test
import (
"context"
"fmt"
"testing"
"github.com/stretchr/testify/require"
@ -13,106 +12,6 @@ import (
const baseIntervalSeconds = 10
func BenchmarkAlertInstanceOperations ( b * testing . B ) {
b . StopTimer ( )
ctx := context . Background ( )
_ , dbstore := tests . SetupTestEnv ( b , baseIntervalSeconds )
const mainOrgID int64 = 1
alertRule := tests . CreateTestAlertRule ( b , ctx , dbstore , 60 , mainOrgID )
// Create some instances to write down and then delete.
count := 10_003
instances := make ( [ ] models . AlertInstance , 0 , count )
keys := make ( [ ] models . AlertInstanceKey , 0 , count )
for i := 0 ; i < count ; i ++ {
labels := models . InstanceLabels { "test" : fmt . Sprint ( i ) }
_ , labelsHash , _ := labels . StringAndHash ( )
instance := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : alertRule . OrgID ,
RuleUID : alertRule . UID ,
LabelsHash : labelsHash ,
} ,
CurrentState : models . InstanceStateFiring ,
CurrentReason : string ( models . InstanceStateError ) ,
Labels : labels ,
}
instances = append ( instances , instance )
keys = append ( keys , instance . AlertInstanceKey )
}
b . StartTimer ( )
for i := 0 ; i < b . N ; i ++ {
_ = dbstore . SaveAlertInstances ( ctx , instances ... )
_ = dbstore . DeleteAlertInstances ( ctx , keys ... )
}
}
func TestIntegrationAlertInstanceBulkWrite ( t * testing . T ) {
if testing . Short ( ) {
t . Skip ( "skipping integration test" )
}
ctx := context . Background ( )
_ , dbstore := tests . SetupTestEnv ( t , baseIntervalSeconds )
orgIDs := [ ] int64 { 1 , 2 , 3 , 4 , 5 }
counts := [ ] int { 20_000 , 200 , 503 , 0 , 1257 }
instances := [ ] models . AlertInstance { }
keys := [ ] models . AlertInstanceKey { }
for i , id := range orgIDs {
alertRule := tests . CreateTestAlertRule ( t , ctx , dbstore , 60 , id )
// Create some instances to write down and then delete.
for j := 0 ; j < counts [ i ] ; j ++ {
labels := models . InstanceLabels { "test" : fmt . Sprint ( j ) }
_ , labelsHash , _ := labels . StringAndHash ( )
instance := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : alertRule . OrgID ,
RuleUID : alertRule . UID ,
LabelsHash : labelsHash ,
} ,
CurrentState : models . InstanceStateFiring ,
CurrentReason : string ( models . InstanceStateError ) ,
Labels : labels ,
}
instances = append ( instances , instance )
keys = append ( keys , instance . AlertInstanceKey )
}
}
err := dbstore . SaveAlertInstances ( ctx , instances ... )
require . NoError ( t , err )
t . Log ( "Finished database write" )
// List our instances. Make sure we have the right count.
for i , id := range orgIDs {
q := & models . ListAlertInstancesQuery {
RuleOrgID : id ,
}
err = dbstore . ListAlertInstances ( ctx , q )
require . NoError ( t , err )
require . Equal ( t , counts [ i ] , len ( q . Result ) , "Org %v: Expected %v instances but got %v" , id , counts [ i ] , len ( q . Result ) )
}
t . Log ( "Finished database read" )
err = dbstore . DeleteAlertInstances ( ctx , keys ... )
require . NoError ( t , err )
t . Log ( "Finished database delete" )
for _ , id := range orgIDs {
q := & models . ListAlertInstancesQuery {
RuleOrgID : id ,
}
err = dbstore . ListAlertInstances ( ctx , q )
require . NoError ( t , err )
require . Zero ( t , len ( q . Result ) , "Org %v: Deleted instances but still had %v" , id , len ( q . Result ) )
}
}
func TestIntegrationAlertInstanceOperations ( t * testing . T ) {
if testing . Short ( ) {
t . Skip ( "skipping integration test" )
@ -135,54 +34,44 @@ func TestIntegrationAlertInstanceOperations(t *testing.T) {
require . Equal ( t , orgID , alertRule4 . OrgID )
t . Run ( "can save and read new alert instance" , func ( t * testing . T ) {
labels := models . InstanceLabels { "test" : "testValue" }
_ , hash , _ := labels . StringAndHash ( )
instance := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : alertRule1 . OrgID ,
RuleUID : alertRule1 . UID ,
LabelsHash : hash ,
} ,
CurrentState : models . InstanceStateFiring ,
CurrentReason : string ( models . InstanceStateError ) ,
Labels : labels ,
}
err := dbstore . SaveAlertInstances ( ctx , instance )
saveCmd := & models . SaveAlertInstanceCommand {
RuleOrgID : alertRule1 . OrgID ,
RuleUID : alertRule1 . UID ,
State : models . InstanceStateFiring ,
StateReason : string ( models . InstanceStateError ) ,
Labels : models . InstanceLabels { "test" : "testValue" } ,
}
err := dbstore . SaveAlertInstance ( ctx , saveCmd )
require . NoError ( t , err )
getCmd := & models . GetAlertInstanceQuery {
RuleOrgID : instance . RuleOrgID ,
RuleUID : instance . RuleUID ,
RuleOrgID : saveCmd . RuleOrgID ,
RuleUID : saveCmd . RuleUID ,
Labels : models . InstanceLabels { "test" : "testValue" } ,
}
err = dbstore . GetAlertInstance ( ctx , getCmd )
require . NoError ( t , err )
require . Equal ( t , instance . Labels , getCmd . Result . Labels )
require . Equal ( t , saveCmd . Labels , getCmd . Result . Labels )
require . Equal ( t , alertRule1 . OrgID , getCmd . Result . RuleOrgID )
require . Equal ( t , alertRule1 . UID , getCmd . Result . RuleUID )
require . Equal ( t , instance . Current Reason, getCmd . Result . CurrentReason )
require . Equal ( t , saveCmd . State Reason, getCmd . Result . CurrentReason )
} )
t . Run ( "can save and read new alert instance with no labels" , func ( t * testing . T ) {
labels := models . InstanceLabels { }
_ , hash , _ := labels . StringAndHash ( )
instance := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : alertRule2 . OrgID ,
RuleUID : alertRule2 . UID ,
LabelsHash : hash ,
} ,
CurrentState : models . InstanceStateNormal ,
Labels : labels ,
saveCmd := & models . SaveAlertInstanceCommand {
RuleOrgID : alertRule2 . OrgID ,
RuleUID : alertRule2 . UID ,
State : models . InstanceStateNormal ,
Labels : models . InstanceLabels { } ,
}
err := dbstore . SaveAlertInstances ( ctx , instance )
err := dbstore . SaveAlertInstance ( ctx , saveCmd )
require . NoError ( t , err )
getCmd := & models . GetAlertInstanceQuery {
RuleOrgID : instance . RuleOrgID ,
RuleUID : instance . RuleUID ,
RuleOrgID : saveCmd . RuleOrgID ,
RuleUID : saveCmd . RuleUID ,
}
err = dbstore . GetAlertInstance ( ctx , getCmd )
@ -190,42 +79,32 @@ func TestIntegrationAlertInstanceOperations(t *testing.T) {
require . Equal ( t , alertRule2 . OrgID , getCmd . Result . RuleOrgID )
require . Equal ( t , alertRule2 . UID , getCmd . Result . RuleUID )
require . Equal ( t , instance . Labels , getCmd . Result . Labels )
require . Equal ( t , saveCmd . Labels , getCmd . Result . Labels )
} )
t . Run ( "can save two instances with same org_id, uid and different labels" , func ( t * testing . T ) {
labels := models . InstanceLabels { "test" : "testValue" }
_ , hash , _ := labels . StringAndHash ( )
instance1 := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : alertRule3 . OrgID ,
RuleUID : alertRule3 . UID ,
LabelsHash : hash ,
} ,
CurrentState : models . InstanceStateFiring ,
Labels : labels ,
saveCmdOne := & models . SaveAlertInstanceCommand {
RuleOrgID : alertRule3 . OrgID ,
RuleUID : alertRule3 . UID ,
State : models . InstanceStateFiring ,
Labels : models . InstanceLabels { "test" : "testValue" } ,
}
err := dbstore . SaveAlertInstances ( ctx , in st anc e1 )
err := dbstore . SaveAlertInstance ( ctx , saveCmdOne )
require . NoError ( t , err )
labels = models . InstanceLabels { "test" : "testValue2" }
_ , hash , _ = labels . StringAndHash ( )
instance2 := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : instance1 . RuleOrgID ,
RuleUID : instance1 . RuleUID ,
LabelsHash : hash ,
} ,
CurrentState : models . InstanceStateFiring ,
Labels : labels ,
saveCmdTwo := & models . SaveAlertInstanceCommand {
RuleOrgID : saveCmdOne . RuleOrgID ,
RuleUID : saveCmdOne . RuleUID ,
State : models . InstanceStateFiring ,
Labels : models . InstanceLabels { "test" : "meow" } ,
}
err = dbstore . SaveAlertInstances ( ctx , instance2 )
err = dbstore . SaveAlertInstance ( ctx , saveCmdTwo )
require . NoError ( t , err )
listQuery := & models . ListAlertInstancesQuery {
RuleOrgID : in st anc e1 . RuleOrgID ,
RuleUID : in st anc e1 . RuleUID ,
RuleOrgID : saveCmdO ne . RuleOrgID ,
RuleUID : saveCmdO ne . RuleUID ,
}
err = dbstore . ListAlertInstances ( ctx , listQuery )
@ -257,32 +136,24 @@ func TestIntegrationAlertInstanceOperations(t *testing.T) {
require . Len ( t , listQuery . Result , 1 )
} )
t . Run ( "update instance with same org_id, uid and different state" , func ( t * testing . T ) {
labels := models . InstanceLabels { "test" : "testValue" }
_ , hash , _ := labels . StringAndHash ( )
instance1 := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : alertRule4 . OrgID ,
RuleUID : alertRule4 . UID ,
LabelsHash : hash ,
} ,
CurrentState : models . InstanceStateFiring ,
Labels : labels ,
t . Run ( "update instance with same org_id, uid and different labels" , func ( t * testing . T ) {
saveCmdOne := & models . SaveAlertInstanceCommand {
RuleOrgID : alertRule4 . OrgID ,
RuleUID : alertRule4 . UID ,
State : models . InstanceStateFiring ,
Labels : models . InstanceLabels { "test" : "testValue" } ,
}
err := dbstore . SaveAlertInstances ( ctx , in st anc e1 )
err := dbstore . SaveAlertInstance ( ctx , saveCmdOne )
require . NoError ( t , err )
instance2 := models . AlertInstance {
AlertInstanceKey : models . AlertInstanceKey {
RuleOrgID : alertRule4 . OrgID ,
RuleUID : instance1 . RuleUID ,
LabelsHash : instance1 . LabelsHash ,
} ,
CurrentState : models . InstanceStateNormal ,
Labels : instance1 . Labels ,
saveCmdTwo := & models . SaveAlertInstanceCommand {
RuleOrgID : saveCmdOne . RuleOrgID ,
RuleUID : saveCmdOne . RuleUID ,
State : models . InstanceStateNormal ,
Labels : models . InstanceLabels { "test" : "testValue" } ,
}
err = dbstore . SaveAlertInstances ( ctx , instance2 )
err = dbstore . SaveAlertInstance ( ctx , saveCmdTwo )
require . NoError ( t , err )
listQuery := & models . ListAlertInstancesQuery {
@ -295,9 +166,9 @@ func TestIntegrationAlertInstanceOperations(t *testing.T) {
require . Len ( t , listQuery . Result , 1 )
require . Equal ( t , instance2 . RuleOrgID , listQuery . Result [ 0 ] . RuleOrgID )
require . Equal ( t , instance2 . RuleUID , listQuery . Result [ 0 ] . RuleUID )
require . Equal ( t , instance2 . Labels , listQuery . Result [ 0 ] . Labels )
require . Equal ( t , instance2 . Current State, listQuery . Result [ 0 ] . CurrentState )
require . Equal ( t , saveCmdTwo . RuleOrgID , listQuery . Result [ 0 ] . RuleOrgID )
require . Equal ( t , saveCmdTwo . RuleUID , listQuery . Result [ 0 ] . RuleUID )
require . Equal ( t , saveCmdTwo . Labels , listQuery . Result [ 0 ] . Labels )
require . Equal ( t , saveCmdTwo . State , listQuery . Result [ 0 ] . CurrentState )
} )
}