mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-24 21:24:05 -08:00
Merge pull request #15090 from roidelapluie/querylogrule
Fix flakiness of QueryLogTest
This commit is contained in:
commit
297667469a
|
@ -125,12 +125,61 @@ func (p *queryLogTest) query(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Equal(t, 200, r.StatusCode)
|
||||
case ruleOrigin:
|
||||
time.Sleep(2 * time.Second)
|
||||
// Poll the /api/v1/rules endpoint until a new rule evaluation is detected.
|
||||
var lastEvalTime time.Time
|
||||
for {
|
||||
r, err := http.Get(fmt.Sprintf("http://%s:%d/api/v1/rules", p.host, p.port))
|
||||
require.NoError(t, err)
|
||||
|
||||
rulesBody, err := io.ReadAll(r.Body)
|
||||
require.NoError(t, err)
|
||||
defer r.Body.Close()
|
||||
|
||||
// Parse the rules response to find the last evaluation time.
|
||||
newEvalTime := parseLastEvaluation(rulesBody)
|
||||
if newEvalTime.After(lastEvalTime) {
|
||||
if !lastEvalTime.IsZero() {
|
||||
break
|
||||
}
|
||||
lastEvalTime = newEvalTime
|
||||
}
|
||||
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
}
|
||||
default:
|
||||
panic("can't query this origin")
|
||||
}
|
||||
}
|
||||
|
||||
// parseLastEvaluation extracts the last evaluation timestamp from the /api/v1/rules response.
|
||||
func parseLastEvaluation(rulesBody []byte) time.Time {
|
||||
var ruleResponse struct {
|
||||
Status string `json:"status"`
|
||||
Data struct {
|
||||
Groups []struct {
|
||||
Rules []struct {
|
||||
LastEvaluation string `json:"lastEvaluation"`
|
||||
} `json:"rules"`
|
||||
} `json:"groups"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
err := json.Unmarshal(rulesBody, &ruleResponse)
|
||||
if err != nil {
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
for _, group := range ruleResponse.Data.Groups {
|
||||
for _, rule := range group.Rules {
|
||||
if evalTime, err := time.Parse(time.RFC3339Nano, rule.LastEvaluation); err == nil {
|
||||
return evalTime
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
// queryString returns the expected queryString of a this test.
|
||||
func (p *queryLogTest) queryString() string {
|
||||
switch p.origin {
|
||||
|
@ -322,7 +371,7 @@ func (p *queryLogTest) run(t *testing.T) {
|
|||
if p.exactQueryCount() {
|
||||
require.Len(t, ql, qc)
|
||||
} else {
|
||||
require.Greater(t, len(ql), qc, "no queries logged")
|
||||
require.GreaterOrEqual(t, len(ql), qc, "no queries logged")
|
||||
}
|
||||
p.validateLastQuery(t, ql)
|
||||
qc = len(ql)
|
||||
|
@ -353,7 +402,7 @@ func (p *queryLogTest) run(t *testing.T) {
|
|||
if p.exactQueryCount() {
|
||||
require.Len(t, ql, qc)
|
||||
} else {
|
||||
require.Greater(t, len(ql), qc, "no queries logged")
|
||||
require.GreaterOrEqual(t, len(ql), qc, "no queries logged")
|
||||
}
|
||||
p.validateLastQuery(t, ql)
|
||||
|
||||
|
|
Loading…
Reference in a new issue