mirror of https://github.com/prometheus/prometheus
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
6.1 KiB
278 lines
6.1 KiB
// Copyright 2015 The Prometheus Authors |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// http://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
|
|
package retrieval |
|
|
|
import ( |
|
"reflect" |
|
"testing" |
|
|
|
"github.com/prometheus/common/model" |
|
|
|
"github.com/prometheus/prometheus/config" |
|
) |
|
|
|
func TestRelabel(t *testing.T) { |
|
tests := []struct { |
|
input model.LabelSet |
|
relabel []*config.RelabelConfig |
|
output model.LabelSet |
|
}{ |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
"b": "bar", |
|
"c": "baz", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp("f(.*)"), |
|
TargetLabel: model.LabelName("d"), |
|
Separator: ";", |
|
Replacement: "ch${1}-ch${1}", |
|
Action: config.RelabelReplace, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "foo", |
|
"b": "bar", |
|
"c": "baz", |
|
"d": "choo-choo", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
"b": "bar", |
|
"c": "baz", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a", "b"}, |
|
Regex: config.MustNewRegexp("f(.*);(.*)r"), |
|
TargetLabel: model.LabelName("a"), |
|
Separator: ";", |
|
Replacement: "b${1}${2}m", // boobam |
|
Action: config.RelabelReplace, |
|
}, |
|
{ |
|
SourceLabels: model.LabelNames{"c", "a"}, |
|
Regex: config.MustNewRegexp("(b).*b(.*)ba(.*)"), |
|
TargetLabel: model.LabelName("d"), |
|
Separator: ";", |
|
Replacement: "$1$2$2$3", |
|
Action: config.RelabelReplace, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "boobam", |
|
"b": "bar", |
|
"c": "baz", |
|
"d": "boooom", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp(".*o.*"), |
|
Action: config.RelabelDrop, |
|
}, { |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp("f(.*)"), |
|
TargetLabel: model.LabelName("d"), |
|
Separator: ";", |
|
Replacement: "ch$1-ch$1", |
|
Action: config.RelabelReplace, |
|
}, |
|
}, |
|
output: nil, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "abc", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp(".*(b).*"), |
|
TargetLabel: model.LabelName("d"), |
|
Separator: ";", |
|
Replacement: "$1", |
|
Action: config.RelabelReplace, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "abc", |
|
"d": "b", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp("no-match"), |
|
Action: config.RelabelDrop, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp("f|o"), |
|
Action: config.RelabelDrop, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp("no-match"), |
|
Action: config.RelabelKeep, |
|
}, |
|
}, |
|
output: nil, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp("f.*"), |
|
Action: config.RelabelKeep, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "foo", |
|
}, |
|
}, |
|
{ |
|
// No replacement must be applied if there is no match. |
|
input: model.LabelSet{ |
|
"a": "boo", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"a"}, |
|
Regex: config.MustNewRegexp("f"), |
|
TargetLabel: model.LabelName("b"), |
|
Replacement: "bar", |
|
Action: config.RelabelReplace, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "boo", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
"b": "bar", |
|
"c": "baz", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
SourceLabels: model.LabelNames{"c"}, |
|
TargetLabel: model.LabelName("d"), |
|
Separator: ";", |
|
Action: config.RelabelHashMod, |
|
Modulus: 1000, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "foo", |
|
"b": "bar", |
|
"c": "baz", |
|
"d": "976", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
"b1": "bar", |
|
"b2": "baz", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
Regex: config.MustNewRegexp("(b.*)"), |
|
Replacement: "bar_${1}", |
|
Action: config.RelabelLabelMap, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "foo", |
|
"b1": "bar", |
|
"b2": "baz", |
|
"bar_b1": "bar", |
|
"bar_b2": "baz", |
|
}, |
|
}, |
|
{ |
|
input: model.LabelSet{ |
|
"a": "foo", |
|
"__meta_my_bar": "aaa", |
|
"__meta_my_baz": "bbb", |
|
"__meta_other": "ccc", |
|
}, |
|
relabel: []*config.RelabelConfig{ |
|
{ |
|
Regex: config.MustNewRegexp("__meta_(my.*)"), |
|
Replacement: "${1}", |
|
Action: config.RelabelLabelMap, |
|
}, |
|
}, |
|
output: model.LabelSet{ |
|
"a": "foo", |
|
"__meta_my_bar": "aaa", |
|
"__meta_my_baz": "bbb", |
|
"__meta_other": "ccc", |
|
"my_bar": "aaa", |
|
"my_baz": "bbb", |
|
}, |
|
}, |
|
} |
|
|
|
for i, test := range tests { |
|
res, err := Relabel(test.input, test.relabel...) |
|
if err != nil { |
|
t.Errorf("Test %d: error relabeling: %s", i+1, err) |
|
} |
|
|
|
if !reflect.DeepEqual(res, test.output) { |
|
t.Errorf("Test %d: relabel output mismatch: expected %#v, got %#v", i+1, test.output, res) |
|
} |
|
} |
|
}
|
|
|