diff --git a/app/vmalert/config/config.go b/app/vmalert/config/config.go index 4f0dec6099..2e26127076 100644 --- a/app/vmalert/config/config.go +++ b/app/vmalert/config/config.go @@ -46,8 +46,6 @@ type Group struct { XXX map[string]interface{} `yaml:",inline"` } -const extraLabelParam = "extra_label" - // UnmarshalYAML implements the yaml.Unmarshaler interface. func (g *Group) UnmarshalYAML(unmarshal func(interface{}) error) error { type group Group @@ -68,8 +66,14 @@ func (g *Group) UnmarshalYAML(unmarshal func(interface{}) error) error { if g.Params == nil { g.Params = url.Values{} } + // Sort extraFilters for consistent order for query args across runs. + extraFilters := make([]string, 0, len(g.ExtraFilterLabels)) for k, v := range g.ExtraFilterLabels { - g.Params.Add(extraLabelParam, fmt.Sprintf("%s=%s", k, v)) + extraFilters = append(extraFilters, fmt.Sprintf("%s=%s", k, v)) + } + sort.Strings(extraFilters) + for _, extraFilter := range extraFilters { + g.Params.Add("extra_label", extraFilter) } } diff --git a/app/vmalert/config/config_test.go b/app/vmalert/config/config_test.go index 626baa75b7..0d685f5a11 100644 --- a/app/vmalert/config/config_test.go +++ b/app/vmalert/config/config_test.go @@ -538,7 +538,7 @@ extra_filter_labels: rules: - alert: ExampleAlertAlwaysFiring expr: sum by(job) (up == 1) -`, url.Values{extraLabelParam: {"job=victoriametrics", "env=prod"}}) +`, url.Values{"extra_label": {"env=prod", "job=victoriametrics"}}) }) t.Run("extra labels and params", func(t *testing.T) { @@ -552,6 +552,6 @@ params: rules: - alert: ExampleAlertAlwaysFiring expr: sum by(job) (up == 1) -`, url.Values{"nocache": {"1"}, extraLabelParam: {"env=prod", "job=victoriametrics"}}) +`, url.Values{"nocache": {"1"}, "extra_label": {"env=prod", "job=victoriametrics"}}) }) }