2020-02-23 12:35:47 +01:00
|
|
|
package promrelabel
|
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
2021-09-09 15:18:19 +02:00
|
|
|
|
|
|
|
"gopkg.in/yaml.v2"
|
2020-02-23 12:35:47 +01:00
|
|
|
)
|
|
|
|
|
2021-09-09 15:18:19 +02:00
|
|
|
func TestRelabelConfigMarshalUnmarshal(t *testing.T) {
|
|
|
|
f := func(data, resultExpected string) {
|
|
|
|
t.Helper()
|
|
|
|
var rcs []RelabelConfig
|
|
|
|
if err := yaml.UnmarshalStrict([]byte(data), &rcs); err != nil {
|
|
|
|
t.Fatalf("cannot unmarshal %q: %s", data, err)
|
|
|
|
}
|
|
|
|
result, err := yaml.Marshal(&rcs)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("cannot marshal %q: %s", data, err)
|
|
|
|
}
|
|
|
|
if string(result) != resultExpected {
|
|
|
|
t.Fatalf("unexpected marshaled data; got\n%q\nwant\n%q", result, resultExpected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f(``, "[]\n")
|
|
|
|
f(`
|
|
|
|
- action: keep
|
|
|
|
regex: foobar
|
|
|
|
`, "- regex:\n - foobar\n action: keep\n")
|
|
|
|
f(`
|
|
|
|
- regex:
|
|
|
|
- 'fo.+'
|
|
|
|
- '.*ba[r-z]a'
|
|
|
|
`, "- regex:\n - fo.+\n - .*ba[r-z]a\n")
|
|
|
|
f(`- regex: foo|bar`, "- regex:\n - foo\n - bar\n")
|
|
|
|
}
|
|
|
|
|
2020-02-23 12:35:47 +01:00
|
|
|
func TestLoadRelabelConfigsSuccess(t *testing.T) {
|
|
|
|
path := "testdata/relabel_configs_valid.yml"
|
2021-06-04 19:27:55 +02:00
|
|
|
pcs, err := LoadRelabelConfigs(path, false)
|
2020-02-23 12:35:47 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("cannot load relabel configs from %q: %s", path, err)
|
|
|
|
}
|
2021-09-09 15:18:19 +02:00
|
|
|
if n := pcs.Len(); n != 12 {
|
|
|
|
t.Fatalf("unexpected number of relabel configs loaded from %q; got %d; want %d", path, n, 12)
|
2020-02-23 12:35:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadRelabelConfigsFailure(t *testing.T) {
|
|
|
|
f := func(path string) {
|
|
|
|
t.Helper()
|
2021-06-04 19:27:55 +02:00
|
|
|
rcs, err := LoadRelabelConfigs(path, false)
|
2020-02-23 12:35:47 +01:00
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("expecting non-nil error")
|
|
|
|
}
|
2021-02-22 15:33:55 +01:00
|
|
|
if rcs.Len() != 0 {
|
2020-02-23 12:35:47 +01:00
|
|
|
t.Fatalf("unexpected non-empty rcs: %#v", rcs)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
t.Run("non-existing-file", func(t *testing.T) {
|
|
|
|
f("testdata/non-exsiting-file")
|
|
|
|
})
|
|
|
|
t.Run("invalid-file", func(t *testing.T) {
|
|
|
|
f("testdata/invalid_config.yml")
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseRelabelConfigsSuccess(t *testing.T) {
|
2021-02-22 15:33:55 +01:00
|
|
|
f := func(rcs []RelabelConfig, pcsExpected *ParsedConfigs) {
|
2020-02-23 12:35:47 +01:00
|
|
|
t.Helper()
|
2021-06-04 19:27:55 +02:00
|
|
|
pcs, err := ParseRelabelConfigs(rcs, false)
|
2020-02-23 12:35:47 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unexected error: %s", err)
|
|
|
|
}
|
2021-02-22 15:33:55 +01:00
|
|
|
if !reflect.DeepEqual(pcs, pcsExpected) {
|
|
|
|
t.Fatalf("unexpected pcs; got\n%#v\nwant\n%#v", pcs, pcsExpected)
|
2020-02-23 12:35:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
f(nil, nil)
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
SourceLabels: []string{"foo", "bar"},
|
|
|
|
TargetLabel: "xxx",
|
|
|
|
},
|
2021-02-22 15:33:55 +01:00
|
|
|
}, &ParsedConfigs{
|
|
|
|
prcs: []*parsedRelabelConfig{
|
|
|
|
{
|
|
|
|
SourceLabels: []string{"foo", "bar"},
|
|
|
|
Separator: ";",
|
|
|
|
TargetLabel: "xxx",
|
|
|
|
Regex: defaultRegexForRelabelConfig,
|
|
|
|
Replacement: "$1",
|
|
|
|
Action: "replace",
|
2020-06-19 01:20:29 +02:00
|
|
|
|
2021-02-22 15:33:55 +01:00
|
|
|
regexOriginal: defaultOriginalRegexForRelabelConfig,
|
|
|
|
hasCaptureGroupInReplacement: true,
|
|
|
|
},
|
2020-02-23 12:35:47 +01:00
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseRelabelConfigsFailure(t *testing.T) {
|
|
|
|
f := func(rcs []RelabelConfig) {
|
|
|
|
t.Helper()
|
2021-06-04 19:27:55 +02:00
|
|
|
pcs, err := ParseRelabelConfigs(rcs, false)
|
2020-02-23 12:35:47 +01:00
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("expecting non-nil error")
|
|
|
|
}
|
2021-02-22 15:33:55 +01:00
|
|
|
if pcs.Len() > 0 {
|
|
|
|
t.Fatalf("unexpected non-empty pcs: %#v", pcs)
|
2020-02-23 12:35:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
t.Run("invalid-regex", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
SourceLabels: []string{"aaa"},
|
|
|
|
TargetLabel: "xxx",
|
2021-09-09 15:18:19 +02:00
|
|
|
Regex: &MultiLineRegex{
|
|
|
|
s: "foo[bar",
|
|
|
|
},
|
2020-02-23 12:35:47 +01:00
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("replace-missing-target-label", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "replace",
|
|
|
|
SourceLabels: []string{"foo"},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("replace_all-missing-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "replace_all",
|
|
|
|
TargetLabel: "xxx",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("replace_all-missing-target-label", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "replace_all",
|
|
|
|
SourceLabels: []string{"foo"},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("keep-missing-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "keep",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
2020-06-23 16:17:58 +02:00
|
|
|
t.Run("keep_if_equal-missing-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "keep_if_equal",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("keep_if_equal-single-source-label", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "keep_if_equal",
|
|
|
|
SourceLabels: []string{"foo"},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("drop_if_equal-missing-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "drop_if_equal",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("drop_if_equal-single-source-label", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "drop_if_equal",
|
|
|
|
SourceLabels: []string{"foo"},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
2020-02-23 12:35:47 +01:00
|
|
|
t.Run("drop-missing-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "drop",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("hashmod-missing-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "hashmod",
|
|
|
|
TargetLabel: "aaa",
|
|
|
|
Modulus: 123,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("hashmod-missing-target-label", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "hashmod",
|
|
|
|
SourceLabels: []string{"aaa"},
|
|
|
|
Modulus: 123,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("hashmod-missing-modulus", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "hashmod",
|
|
|
|
SourceLabels: []string{"aaa"},
|
|
|
|
TargetLabel: "xxx",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("invalid-action", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "invalid-action",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
2021-09-09 15:18:19 +02:00
|
|
|
t.Run("drop_metrics-missing-regex", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "drop_metrics",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("drop_metrics-non-empty-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "drop_metrics",
|
|
|
|
SourceLabels: []string{"foo"},
|
|
|
|
Regex: &MultiLineRegex{
|
|
|
|
s: "bar",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("keep_metrics-missing-regex", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "keep_metrics",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
|
|
|
t.Run("keep_metrics-non-empty-source-labels", func(t *testing.T) {
|
|
|
|
f([]RelabelConfig{
|
|
|
|
{
|
|
|
|
Action: "keep_metrics",
|
|
|
|
SourceLabels: []string{"foo"},
|
|
|
|
Regex: &MultiLineRegex{
|
|
|
|
s: "bar",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
})
|
2020-02-23 12:35:47 +01:00
|
|
|
}
|