mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-03-11 15:34:56 +00:00
lib/promrelabel: fix parsing regex: true
in relabeling rules
This commit is contained in:
parent
aa052097cf
commit
c3e1f87048
3 changed files with 47 additions and 11 deletions
|
@ -7,6 +7,7 @@ sort: 15
|
||||||
## tip
|
## tip
|
||||||
|
|
||||||
* BUGFIX: vmselect: fix accessing [Graphite APIs](https://docs.victoriametrics.com/#graphite-api-usage). The access has been broken in v1.66.0, because `/graphite/*` path prefix accidentally clashed with `/graph*` path prefix used for VictoriaMetrics UI (aka `vmui`).
|
* BUGFIX: vmselect: fix accessing [Graphite APIs](https://docs.victoriametrics.com/#graphite-api-usage). The access has been broken in v1.66.0, because `/graphite/*` path prefix accidentally clashed with `/graph*` path prefix used for VictoriaMetrics UI (aka `vmui`).
|
||||||
|
* BUGFIX: fix parsing `regex: <bool_or_number>` in relabeling rules (for example, `regex: true` or `regex: 123`). The bug has been introduced in v1.66.0.
|
||||||
|
|
||||||
|
|
||||||
## [v1.66.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.66.0)
|
## [v1.66.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.66.0)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/envtemplate"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/envtemplate"
|
||||||
|
@ -45,29 +46,51 @@ func (mlr *MultiLineRegex) UnmarshalYAML(f func(interface{}) error) error {
|
||||||
if err := f(&v); err != nil {
|
if err := f(&v); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var a []string
|
s, err := stringValue(v)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
mlr.s = s
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func stringValue(v interface{}) (string, error) {
|
||||||
|
if v == nil {
|
||||||
|
return "null", nil
|
||||||
|
}
|
||||||
switch x := v.(type) {
|
switch x := v.(type) {
|
||||||
case string:
|
|
||||||
a = []string{x}
|
|
||||||
case []interface{}:
|
case []interface{}:
|
||||||
a = make([]string, len(x))
|
a := make([]string, len(x))
|
||||||
for i, xx := range x {
|
for i, xx := range x {
|
||||||
s, ok := xx.(string)
|
s, err := stringValue(xx)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return fmt.Errorf("`regex` must contain array of strings; got %T", xx)
|
return "", err
|
||||||
}
|
}
|
||||||
a[i] = s
|
a[i] = s
|
||||||
}
|
}
|
||||||
|
return strings.Join(a, "|"), nil
|
||||||
|
case string:
|
||||||
|
return x, nil
|
||||||
|
case float64:
|
||||||
|
return strconv.FormatFloat(x, 'f', -1, 64), nil
|
||||||
|
case int:
|
||||||
|
return strconv.Itoa(x), nil
|
||||||
|
case bool:
|
||||||
|
if x {
|
||||||
|
return "true", nil
|
||||||
|
}
|
||||||
|
return "false", nil
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unexpected type for `regex`: %T; want string or []string", v)
|
return "", fmt.Errorf("unexpected type for `regex`: %T; want string or []string", v)
|
||||||
}
|
}
|
||||||
mlr.s = strings.Join(a, "|")
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalYAML marshals mlr to YAML.
|
// MarshalYAML marshals mlr to YAML.
|
||||||
func (mlr *MultiLineRegex) MarshalYAML() (interface{}, error) {
|
func (mlr *MultiLineRegex) MarshalYAML() (interface{}, error) {
|
||||||
a := strings.Split(mlr.s, "|")
|
a := strings.Split(mlr.s, "|")
|
||||||
|
if len(a) == 1 {
|
||||||
|
return a[0], nil
|
||||||
|
}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,13 +26,25 @@ func TestRelabelConfigMarshalUnmarshal(t *testing.T) {
|
||||||
f(`
|
f(`
|
||||||
- action: keep
|
- action: keep
|
||||||
regex: foobar
|
regex: foobar
|
||||||
`, "- regex:\n - foobar\n action: keep\n")
|
`, "- regex: foobar\n action: keep\n")
|
||||||
f(`
|
f(`
|
||||||
- regex:
|
- regex:
|
||||||
- 'fo.+'
|
- 'fo.+'
|
||||||
- '.*ba[r-z]a'
|
- '.*ba[r-z]a'
|
||||||
`, "- regex:\n - fo.+\n - .*ba[r-z]a\n")
|
`, "- regex:\n - fo.+\n - .*ba[r-z]a\n")
|
||||||
f(`- regex: foo|bar`, "- regex:\n - foo\n - bar\n")
|
f(`- regex: foo|bar`, "- regex:\n - foo\n - bar\n")
|
||||||
|
f(`- regex: True`, `- regex: "true"`+"\n")
|
||||||
|
f(`- regex: true`, `- regex: "true"`+"\n")
|
||||||
|
f(`- regex: 123`, `- regex: "123"`+"\n")
|
||||||
|
f(`- regex: 1.23`, `- regex: "1.23"`+"\n")
|
||||||
|
f(`- regex: [null]`, `- regex: "null"`+"\n")
|
||||||
|
f(`
|
||||||
|
- regex:
|
||||||
|
- -1.23
|
||||||
|
- False
|
||||||
|
- null
|
||||||
|
- nan
|
||||||
|
`, "- regex:\n - \"-1.23\"\n - \"false\"\n - \"null\"\n - nan\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLoadRelabelConfigsSuccess(t *testing.T) {
|
func TestLoadRelabelConfigsSuccess(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue