@ -330,6 +330,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -385,6 +387,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -472,6 +476,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime . Add ( 1 * time . Minute ) ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -784,7 +790,7 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime . Add ( 2 0 * time . Second ) ,
StartsAt : evaluationTime . Add ( 3 0 * time . Second ) ,
EndsAt : evaluationTime . Add ( 30 * time . Second ) . Add ( state . ResendDelay * 3 ) ,
LastEvaluationTime : evaluationTime . Add ( 30 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
@ -923,7 +929,7 @@ func TestProcessEvalResults(t *testing.T) {
} ,
} ,
{
desc : "normal -> alerting when result is NoData and NoDataState is alerting" ,
desc : "normal -> pending when For is set but not exceeded, result is NoData and NoDataState is alerting" ,
alertRule : & models . AlertRule {
OrgID : 1 ,
Title : "test_title" ,
@ -932,6 +938,7 @@ func TestProcessEvalResults(t *testing.T) {
Annotations : map [ string ] string { "annotation" : "test" } ,
Labels : map [ string ] string { "label" : "test" } ,
IntervalSeconds : 10 ,
For : 1 * time . Minute ,
NoDataState : models . Alerting ,
} ,
evalResults : [ ] eval . Results {
@ -966,7 +973,7 @@ func TestProcessEvalResults(t *testing.T) {
"instance_label" : "test" ,
} ,
Values : make ( map [ string ] float64 ) ,
State : eval . Alert ing,
State : eval . Pend ing,
StateReason : eval . NoData . String ( ) ,
Results : [ ] state . Evaluation {
{
@ -988,6 +995,102 @@ func TestProcessEvalResults(t *testing.T) {
} ,
} ,
} ,
{
desc : "normal -> alerting when For is exceeded, result is NoData and NoDataState is alerting" ,
alertRule : & models . AlertRule {
OrgID : 1 ,
Title : "test_title" ,
UID : "test_alert_rule_uid_2" ,
NamespaceUID : "test_namespace_uid" ,
Annotations : map [ string ] string { "annotation" : "test" } ,
Labels : map [ string ] string { "label" : "test" } ,
IntervalSeconds : 10 ,
For : 30 * time . Second ,
NoDataState : models . Alerting ,
} ,
evalResults : [ ] eval . Results {
{
eval . Result {
Instance : data . Labels { "instance_label" : "test" } ,
State : eval . Normal ,
EvaluatedAt : evaluationTime ,
EvaluationDuration : evaluationDuration ,
} ,
} ,
{
eval . Result {
Instance : data . Labels { "instance_label" : "test" } ,
State : eval . NoData ,
EvaluatedAt : evaluationTime . Add ( 10 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
} ,
} ,
{
eval . Result {
Instance : data . Labels { "instance_label" : "test" } ,
State : eval . NoData ,
EvaluatedAt : evaluationTime . Add ( 20 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
} ,
} ,
{
eval . Result {
Instance : data . Labels { "instance_label" : "test" } ,
State : eval . NoData ,
EvaluatedAt : evaluationTime . Add ( 30 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
} ,
} ,
{
eval . Result {
Instance : data . Labels { "instance_label" : "test" } ,
State : eval . NoData ,
EvaluatedAt : evaluationTime . Add ( 40 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
} ,
} ,
} ,
expectedAnnotations : 2 ,
expectedStates : map [ string ] * state . State {
` [["__alert_rule_namespace_uid__","test_namespace_uid"],["__alert_rule_uid__","test_alert_rule_uid_2"],["alertname","test_title"],["instance_label","test"],["label","test"]] ` : {
AlertRuleUID : "test_alert_rule_uid_2" ,
OrgID : 1 ,
CacheID : ` [["__alert_rule_namespace_uid__","test_namespace_uid"],["__alert_rule_uid__","test_alert_rule_uid_2"],["alertname","test_title"],["instance_label","test"],["label","test"]] ` ,
Labels : data . Labels {
"__alert_rule_namespace_uid__" : "test_namespace_uid" ,
"__alert_rule_uid__" : "test_alert_rule_uid_2" ,
"alertname" : "test_title" ,
"label" : "test" ,
"instance_label" : "test" ,
} ,
Values : make ( map [ string ] float64 ) ,
State : eval . Alerting ,
StateReason : eval . NoData . String ( ) ,
Results : [ ] state . Evaluation {
{
EvaluationTime : evaluationTime . Add ( 20 * time . Second ) ,
EvaluationState : eval . NoData ,
Values : make ( map [ string ] * float64 ) ,
} ,
{
EvaluationTime : evaluationTime . Add ( 30 * time . Second ) ,
EvaluationState : eval . NoData ,
Values : make ( map [ string ] * float64 ) ,
} ,
{
EvaluationTime : evaluationTime . Add ( 40 * time . Second ) ,
EvaluationState : eval . NoData ,
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime . Add ( 40 * time . Second ) ,
EndsAt : evaluationTime . Add ( 40 * time . Second ) . Add ( state . ResendDelay * 3 ) ,
LastEvaluationTime : evaluationTime . Add ( 40 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
} ,
} ,
} ,
{
desc : "normal -> nodata when result is NoData and NoDataState is nodata" ,
alertRule : & models . AlertRule {
@ -1105,8 +1208,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : time . Time { } ,
EndsAt : time . Time { } ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -1196,8 +1299,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : time . Time { } ,
EndsAt : time . Time { } ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -1222,8 +1325,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : time . Time { } ,
EndsAt : time . Time { } ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -1320,8 +1423,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : time . Time { } ,
EndsAt : time . Time { } ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime . Add ( 20 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -1411,76 +1514,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime . Add ( 10 * time . Second ) ,
EndsAt : evaluationTime . Add ( 10 * time . Second ) . Add ( state . ResendDelay * 3 ) ,
LastEvaluationTime : evaluationTime . Add ( 10 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
} ,
} ,
} ,
{
desc : "EndsAt set correctly. normal -> alerting when result is NoData and NoDataState is alerting and For is set and For is breached" ,
alertRule : & models . AlertRule {
OrgID : 1 ,
Title : "test_title" ,
UID : "test_alert_rule_uid_2" ,
NamespaceUID : "test_namespace_uid" ,
Annotations : map [ string ] string { "annotation" : "test" } ,
Labels : map [ string ] string { "label" : "test" } ,
IntervalSeconds : 10 ,
For : 1 * time . Minute ,
NoDataState : models . Alerting ,
} ,
evalResults : [ ] eval . Results {
{
eval . Result {
Instance : data . Labels { "instance_label" : "test" } ,
State : eval . Normal ,
EvaluatedAt : evaluationTime ,
EvaluationDuration : evaluationDuration ,
} ,
} ,
{
eval . Result {
Instance : data . Labels { "instance_label" : "test" } ,
State : eval . NoData ,
EvaluatedAt : evaluationTime . Add ( 10 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
} ,
} ,
} ,
expectedAnnotations : 1 ,
expectedStates : map [ string ] * state . State {
` [["__alert_rule_namespace_uid__","test_namespace_uid"],["__alert_rule_uid__","test_alert_rule_uid_2"],["alertname","test_title"],["instance_label","test"],["label","test"]] ` : {
AlertRuleUID : "test_alert_rule_uid_2" ,
OrgID : 1 ,
CacheID : ` [["__alert_rule_namespace_uid__","test_namespace_uid"],["__alert_rule_uid__","test_alert_rule_uid_2"],["alertname","test_title"],["instance_label","test"],["label","test"]] ` ,
Labels : data . Labels {
"__alert_rule_namespace_uid__" : "test_namespace_uid" ,
"__alert_rule_uid__" : "test_alert_rule_uid_2" ,
"alertname" : "test_title" ,
"label" : "test" ,
"instance_label" : "test" ,
} ,
Values : make ( map [ string ] float64 ) ,
State : eval . Alerting ,
StateReason : eval . NoData . String ( ) ,
Results : [ ] state . Evaluation {
{
EvaluationTime : evaluationTime ,
EvaluationState : eval . Normal ,
Values : make ( map [ string ] * float64 ) ,
} ,
{
EvaluationTime : evaluationTime . Add ( 10 * time . Second ) ,
EvaluationState : eval . NoData ,
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime . Add ( 10 * time . Second ) ,
EndsAt : evaluationTime . Add ( 10 * time . Second ) . Add ( state . ResendDelay * 3 ) ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime . Add ( 10 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -1800,6 +1835,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime . Add ( 10 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "annotation" : "test" } ,
@ -2147,7 +2184,7 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime . Add ( 3 0 * time . Second ) ,
StartsAt : evaluationTime . Add ( 5 0 * time . Second ) ,
EndsAt : evaluationTime . Add ( 50 * time . Second ) . Add ( state . ResendDelay * 3 ) ,
LastEvaluationTime : evaluationTime . Add ( 50 * time . Second ) ,
EvaluationDuration : evaluationDuration ,
@ -2200,6 +2237,8 @@ func TestProcessEvalResults(t *testing.T) {
Values : make ( map [ string ] * float64 ) ,
} ,
} ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime ,
EvaluationDuration : evaluationDuration ,
Annotations : map [ string ] string { "summary" : "grafana is down in us-central-1 cluster -> prod namespace" } ,
@ -2372,6 +2411,8 @@ func TestStaleResultsHandler(t *testing.T) {
Condition : "A" ,
} ,
} ,
StartsAt : evaluationTime ,
EndsAt : evaluationTime ,
LastEvaluationTime : evaluationTime ,
EvaluationDuration : 0 ,
Annotations : map [ string ] string { "testAnnoKey" : "testAnnoValue" } ,