From 56e8e7cac3c2e37af5e7762e17e635245591e43b Mon Sep 17 00:00:00 2001 From: Matti Savolainen Date: Tue, 11 Oct 2016 21:01:22 +0300 Subject: [PATCH 1/4] Allow target_label to be expanded in replace label --- relabel/relabel.go | 9 +++- relabel/relabel_test.go | 92 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/relabel/relabel.go b/relabel/relabel.go index 0e5d616ca..69ec66e26 100644 --- a/relabel/relabel.go +++ b/relabel/relabel.go @@ -64,9 +64,14 @@ func relabel(labels model.LabelSet, cfg *config.RelabelConfig) model.LabelSet { res := cfg.Regex.ExpandString([]byte{}, cfg.Replacement, val, indexes) if len(res) == 0 { delete(labels, cfg.TargetLabel) - } else { - labels[cfg.TargetLabel] = model.LabelValue(res) + break } + target := cfg.Regex.ExpandString([]byte{}, string(cfg.TargetLabel), val, indexes) + if len(target) == 0 { + delete(labels, cfg.TargetLabel) + break + } + labels[model.LabelName(target)] = model.LabelValue(res) case config.RelabelHashMod: mod := sum64(md5.Sum([]byte(val))) % cfg.Modulus labels[cfg.TargetLabel] = model.LabelValue(fmt.Sprintf("%d", mod)) diff --git a/relabel/relabel_test.go b/relabel/relabel_test.go index 6773ffeb4..c4e4614fa 100644 --- a/relabel/relabel_test.go +++ b/relabel/relabel_test.go @@ -277,6 +277,98 @@ func TestRelabel(t *testing.T) { "my_baz": "bbb", }, }, + { // valid case + input: model.LabelSet{ + "a": "some-name-value", + }, + relabel: []*config.RelabelConfig{ + { + SourceLabels: model.LabelNames{"a"}, + Regex: config.MustNewRegexp("some-([^-]+)-([^,]+)"), + Action: config.RelabelReplace, + Replacement: "${2}", + TargetLabel: model.LabelName("${1}"), + }, + }, + output: model.LabelSet{ + "a": "some-name-value", + "name": "value", + }, + }, + { // invalid replacement "" + input: model.LabelSet{ + "a": "some-name-value", + }, + relabel: []*config.RelabelConfig{ + { + SourceLabels: model.LabelNames{"a"}, + Regex: config.MustNewRegexp("some-([^-]+)-([^,]+)"), + Action: config.RelabelReplace, + Replacement: "${3}", + TargetLabel: model.LabelName("${1}"), + }, + }, + output: model.LabelSet{ + "a": "some-name-value", + }, + }, + { // invalid target_label "" + input: model.LabelSet{ + "a": "some-name-value", + }, + relabel: []*config.RelabelConfig{ + { + SourceLabels: model.LabelNames{"a"}, + Regex: config.MustNewRegexp("some-([^-]+)-([^,]+)"), + Action: config.RelabelReplace, + Replacement: "${1}", + TargetLabel: model.LabelName("${3}"), + }, + }, + output: model.LabelSet{ + "a": "some-name-value", + }, + }, + { // more complex real-life like usecase + input: model.LabelSet{ + "__meta_sd_tags": "path:/secret,job:some-job,label:foo=bar", + }, + relabel: []*config.RelabelConfig{ + { + SourceLabels: model.LabelNames{"__meta_sd_tags"}, + Regex: config.MustNewRegexp(".*?(?:,|^)path:(/[^,]+).*"), + Action: config.RelabelReplace, + Replacement: "${1}", + TargetLabel: model.LabelName("__metrics_path__"), + }, + { + SourceLabels: model.LabelNames{"__meta_sd_tags"}, + Regex: config.MustNewRegexp(".*?(?:,|^)job:([^,]+).*"), + Action: config.RelabelReplace, + Replacement: "${1}", + TargetLabel: model.LabelName("job"), + }, + { + SourceLabels: model.LabelNames{"__meta_sd_tags"}, + Regex: config.MustNewRegexp(".*?(?:,|^)label:([^=]+)=([^,]+).*"), + Action: config.RelabelReplace, + Replacement: "${2}", + TargetLabel: model.LabelName("__meta_sd_add_label_${1}"), + }, + { + Regex: config.MustNewRegexp("__meta_sd_add_label_(.*)"), + Replacement: "${1}", + Action: config.RelabelLabelMap, + }, + }, + output: model.LabelSet{ + "__meta_sd_tags": "path:/secret,job:some-job,label:foo=bar", + "__metrics_path__": "/secret", + "job": "some-job", + "__meta_sd_add_label_foo": "bar", + "foo": "bar", + }, + }, } for i, test := range tests { From 8f77d271b15d4f8a9416181f1efd09e364f9cf52 Mon Sep 17 00:00:00 2001 From: Matti Savolainen Date: Tue, 11 Oct 2016 21:48:03 +0300 Subject: [PATCH 2/4] validate the label name --- relabel/relabel.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/relabel/relabel.go b/relabel/relabel.go index 69ec66e26..6ce37296c 100644 --- a/relabel/relabel.go +++ b/relabel/relabel.go @@ -61,17 +61,17 @@ func relabel(labels model.LabelSet, cfg *config.RelabelConfig) model.LabelSet { if indexes == nil { break } + target := model.LabelName(cfg.Regex.ExpandString([]byte{}, string(cfg.TargetLabel), val, indexes)) + if !target.IsValid() { + delete(labels, cfg.TargetLabel) + break + } res := cfg.Regex.ExpandString([]byte{}, cfg.Replacement, val, indexes) if len(res) == 0 { delete(labels, cfg.TargetLabel) break } - target := cfg.Regex.ExpandString([]byte{}, string(cfg.TargetLabel), val, indexes) - if len(target) == 0 { - delete(labels, cfg.TargetLabel) - break - } - labels[model.LabelName(target)] = model.LabelValue(res) + labels[target] = model.LabelValue(res) case config.RelabelHashMod: mod := sum64(md5.Sum([]byte(val))) % cfg.Modulus labels[cfg.TargetLabel] = model.LabelValue(fmt.Sprintf("%d", mod)) From 23be3dab53a1815e61ba00ba6d96f112901832b5 Mon Sep 17 00:00:00 2001 From: Matti Savolainen Date: Tue, 11 Oct 2016 21:54:33 +0300 Subject: [PATCH 3/4] test label name validation --- relabel/relabel_test.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/relabel/relabel_test.go b/relabel/relabel_test.go index c4e4614fa..76a7ff477 100644 --- a/relabel/relabel_test.go +++ b/relabel/relabel_test.go @@ -312,7 +312,7 @@ func TestRelabel(t *testing.T) { "a": "some-name-value", }, }, - { // invalid target_label "" + { // invalid target_labels input: model.LabelSet{ "a": "some-name-value", }, @@ -324,6 +324,20 @@ func TestRelabel(t *testing.T) { Replacement: "${1}", TargetLabel: model.LabelName("${3}"), }, + { + SourceLabels: model.LabelNames{"a"}, + Regex: config.MustNewRegexp("some-([^-]+)-([^,]+)"), + Action: config.RelabelReplace, + Replacement: "${1}", + TargetLabel: model.LabelName("0${3}"), + }, + { + SourceLabels: model.LabelNames{"a"}, + Regex: config.MustNewRegexp("some-([^-]+)-([^,]+)"), + Action: config.RelabelReplace, + Replacement: "${1}", + TargetLabel: model.LabelName("-${3}"), + }, }, output: model.LabelSet{ "a": "some-name-value", @@ -353,20 +367,14 @@ func TestRelabel(t *testing.T) { Regex: config.MustNewRegexp(".*?(?:,|^)label:([^=]+)=([^,]+).*"), Action: config.RelabelReplace, Replacement: "${2}", - TargetLabel: model.LabelName("__meta_sd_add_label_${1}"), - }, - { - Regex: config.MustNewRegexp("__meta_sd_add_label_(.*)"), - Replacement: "${1}", - Action: config.RelabelLabelMap, + TargetLabel: model.LabelName("${1}"), }, }, output: model.LabelSet{ "__meta_sd_tags": "path:/secret,job:some-job,label:foo=bar", "__metrics_path__": "/secret", "job": "some-job", - "__meta_sd_add_label_foo": "bar", - "foo": "bar", + "foo": "bar", }, }, } From bdaf0ec6a2210ac93e0addc7b67d524ce5e1c182 Mon Sep 17 00:00:00 2001 From: Matti Savolainen Date: Tue, 11 Oct 2016 22:00:14 +0300 Subject: [PATCH 4/4] simplify regex --- relabel/relabel_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/relabel/relabel_test.go b/relabel/relabel_test.go index 76a7ff477..4004fa96f 100644 --- a/relabel/relabel_test.go +++ b/relabel/relabel_test.go @@ -350,21 +350,21 @@ func TestRelabel(t *testing.T) { relabel: []*config.RelabelConfig{ { SourceLabels: model.LabelNames{"__meta_sd_tags"}, - Regex: config.MustNewRegexp(".*?(?:,|^)path:(/[^,]+).*"), + Regex: config.MustNewRegexp("(?:.+,|^)path:(/[^,]+).*"), Action: config.RelabelReplace, Replacement: "${1}", TargetLabel: model.LabelName("__metrics_path__"), }, { SourceLabels: model.LabelNames{"__meta_sd_tags"}, - Regex: config.MustNewRegexp(".*?(?:,|^)job:([^,]+).*"), + Regex: config.MustNewRegexp("(?:.+,|^)job:([^,]+).*"), Action: config.RelabelReplace, Replacement: "${1}", TargetLabel: model.LabelName("job"), }, { SourceLabels: model.LabelNames{"__meta_sd_tags"}, - Regex: config.MustNewRegexp(".*?(?:,|^)label:([^=]+)=([^,]+).*"), + Regex: config.MustNewRegexp("(?:.+,|^)label:([^=]+)=([^,]+).*"), Action: config.RelabelReplace, Replacement: "${2}", TargetLabel: model.LabelName("${1}"),