Add newer fields to Rules API

Signed-off-by: Goutham Veeramachaneni <gouthamve@gmail.com>
This commit is contained in:
Goutham Veeramachaneni 2021-04-11 12:17:26 +02:00
parent 17e98a7e4f
commit 629f64ab3f
No known key found for this signature in database
GPG Key ID: F1C217E8E9023CAD
2 changed files with 146 additions and 26 deletions

View File

@ -352,6 +352,9 @@ type AlertingRule struct {
Alerts []*Alert `json:"alerts"` Alerts []*Alert `json:"alerts"`
Health RuleHealth `json:"health"` Health RuleHealth `json:"health"`
LastError string `json:"lastError,omitempty"` LastError string `json:"lastError,omitempty"`
EvaluationTime float64 `json:"evaluationTime"`
LastEvaluation time.Time `json:"lastEvaluation"`
State string `json:"state"`
} }
// RecordingRule models a recording rule. // RecordingRule models a recording rule.
@ -361,6 +364,8 @@ type RecordingRule struct {
Labels model.LabelSet `json:"labels,omitempty"` Labels model.LabelSet `json:"labels,omitempty"`
Health RuleHealth `json:"health"` Health RuleHealth `json:"health"`
LastError string `json:"lastError,omitempty"` LastError string `json:"lastError,omitempty"`
EvaluationTime float64 `json:"evaluationTime"`
LastEvaluation time.Time `json:"lastEvaluation"`
} }
// Alert models an active alert. // Alert models an active alert.
@ -488,6 +493,9 @@ func (r *AlertingRule) UnmarshalJSON(b []byte) error {
Alerts []*Alert `json:"alerts"` Alerts []*Alert `json:"alerts"`
Health RuleHealth `json:"health"` Health RuleHealth `json:"health"`
LastError string `json:"lastError,omitempty"` LastError string `json:"lastError,omitempty"`
EvaluationTime float64 `json:"evaluationTime"`
LastEvaluation time.Time `json:"lastEvaluation"`
State string `json:"state"`
}{} }{}
if err := json.Unmarshal(b, &rule); err != nil { if err := json.Unmarshal(b, &rule); err != nil {
return err return err
@ -500,6 +508,9 @@ func (r *AlertingRule) UnmarshalJSON(b []byte) error {
r.Duration = rule.Duration r.Duration = rule.Duration
r.Labels = rule.Labels r.Labels = rule.Labels
r.LastError = rule.LastError r.LastError = rule.LastError
r.EvaluationTime = rule.EvaluationTime
r.LastEvaluation = rule.LastEvaluation
r.State = rule.State
return nil return nil
} }
@ -524,6 +535,8 @@ func (r *RecordingRule) UnmarshalJSON(b []byte) error {
Labels model.LabelSet `json:"labels,omitempty"` Labels model.LabelSet `json:"labels,omitempty"`
Health RuleHealth `json:"health"` Health RuleHealth `json:"health"`
LastError string `json:"lastError,omitempty"` LastError string `json:"lastError,omitempty"`
EvaluationTime float64 `json:"evaluationTime"`
LastEvaluation time.Time `json:"lastEvaluation"`
}{} }{}
if err := json.Unmarshal(b, &rule); err != nil { if err := json.Unmarshal(b, &rule); err != nil {
return err return err
@ -533,6 +546,8 @@ func (r *RecordingRule) UnmarshalJSON(b []byte) error {
r.Name = rule.Name r.Name = rule.Name
r.LastError = rule.LastError r.LastError = rule.LastError
r.Query = rule.Query r.Query = rule.Query
r.EvaluationTime = rule.EvaluationTime
r.LastEvaluation = rule.LastEvaluation
return nil return nil
} }

View File

@ -846,6 +846,111 @@ func TestAPIs(t *testing.T) {
}, },
}, },
// This has the newer API elements like lastEvaluation, evaluationTime, etc.
{
do: doRules(),
reqMethod: "GET",
reqPath: "/api/v1/rules",
inRes: map[string]interface{}{
"groups": []map[string]interface{}{
{
"file": "/rules.yaml",
"interval": 60,
"name": "example",
"rules": []map[string]interface{}{
{
"alerts": []map[string]interface{}{
{
"activeAt": testTime.UTC().Format(time.RFC3339Nano),
"annotations": map[string]interface{}{
"summary": "High request latency",
},
"labels": map[string]interface{}{
"alertname": "HighRequestLatency",
"severity": "page",
},
"state": "firing",
"value": "1e+00",
},
},
"annotations": map[string]interface{}{
"summary": "High request latency",
},
"duration": 600,
"health": "ok",
"labels": map[string]interface{}{
"severity": "page",
},
"name": "HighRequestLatency",
"query": "job:request_latency_seconds:mean5m{job=\"myjob\"} > 0.5",
"type": "alerting",
"evaluationTime": 0.5,
"lastEvaluation": "2020-05-18T15:52:53.4503113Z",
"state": "firing",
},
{
"health": "ok",
"name": "job:http_inprogress_requests:sum",
"query": "sum(http_inprogress_requests) by (job)",
"type": "recording",
"evaluationTime": 0.3,
"lastEvaluation": "2020-05-18T15:52:53.4503113Z",
},
},
},
},
},
res: RulesResult{
Groups: []RuleGroup{
{
Name: "example",
File: "/rules.yaml",
Interval: 60,
Rules: []interface{}{
AlertingRule{
Alerts: []*Alert{
{
ActiveAt: testTime.UTC(),
Annotations: model.LabelSet{
"summary": "High request latency",
},
Labels: model.LabelSet{
"alertname": "HighRequestLatency",
"severity": "page",
},
State: AlertStateFiring,
Value: "1e+00",
},
},
Annotations: model.LabelSet{
"summary": "High request latency",
},
Labels: model.LabelSet{
"severity": "page",
},
Duration: 600,
Health: RuleHealthGood,
Name: "HighRequestLatency",
Query: "job:request_latency_seconds:mean5m{job=\"myjob\"} > 0.5",
LastError: "",
EvaluationTime: 0.5,
LastEvaluation: time.Date(2020, 5, 18, 15, 52, 53, 450311300, time.UTC),
State: "firing",
},
RecordingRule{
Health: RuleHealthGood,
Name: "job:http_inprogress_requests:sum",
Query: "sum(http_inprogress_requests) by (job)",
LastError: "",
EvaluationTime: 0.3,
LastEvaluation: time.Date(2020, 5, 18, 15, 52, 53, 450311300, time.UTC),
},
},
},
},
},
},
{ {
do: doRules(), do: doRules(),
reqMethod: "GET", reqMethod: "GET",