Skip to content

Commit 99f7665

Browse files
filter rules
Signed-off-by: Anand Rajagopal <[email protected]>
1 parent 7352367 commit 99f7665

File tree

3 files changed

+134
-71
lines changed

3 files changed

+134
-71
lines changed

pkg/ruler/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func (a *API) PrometheusRules(w http.ResponseWriter, req *http.Request) {
186186
rulesRequest := RulesRequest{
187187
RuleNames: req.Form["rule_name[]"],
188188
RuleGroupNames: req.Form["rule_group[]"],
189-
Files: req.Form["files[]"],
189+
Files: req.Form["file[]"],
190190
Type: typ,
191191
}
192192

pkg/ruler/ruler.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -776,12 +776,15 @@ func (r *Ruler) getLocalRules(userID string, rulesRequest RulesRequest) ([]*Grou
776776
default:
777777
return nil, errors.Errorf("failed to assert type of rule '%v'", rule.Name())
778778
}
779-
groupDesc.ActiveRules = append(groupDesc.ActiveRules, ruleDesc)
779+
if ruleDesc != nil {
780+
groupDesc.ActiveRules = append(groupDesc.ActiveRules, ruleDesc)
781+
}
780782
}
781783
if len(groupDesc.ActiveRules) > 0 {
782784
groupDescs = append(groupDescs, groupDesc)
783785
}
784786
}
787+
785788
return groupDescs, nil
786789
}
787790

@@ -818,7 +821,12 @@ func (r *Ruler) getShardedRules(ctx context.Context, userID string, rulesRequest
818821
return errors.Wrapf(err, "unable to get client for ruler %s", addr)
819822
}
820823

821-
newGrps, err := rulerClient.Rules(ctx, &rulesRequest)
824+
newGrps, err := rulerClient.Rules(ctx, &RulesRequest{
825+
RuleNames: rulesRequest.GetRuleNames(),
826+
RuleGroupNames: rulesRequest.GetRuleGroupNames(),
827+
Files: rulesRequest.GetFiles(),
828+
Type: rulesRequest.GetType(),
829+
})
822830
if err != nil {
823831
return errors.Wrapf(err, "unable to retrieve rules from ruler %s", addr)
824832
}

pkg/ruler/ruler_test.go

Lines changed: 123 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -332,104 +332,159 @@ func TestGetRules(t *testing.T) {
332332
sharding bool
333333
shardingStrategy string
334334
shuffleShardSize int
335+
rulesRequest RulesRequest
336+
expectedCount map[string]int
335337
}
336338

337-
//ruleMap := rulesMap{
338-
// "user": []*rulespb.RuleDesc{
339-
// {
340-
// Record: "test_user1_1",
341-
// Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
342-
// },
343-
// },
344-
//}
339+
ruleMap := rulesMap{
340+
"ruler1-user1-rule-group1": []*rulespb.RuleDesc{
341+
{
342+
Record: "rtest_user1_1",
343+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
344+
},
345+
{
346+
Alert: "atest_user1_1",
347+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
348+
},
349+
},
350+
"ruler1-user1-rule-group2": []*rulespb.RuleDesc{
351+
{
352+
Record: "rtest_user1_1",
353+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
354+
},
355+
},
356+
"ruler1-user2-rule-group1": []*rulespb.RuleDesc{
357+
{
358+
Record: "rtest_user1_1",
359+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
360+
},
361+
},
362+
"ruler2-user1-rule-group3": []*rulespb.RuleDesc{
363+
{
364+
Record: "rtest_user1_1",
365+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
366+
},
367+
{
368+
Alert: "atest_user1_1",
369+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
370+
},
371+
},
372+
"ruler2-user2-rule-group1": []*rulespb.RuleDesc{
373+
{
374+
Record: "rtest_user1_1",
375+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
376+
},
377+
{
378+
Alert: "atest_user1_1",
379+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
380+
},
381+
},
382+
"ruler2-user2-rule-group2": []*rulespb.RuleDesc{
383+
{
384+
Record: "rtest_user1_1",
385+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
386+
},
387+
{
388+
Alert: "atest_user1_1",
389+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
390+
},
391+
},
392+
"ruler3-user2-rule-group1": []*rulespb.RuleDesc{
393+
{
394+
Record: "rtest_user1_1",
395+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
396+
},
397+
{
398+
Alert: "atest_user1_1",
399+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
400+
},
401+
},
402+
"ruler3-user2-rule-group2": []*rulespb.RuleDesc{
403+
{
404+
Record: "rtest_user1_1",
405+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
406+
},
407+
{
408+
Alert: "atest_user1_1",
409+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
410+
},
411+
},
412+
"ruler3-user3-rule-group1": []*rulespb.RuleDesc{
413+
{
414+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
415+
Record: "rtest_user1_1",
416+
},
417+
{
418+
Alert: "atest_user1_1",
419+
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
420+
},
421+
},
422+
}
345423

