rules: replace error strings with sentinel errors for duplicate labelsets (#17620)

Signed-off-by: Nikos Angelopoulos <nikolaos.angelopoulos@grafana.com>
pull/16719/merge
Nikos Angelopoulos 1 month ago committed by GitHub
parent 96d3d641e3
commit b0649e08c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 6
      rules/alerting.go
  2. 2
      rules/alerting_test.go
  3. 6
      rules/recording.go
  4. 2
      rules/recording_test.go

@ -46,6 +46,10 @@ const (
alertStateLabel = "alertstate"
)
// ErrDuplicateAlertLabelSet is returned when an alerting rule evaluation produces
// metrics with identical labelsets after applying alert labels.
var ErrDuplicateAlertLabelSet = errors.New("vector contains metrics with the same labelset after applying alert labels")
// AlertState denotes the state of an active alert.
type AlertState int
@ -441,7 +445,7 @@ func (r *AlertingRule) Eval(ctx context.Context, queryOffset time.Duration, ts t
resultFPs[h] = struct{}{}
if _, ok := alerts[h]; ok {
return nil, errors.New("vector contains metrics with the same labelset after applying alert labels")
return nil, ErrDuplicateAlertLabelSet
}
alerts[h] = &Alert{

@ -612,7 +612,7 @@ func TestAlertingRuleDuplicate(t *testing.T) {
)
_, err := rule.Eval(ctx, 0, now, EngineQueryFunc(engine, storage), nil, 0)
require.Error(t, err)
require.EqualError(t, err, "vector contains metrics with the same labelset after applying alert labels")
require.ErrorIs(t, err, ErrDuplicateAlertLabelSet)
}
func TestAlertingRuleLimit(t *testing.T) {

@ -30,6 +30,10 @@ import (
"github.com/prometheus/prometheus/promql/parser"
)
// ErrDuplicateRecordingLabelSet is returned when a recording rule evaluation produces
// metrics with identical labelsets after applying rule labels.
var ErrDuplicateRecordingLabelSet = errors.New("vector contains metrics with the same labelset after applying rule labels")
// A RecordingRule records its vector expression into new timeseries.
type RecordingRule struct {
name string
@ -104,7 +108,7 @@ func (rule *RecordingRule) Eval(ctx context.Context, queryOffset time.Duration,
// Check that the rule does not produce identical metrics after applying
// labels.
if vector.ContainsSameLabelset() {
return nil, errors.New("vector contains metrics with the same labelset after applying rule labels")
return nil, ErrDuplicateRecordingLabelSet
}
numSeries := len(vector)

@ -176,7 +176,7 @@ func TestRuleEvalDuplicate(t *testing.T) {
rule := NewRecordingRule("foo", expr, labels.FromStrings("test", "test"))
_, err := rule.Eval(ctx, 0, now, EngineQueryFunc(engine, storage), nil, 0)
require.Error(t, err)
require.EqualError(t, err, "vector contains metrics with the same labelset after applying rule labels")
require.ErrorIs(t, err, ErrDuplicateRecordingLabelSet)
}
func TestRecordingRuleLimit(t *testing.T) {

Loading…
Cancel
Save