Merge pull request #1044 from prometheus/config-anchored-regexes

Change config regexes to full-string matches.
This commit is contained in:
Julius Volz 2015-09-01 17:14:23 +02:00
commit 4c90168130
6 changed files with 67 additions and 33 deletions

View file

@ -723,6 +723,29 @@ func (c *RelabelConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
// Regexp encapsulates a regexp.Regexp and makes it YAML marshallable. // Regexp encapsulates a regexp.Regexp and makes it YAML marshallable.
type Regexp struct { type Regexp struct {
regexp.Regexp regexp.Regexp
original string
}
// NewRegexp creates a new anchored Regexp and returns an error if the
// passed-in regular expression does not compile.
func NewRegexp(s string) (*Regexp, error) {
regex, err := regexp.Compile("^(?:" + s + ")$")
if err != nil {
return nil, err
}
return &Regexp{
Regexp: *regex,
original: s,
}, nil
}
// MustNewRegexp works like NewRegexp, but panics if the regular expression does not compile.
func MustNewRegexp(s string) *Regexp {
re, err := NewRegexp(s)
if err != nil {
panic(err)
}
return re
} }
// UnmarshalYAML implements the yaml.Unmarshaler interface. // UnmarshalYAML implements the yaml.Unmarshaler interface.
@ -731,18 +754,18 @@ func (re *Regexp) UnmarshalYAML(unmarshal func(interface{}) error) error {
if err := unmarshal(&s); err != nil { if err := unmarshal(&s); err != nil {
return err return err
} }
regex, err := regexp.Compile(s) r, err := NewRegexp(s)
if err != nil { if err != nil {
return err return err
} }
re.Regexp = *regex *re = *r
return nil return nil
} }
// MarshalYAML implements the yaml.Marshaler interface. // MarshalYAML implements the yaml.Marshaler interface.
func (re *Regexp) MarshalYAML() (interface{}, error) { func (re *Regexp) MarshalYAML() (interface{}, error) {
if re != nil { if re != nil {
return re.String(), nil return re.original, nil
} }
return nil, nil return nil, nil
} }

View file

