Skip to content

Commit 829109c

Browse files
authored
Refactor Rules Protos (#2226)
* separate storage and active state rules protos Signed-off-by: Jacob Lisi <[email protected]> * update changelog Signed-off-by: Jacob Lisi <[email protected]> * fix per PR comments Signed-off-by: Jacob Lisi <[email protected]> * fix protos Signed-off-by: Jacob Lisi <[email protected]>
1 parent 4f5c545 commit 829109c

File tree

8 files changed

+2056
-1524
lines changed

8 files changed

+2056
-1524
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## master / unreleased
44

5+
* [CHANGE] Utilize separate protos for rule state and storage. Experimental ruler API will not be functional until the rollout is complete. #2226
56
* [FEATURE] Flusher target to flush the WAL.
67
* `-flusher.wal-dir` for the WAL directory to recover from.
78
* `-flusher.concurrent-flushes` for number of concurrent flushes.

pkg/ruler/api.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,14 @@ func respondError(logger log.Logger, w http.ResponseWriter, msg string) {
129129
func (r *Ruler) rules(w http.ResponseWriter, req *http.Request) {
130130
logger := util.WithContext(req.Context(), util.Logger)
131131
userID, ctx, err := user.ExtractOrgIDFromHTTPRequest(req)
132-
if err != nil {
132+
if err != nil || userID == "" {
133133
level.Error(logger).Log("msg", "error extracting org id from context", "err", err)
134134
respondError(logger, w, "no valid org id found")
135135
return
136136
}
137137

138138
w.Header().Set("Content-Type", "application/json")
139-
rgs, err := r.GetRules(ctx, userID)
139+
rgs, err := r.GetRules(ctx)
140140

141141
if err != nil {
142142
respondError(logger, w, err.Error())
@@ -147,16 +147,16 @@ func (r *Ruler) rules(w http.ResponseWriter, req *http.Request) {
147147

148148
for _, g := range rgs {
149149
grp := RuleGroup{
150-
Name: g.Name,
151-
File: g.Namespace,
152-
Rules: make([]rule, len(g.Rules)),
153-
Interval: g.Interval.Seconds(),
150+
Name: g.Group.Name,
151+
File: g.Group.Namespace,
152+
Rules: make([]rule, len(g.ActiveRules)),
153+
Interval: g.Group.Interval.Seconds(),
154154
LastEvaluation: g.GetEvaluationTimestamp(),
155155
EvaluationTime: g.GetEvaluationDuration().Seconds(),
156156
}
157157

158-
for i, rl := range g.Rules {
159-
if g.Rules[i].Alert != "" {
158+
for i, rl := range g.ActiveRules {
159+
if g.ActiveRules[i].Rule.Alert != "" {
160160
alerts := make([]*Alert, 0, len(rl.Alerts))
161161
for _, a := range rl.Alerts {
162162
alerts = append(alerts, &Alert{
@@ -169,11 +169,11 @@ func (r *Ruler) rules(w http.ResponseWriter, req *http.Request) {
169169
}
170170
grp.Rules[i] = alertingRule{
171171
State: rl.GetState(),
172-
Name: rl.GetAlert(),
173-
Query: rl.GetExpr(),
174-
Duration: rl.For.Seconds(),
175-
Labels: client.FromLabelAdaptersToLabels(rl.Labels),
176-
Annotations: client.FromLabelAdaptersToLabels(rl.Annotations),
172+
Name: rl.Rule.GetAlert(),
173+
Query: rl.Rule.GetExpr(),
174+
Duration: rl.Rule.For.Seconds(),
175+
Labels: client.FromLabelAdaptersToLabels(rl.Rule.Labels),
176+
Annotations: client.FromLabelAdaptersToLabels(rl.Rule.Annotations),
177177
Alerts: alerts,
178178
Health: rl.GetHealth(),
179179
LastError: rl.GetLastError(),
@@ -183,9 +183,9 @@ func (r *Ruler) rules(w http.ResponseWriter, req *http.Request) {
183183
}
184184
} else {
185185
grp.Rules[i] = recordingRule{
186-
Name: rl.GetRecord(),
187-
Query: rl.GetExpr(),
188-
Labels: client.FromLabelAdaptersToLabels(rl.Labels),
186+
Name: rl.Rule.GetRecord(),
187+
Query: rl.Rule.GetExpr(),
188+
Labels: client.FromLabelAdaptersToLabels(rl.Rule.Labels),
189189
Health: rl.GetHealth(),
190190
LastError: rl.GetLastError(),
191191
LastEvaluation: rl.GetEvaluationTimestamp(),
@@ -221,14 +221,14 @@ func (r *Ruler) rules(w http.ResponseWriter, req *http.Request) {
221221
func (r *Ruler) alerts(w http.ResponseWriter, req *http.Request) {
222222
logger := util.WithContext(req.Context(), util.Logger)
223223
userID, ctx, err := user.ExtractOrgIDFromHTTPRequest(req)
224-
if err != nil {
224+
if err != nil || userID == "" {
225225
level.Error(logger).Log("msg", "error extracting org id from context", "err", err)
226226
respondError(logger, w, "no valid org id found")
227227
return
228228
}
229229

230230
w.Header().Set("Content-Type", "application/json")
231-
rgs, err := r.GetRules(ctx, userID)
231+
rgs, err := r.GetRules(ctx)
232232

233233
if err != nil {
234234
respondError(logger, w, err.Error())
@@ -238,8 +238,8 @@ func (r *Ruler) alerts(w http.ResponseWriter, req *http.Request) {
238238
alerts := []*Alert{}
239239

240240
for _, g := range rgs {
241-
for _, rl := range g.Rules {
242-
if rl.Alert != "" {
241+
for _, rl := range g.ActiveRules {
242+
if rl.Rule.Alert != "" {
243243
for _, a := range rl.Alerts {
244244
alerts = append(alerts, &Alert{
245245
Labels: client.FromLabelAdaptersToLabels(a.Labels),

pkg/ruler/ruler.go

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -472,32 +472,39 @@ func (r *Ruler) newManager(ctx context.Context, userID string) (*promRules.Manag
472472

473473
// GetRules retrieves the running rules from this ruler and all running rulers in the ring if
474474
// sharding is enabled
475-
func (r *Ruler) GetRules(ctx context.Context, userID string) ([]*rules.RuleGroupDesc, error) {
475+
func (r *Ruler) GetRules(ctx context.Context) ([]*GroupStateDesc, error) {
476+
userID, err := user.ExtractOrgID(ctx)
477+
if err != nil {
478+
return nil, fmt.Errorf("no user id found in context")
479+
}
480+
476481
if r.cfg.EnableSharding {
477-
return r.getShardedRules(ctx, userID)
482+
return r.getShardedRules(ctx)
478483
}
479484

480485
return r.getLocalRules(userID)
481486
}
482487

483-
func (r *Ruler) getLocalRules(userID string) ([]*rules.RuleGroupDesc, error) {
488+
func (r *Ruler) getLocalRules(userID string) ([]*GroupStateDesc, error) {
484489
var groups []*promRules.Group
485490
r.userManagerMtx.Lock()
486491
if mngr, exists := r.userManagers[userID]; exists {
487492
groups = mngr.RuleGroups()
488493
}
489494
r.userManagerMtx.Unlock()
490495

491-
groupDescs := make([]*rules.RuleGroupDesc, 0, len(groups))
496+
groupDescs := make([]*GroupStateDesc, 0, len(groups))
492497
prefix := filepath.Join(r.cfg.RulePath, userID) + "/"
493498

494499
for _, group := range groups {
495500
interval := group.Interval()
496-
groupDesc := &rules.RuleGroupDesc{
497-
Name: group.Name(),
498-
Namespace: strings.TrimPrefix(group.File(), prefix),
499-
Interval: interval,
500-
User: userID,
501+
groupDesc := &GroupStateDesc{
502+
Group: &rules.RuleGroupDesc{
503+
Name: group.Name(),
504+
Namespace: strings.TrimPrefix(group.File(), prefix),
505+
Interval: interval,
506+
User: userID,
507+
},
501508
EvaluationTimestamp: group.GetEvaluationTimestamp(),
502509
EvaluationDuration: group.GetEvaluationDuration(),
503510
}
@@ -507,13 +514,13 @@ func (r *Ruler) getLocalRules(userID string) ([]*rules.RuleGroupDesc, error) {
507514
lastError = r.LastError().Error()
508515
}
509516

510-
var ruleDesc *rules.RuleDesc
517+
var ruleDesc *RuleStateDesc
511518
switch rule := r.(type) {
512519
case *promRules.AlertingRule:
513520
rule.ActiveAlerts()
514-
alerts := []*rules.AlertDesc{}
521+
alerts := []*AlertStateDesc{}
515522
for _, a := range rule.ActiveAlerts() {
516-
alerts = append(alerts, &rules.AlertDesc{
523+
alerts = append(alerts, &AlertStateDesc{
517524
State: a.State.String(),
518525
Labels: client.FromLabelsToLabelAdapters(a.Labels),
519526
Annotations: client.FromLabelsToLabelAdapters(a.Annotations),
@@ -525,12 +532,14 @@ func (r *Ruler) getLocalRules(userID string) ([]*rules.RuleGroupDesc, error) {
525532
ValidUntil: a.ValidUntil,
526533
})
527534
}
528-
ruleDesc = &rules.RuleDesc{
529-
Expr: rule.Query().String(),
530-
Alert: rule.Name(),
531-
For: rule.Duration(),
532-
Labels: client.FromLabelsToLabelAdapters(rule.Labels()),
533-
Annotations: client.FromLabelsToLabelAdapters(rule.Annotations()),
535+
ruleDesc = &RuleStateDesc{
536+
Rule: &rules.RuleDesc{
537+
Expr: rule.Query().String(),
538+
Alert: rule.Name(),
539+
For: rule.Duration(),
540+
Labels: client.FromLabelsToLabelAdapters(rule.Labels()),
541+
Annotations: client.FromLabelsToLabelAdapters(rule.Annotations()),
542+
},
534543
State: rule.State().String(),
535544
Health: string(rule.Health()),
536545
LastError: lastError,
@@ -539,10 +548,12 @@ func (r *Ruler) getLocalRules(userID string) ([]*rules.RuleGroupDesc, error) {
539548
EvaluationDuration: rule.GetEvaluationDuration(),
540549
}
541550
case *promRules.RecordingRule:
542-
ruleDesc = &rules.RuleDesc{
543-
Record: rule.Name(),
544-
Expr: rule.Query().String(),
545-
Labels: client.FromLabelsToLabelAdapters(rule.Labels()),
551+
ruleDesc = &RuleStateDesc{
552+
Rule: &rules.RuleDesc{
553+
Record: rule.Name(),
554+
Expr: rule.Query().String(),
555+
Labels: client.FromLabelsToLabelAdapters(rule.Labels()),
556+
},
546557
Health: string(rule.Health()),
547558
LastError: lastError,
548559
EvaluationTimestamp: rule.GetEvaluationTimestamp(),
@@ -551,14 +562,14 @@ func (r *Ruler) getLocalRules(userID string) ([]*rules.RuleGroupDesc, error) {
551562
default:
552563
return nil, errors.Errorf("failed to assert type of rule '%v'", rule.Name())
553564
}
554-
groupDesc.Rules = append(groupDesc.Rules, ruleDesc)
565+
groupDesc.ActiveRules = append(groupDesc.ActiveRules, ruleDesc)
555566
}
556567
groupDescs = append(groupDescs, groupDesc)
557568
}
558569
return groupDescs, nil
559570
}
560571

561-
func (r *Ruler) getShardedRules(ctx context.Context, userID string) ([]*rules.RuleGroupDesc, error) {
572+
func (r *Ruler) getShardedRules(ctx context.Context) ([]*GroupStateDesc, error) {
562573
rulers, err := r.ring.GetAll()
563574
if err != nil {
564575
return nil, err
@@ -569,9 +580,7 @@ func (r *Ruler) getShardedRules(ctx context.Context, userID string) ([]*rules.Ru
569580
return nil, fmt.Errorf("unable to inject user ID into grpc request, %v", err)
570581
}
571582

572-
// len(rgs) can't be larger than len(rulers.Ingesters)
573-
// alloc it in advance to avoid realloc
574-
rgs := make([]*rules.RuleGroupDesc, 0, len(rulers.Ingesters))
583+
rgs := []*GroupStateDesc{}
575584

576585
for _, rlr := range rulers.Ingesters {
577586
conn, err := grpc.Dial(rlr.Addr, grpc.WithInsecure())

0 commit comments

Comments
 (0)