346424
expectedRules := expectedRulesMap{
347425
"ruler1": map[string]rulespb.RuleGroupList{
348426
"user1": {
349-
&rulespb.RuleGroupDesc{User: "user1", Namespace: "namespace", Name: "first", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
350-
{
351-
Record: "test_user1_1",
352-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
353-
},
354-
}},
355-
&rulespb.RuleGroupDesc{User: "user1", Namespace: "namespace", Name: "second", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
356-
{
357-
Record: "test_user1_2",
358-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
359-
},
360-
}},
427+
&rulespb.RuleGroupDesc{User: "user1", Namespace: "namespace", Name: "first", Interval: 10 * time.Second, Rules: ruleMap["ruler1-user1-rule-group1"]},
428+
&rulespb.RuleGroupDesc{User: "user1", Namespace: "namespace", Name: "second", Interval: 10 * time.Second, Rules: ruleMap["ruler1-user1-rule-group2"]},
361429
},
362430
"user2": {
363-
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "third", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
364-
{
365-
Record: "test_user2",
366-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
367-
},
368-
}},
431+
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "third", Interval: 10 * time.Second, Rules: ruleMap["ruler1-user2-rule-group1"]},
369432
},
370433
},
371434
"ruler2": map[string]rulespb.RuleGroupList{
372435
"user1": {
373-
&rulespb.RuleGroupDesc{User: "user1", Namespace: "namespace", Name: "third", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
374-
{
375-
Record: "test_user1",
376-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
377-
},
378-
}},
436+
&rulespb.RuleGroupDesc{User: "user1", Namespace: "namespace", Name: "third", Interval: 10 * time.Second, Rules: ruleMap["ruler2-user1-rule-group3"]},
379437
},
380438
"user2": {
381-
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "first", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
382-
{
383-
Record: "test_user2_1",
384-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
385-
},
386-
}},
387-
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "second", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
388-
{
389-
Record: "test_user2_2",
390-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
391-
},
392-
}},
439+
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "first", Interval: 10 * time.Second, Rules: ruleMap["ruler2-user2-rule-group1"]},
440+
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "second", Interval: 10 * time.Second, Rules: ruleMap["ruler2-user2-rule-group2"]},
393441
},
394442
},
395443
"ruler3": map[string]rulespb.RuleGroupList{
396444
"user3": {
397-
&rulespb.RuleGroupDesc{User: "user3", Namespace: "namespace", Name: "third", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
398-
{
399-
Record: "test_user3",
400-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
401-
},
402-
}},
445+
&rulespb.RuleGroupDesc{User: "user3", Namespace: "namespace", Name: "third", Interval: 10 * time.Second, Rules: ruleMap["ruler3-user3-rule-group1"]},
403446
},
404447
"user2": {
405-
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "forth", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
406-
{
407-
Record: "test_user2_1",
408-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
409-
},
410-
}},
411-
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "fifty", Interval: 10 * time.Second, Rules: []*rulespb.RuleDesc{
412-
{
413-
Record: "test_user2_2",
414-
Expr: "sum(rate(node_cpu_seconds_total[3h:10m]))",
415-
},
416-
}},
448+
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "forth", Interval: 10 * time.Second, Rules: ruleMap["ruler3-user2-rule-group1"]},
449+
&rulespb.RuleGroupDesc{User: "user2", Namespace: "namespace", Name: "fifty", Interval: 10 * time.Second, Rules: ruleMap["ruler3-user2-rule-group2"]},
417450
},
418451
},
419452
}
420453

421454
testCases := map[string]testCase{
422455
"No Sharding": {
423456
sharding: false,
457+
rulesRequest: RulesRequest{
458+
Type: AlertingRuleFilter,
459+
},
460+
expectedCount: map[string]int{
461+
"user1": 2,
462+
"user2": 4,
463+
"user3": 1,
464+
},
424465
},
425466
"Default Sharding": {
426467
sharding: true,
427468
shardingStrategy: util.ShardingStrategyDefault,
469+
rulesRequest: RulesRequest{},
470+
expectedCount: map[string]int{
471+
"user1": 5,
472+
"user2": 9,
473+
"user3": 2,
474+
},
428475
},
429476
"Shuffle Sharding and ShardSize = 2": {
430477
sharding: true,
431478
shuffleShardSize: 2,
432479
shardingStrategy: util.ShardingStrategyShuffle,
480+
rulesRequest: RulesRequest{
481+
Type: RecordingRuleFilter,
482+
},
483+
expectedCount: map[string]int{
484+
"user1": 3,
485+
"user2": 5,
486+
"user3": 1,
487+
},
433488
},
434489
}
435490

@@ -502,16 +557,16 @@ func TestGetRules(t *testing.T) {
502557
forEachRuler(func(_ string, r *Ruler) {
503558
r.syncRules(context.Background(), rulerSyncReasonInitial)
504559
})
505-
t.Log("Rules ---->")
506560
for u := range allRulesByUser {
507561
ctx := user.InjectOrgID(context.Background(), u)
508562
forEachRuler(func(_ string, r *Ruler) {
509-
rules, err := r.GetRules(ctx, RulesRequest{
510-
Type: "",
511-
})
512-
t.Log("Rules ---->", rules)
563+
ruleStateDescriptions, err := r.GetRules(ctx, tc.rulesRequest)
513564
require.NoError(t, err)
514-
require.Equal(t, len(allRulesByUser[u]), len(rules))
565+
rct := 0
566+
for _, ruleStateDesc := range ruleStateDescriptions {
567+
rct += len(ruleStateDesc.ActiveRules)
568+
}
569+
require.Equal(t, tc.expectedCount[u], rct)
515570
if tc.sharding {
516571
mockPoolClient := r.clientsPool.(*mockRulerClientsPool)
517572

0 commit comments

Comments
 (0)