@ -17,7 +17,6 @@ import (
"encoding/json" "encoding/json"
"io/ioutil" "io/ioutil"
"reflect" "reflect"
"regexp"
"strings" "strings"
"testing" "testing"
"time" "time"
@ -86,7 +85,7 @@ var expectedConf = &Config{
SourceLabels: model.LabelNames{"job", "__meta_dns_srv_name"}, SourceLabels: model.LabelNames{"job", "__meta_dns_srv_name"},
TargetLabel: "job", TargetLabel: "job",
Separator: ";", Separator: ";",
Regex: &Regexp{*regexp.MustCompile("(.*)some-[regex]$")}, Regex: MustNewRegexp("(.*)some-[regex]"),
Replacement: "foo-${1}", Replacement: "foo-${1}",
Action: RelabelReplace, Action: RelabelReplace,
}, },
@ -126,7 +125,7 @@ var expectedConf = &Config{
RelabelConfigs: []*RelabelConfig{ RelabelConfigs: []*RelabelConfig{
{ {
SourceLabels: model.LabelNames{"job"}, SourceLabels: model.LabelNames{"job"},
Regex: &Regexp{*regexp.MustCompile("(.*)some-[regex]$")}, Regex: MustNewRegexp("(.*)some-[regex]"),
Separator: ";", Separator: ";",
Action: RelabelDrop, Action: RelabelDrop,
}, },
@ -139,7 +138,7 @@ var expectedConf = &Config{
}, },
{ {
SourceLabels: model.LabelNames{"__tmp_hash"}, SourceLabels: model.LabelNames{"__tmp_hash"},
Regex: &Regexp{*regexp.MustCompile("^1$")}, Regex: MustNewRegexp("1"),
Separator: ";", Separator: ";",
Action: RelabelKeep, Action: RelabelKeep,
}, },
@ -147,7 +146,7 @@ var expectedConf = &Config{
MetricRelabelConfigs: []*RelabelConfig{ MetricRelabelConfigs: []*RelabelConfig{
{ {
SourceLabels: model.LabelNames{"__name__"}, SourceLabels: model.LabelNames{"__name__"},
Regex: &Regexp{*regexp.MustCompile("expensive_metric.*$")}, Regex: MustNewRegexp("expensive_metric.*"),
Separator: ";", Separator: ";",
Action: RelabelDrop, Action: RelabelDrop,
}, },

View file

@ -40,7 +40,7 @@ scrape_configs:
relabel_configs: relabel_configs:
- source_labels: [job, __meta_dns_srv_name] - source_labels: [job, __meta_dns_srv_name]
regex: (.*)some-[regex]$ regex: (.*)some-[regex]
target_label: job target_label: job
replacement: foo-${1} replacement: foo-${1}
# action defaults to 'replace' # action defaults to 'replace'
@ -71,19 +71,19 @@ scrape_configs:
relabel_configs: relabel_configs:
- source_labels: [job] - source_labels: [job]
regex: (.*)some-[regex]$ regex: (.*)some-[regex]
action: drop action: drop
- source_labels: [__address__] - source_labels: [__address__]
modulus: 8 modulus: 8
target_label: __tmp_hash target_label: __tmp_hash
action: hashmod action: hashmod
- source_labels: [__tmp_hash] - source_labels: [__tmp_hash]
regex: ^1$ regex: 1
action: keep action: keep
metric_relabel_configs: metric_relabel_configs:
- source_labels: [__name__] - source_labels: [__name__]
regex: expensive_metric.*$ regex: expensive_metric.*
action: drop action: drop
- job_name: service-y - job_name: service-y

View file

@ -15,7 +15,6 @@ package retrieval
import ( import (
"reflect" "reflect"
"regexp"
"testing" "testing"
"github.com/prometheus/common/model" "github.com/prometheus/common/model"
@ -38,7 +37,7 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("f(.*)")}, Regex: config.MustNewRegexp("f(.*)"),
TargetLabel: model.LabelName("d"), TargetLabel: model.LabelName("d"),
Separator: ";", Separator: ";",
Replacement: "ch${1}-ch${1}", Replacement: "ch${1}-ch${1}",
@ -61,7 +60,7 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a", "b"}, SourceLabels: model.LabelNames{"a", "b"},
Regex: &config.Regexp{*regexp.MustCompile("^f(.*);(.*)r$")}, Regex: config.MustNewRegexp("f(.*);(.*)r"),
TargetLabel: model.LabelName("a"), TargetLabel: model.LabelName("a"),
Separator: ";", Separator: ";",
Replacement: "b${1}${2}m", // boobam Replacement: "b${1}${2}m", // boobam
@ -69,7 +68,7 @@ func TestRelabel(t *testing.T) {
}, },
{ {
SourceLabels: model.LabelNames{"c", "a"}, SourceLabels: model.LabelNames{"c", "a"},
Regex: &config.Regexp{*regexp.MustCompile("(b).*b(.*)ba(.*)")}, Regex: config.MustNewRegexp("(b).*b(.*)ba(.*)"),
TargetLabel: model.LabelName("d"), TargetLabel: model.LabelName("d"),
Separator: ";", Separator: ";",
Replacement: "$1$2$2$3", Replacement: "$1$2$2$3",
@ -90,11 +89,11 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("o$")}, Regex: config.MustNewRegexp(".*o.*"),
Action: config.RelabelDrop, Action: config.RelabelDrop,
}, { }, {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("f(.*)")}, Regex: config.MustNewRegexp("f(.*)"),
TargetLabel: model.LabelName("d"), TargetLabel: model.LabelName("d"),
Separator: ";", Separator: ";",
Replacement: "ch$1-ch$1", Replacement: "ch$1-ch$1",
@ -110,7 +109,7 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("(b)")}, Regex: config.MustNewRegexp(".*(b).*"),
TargetLabel: model.LabelName("d"), TargetLabel: model.LabelName("d"),
Separator: ";", Separator: ";",
Replacement: "$1", Replacement: "$1",
@ -129,7 +128,7 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("no-match")}, Regex: config.MustNewRegexp("no-match"),
Action: config.RelabelDrop, Action: config.RelabelDrop,
}, },
}, },
@ -144,7 +143,22 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("no-match")}, 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, Action: config.RelabelKeep,
}, },
}, },
@ -157,7 +171,7 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("^f")}, Regex: config.MustNewRegexp("f.*"),
Action: config.RelabelKeep, Action: config.RelabelKeep,
}, },
}, },
@ -173,7 +187,7 @@ func TestRelabel(t *testing.T) {
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"a"}, SourceLabels: model.LabelNames{"a"},
Regex: &config.Regexp{*regexp.MustCompile("^f")}, Regex: config.MustNewRegexp("f"),
TargetLabel: model.LabelName("b"), TargetLabel: model.LabelName("b"),
Replacement: "bar", Replacement: "bar",
Action: config.RelabelReplace, Action: config.RelabelReplace,
@ -213,7 +227,7 @@ func TestRelabel(t *testing.T) {
}, },
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
Regex: &config.Regexp{*regexp.MustCompile("^(b.*)")}, Regex: config.MustNewRegexp("(b.*)"),
Replacement: "bar_${1}", Replacement: "bar_${1}",
Action: config.RelabelLabelMap, Action: config.RelabelLabelMap,
}, },
@ -235,7 +249,7 @@ func TestRelabel(t *testing.T) {
}, },
relabel: []*config.RelabelConfig{ relabel: []*config.RelabelConfig{
{ {
Regex: &config.Regexp{*regexp.MustCompile("^__meta_(my.*)")}, Regex: config.MustNewRegexp("__meta_(my.*)"),
Replacement: "${1}", Replacement: "${1}",
Action: config.RelabelLabelMap, Action: config.RelabelLabelMap,
}, },

View file

@ -23,7 +23,6 @@ import (
"net/http/httptest" "net/http/httptest"
"net/url" "net/url"
"reflect" "reflect"
"regexp"
"strings" "strings"
"testing" "testing"
"time" "time"
@ -181,12 +180,12 @@ func TestTargetScrapeMetricRelabelConfigs(t *testing.T) {
testTarget.metricRelabelConfigs = []*config.RelabelConfig{ testTarget.metricRelabelConfigs = []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{"__name__"}, SourceLabels: model.LabelNames{"__name__"},
Regex: &config.Regexp{*regexp.MustCompile(".*drop.*")}, Regex: config.MustNewRegexp(".*drop.*"),
Action: config.RelabelDrop, Action: config.RelabelDrop,
}, },
{ {
SourceLabels: model.LabelNames{"__name__"}, SourceLabels: model.LabelNames{"__name__"},
Regex: &config.Regexp{*regexp.MustCompile(".*(relabel|up).*")}, Regex: config.MustNewRegexp(".*(relabel|up).*"),
TargetLabel: "foo", TargetLabel: "foo",
Replacement: "bar", Replacement: "bar",
Action: config.RelabelReplace, Action: config.RelabelReplace,

View file

@ -16,7 +16,6 @@ package retrieval
import ( import (
"net/url" "net/url"
"reflect" "reflect"
"regexp"
"testing" "testing"
"time" "time"
@ -219,7 +218,7 @@ func TestTargetManagerConfigUpdate(t *testing.T) {
{ {
// Copy out the URL parameter. // Copy out the URL parameter.
SourceLabels: model.LabelNames{"__param_testParam"}, SourceLabels: model.LabelNames{"__param_testParam"},
Regex: &config.Regexp{*regexp.MustCompile("^(.*)$")}, Regex: config.MustNewRegexp("(.*)"),
TargetLabel: "testParam", TargetLabel: "testParam",
Replacement: "$1", Replacement: "$1",
Action: config.RelabelReplace, Action: config.RelabelReplace,
@ -255,7 +254,7 @@ func TestTargetManagerConfigUpdate(t *testing.T) {
RelabelConfigs: []*config.RelabelConfig{ RelabelConfigs: []*config.RelabelConfig{
{ {
SourceLabels: model.LabelNames{model.AddressLabel}, SourceLabels: model.LabelNames{model.AddressLabel},
Regex: &config.Regexp{*regexp.MustCompile(`^test\.(.*?):(.*)`)}, Regex: config.MustNewRegexp(`test\.(.*?):(.*)`),
Replacement: "foo.${1}:${2}", Replacement: "foo.${1}:${2}",
TargetLabel: model.AddressLabel, TargetLabel: model.AddressLabel,
Action: config.RelabelReplace, Action: config.RelabelReplace,
@ -263,7 +262,7 @@ func TestTargetManagerConfigUpdate(t *testing.T) {
{ {
// Add a new label for example.* targets. // Add a new label for example.* targets.
SourceLabels: model.LabelNames{model.AddressLabel, "boom", "foo"}, SourceLabels: model.LabelNames{model.AddressLabel, "boom", "foo"},
Regex: &config.Regexp{*regexp.MustCompile("^example.*?-b([a-z-]+)r$")}, Regex: config.MustNewRegexp("example.*?-b([a-z-]+)r"),
TargetLabel: "new", TargetLabel: "new",
Replacement: "$1", Replacement: "$1",
Separator: "-", Separator: "-",
@ -272,7 +271,7 @@ func TestTargetManagerConfigUpdate(t *testing.T) {
{ {
// Drop an existing label. // Drop an existing label.
SourceLabels: model.LabelNames{"boom"}, SourceLabels: model.LabelNames{"boom"},
Regex: &config.Regexp{*regexp.MustCompile(".*")}, Regex: config.MustNewRegexp(".*"),
TargetLabel: "boom", TargetLabel: "boom",
Replacement: "", Replacement: "",
Action: config.RelabelReplace, Action: config.RelabelReplace,