Stricter Relabel Config Checking for Labeldrop/keep (#2510)

* Minor code cleanup

* Labeldrop/Labelkeep Now *Only* Support Regex

Ref promtheus/prometheus#2368
This commit is contained in:
Goutham Veeramachaneni 2017-03-19 03:02:08 +05:30 committed by Julius Volz
parent cc3e859d9e
commit 5c89cec65c
13 changed files with 97 additions and 3 deletions

View file

@ -584,7 +584,7 @@ func (c *AlertingConfig) UnmarshalYAML(unmarshal func(interface{}) error) error
return nil return nil
} }
// AlertmanagersConfig configures how Alertmanagers can be discovered and communicated with. // AlertmanagerConfig configures how Alertmanagers can be discovered and communicated with.
type AlertmanagerConfig struct { type AlertmanagerConfig struct {
// We cannot do proper Go type embedding below as the parser will then parse // We cannot do proper Go type embedding below as the parser will then parse
// values arbitrarily into the overflow maps of further-down types. // values arbitrarily into the overflow maps of further-down types.
@ -949,8 +949,10 @@ func (c *MarathonSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) erro
return nil return nil
} }
// KubernetesRole is role of the service in Kubernetes.
type KubernetesRole string type KubernetesRole string
// The valid options for KubernetesRole.
const ( const (
KubernetesRoleNode = "node" KubernetesRoleNode = "node"
KubernetesRolePod = "pod" KubernetesRolePod = "pod"
@ -958,6 +960,7 @@ const (
KubernetesRoleEndpoint = "endpoints" KubernetesRoleEndpoint = "endpoints"
) )
// UnmarshalYAML implements the yaml.Unmarshaler interface.
func (c *KubernetesRole) UnmarshalYAML(unmarshal func(interface{}) error) error { func (c *KubernetesRole) UnmarshalYAML(unmarshal func(interface{}) error) error {
if err := unmarshal((*string)(c)); err != nil { if err := unmarshal((*string)(c)); err != nil {
return err return err
@ -1226,6 +1229,17 @@ func (c *RelabelConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
if c.Action == RelabelHashMod && !model.LabelName(c.TargetLabel).IsValid() { if c.Action == RelabelHashMod && !model.LabelName(c.TargetLabel).IsValid() {
return fmt.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action) return fmt.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action)
} }
if c.Action == RelabelLabelDrop || c.Action == RelabelLabelKeep {
if c.SourceLabels != nil ||
c.TargetLabel != DefaultRelabelConfig.TargetLabel ||
c.Modulus != DefaultRelabelConfig.Modulus ||
c.Separator != DefaultRelabelConfig.Separator ||
c.Replacement != DefaultRelabelConfig.Replacement {
return fmt.Errorf("%s action requires only 'regex', and no other fields", c.Action)
}
}
return nil return nil
} }

View file

@ -538,6 +538,36 @@ var expectedErrors = []struct {
}, { }, {
filename: "modulus_missing.bad.yml", filename: "modulus_missing.bad.yml",
errMsg: "relabel configuration for hashmod requires non-zero modulus", errMsg: "relabel configuration for hashmod requires non-zero modulus",
}, {
filename: "labelkeep.bad.yml",
errMsg: "labelkeep action requires only 'regex', and no other fields",
}, {
filename: "labelkeep2.bad.yml",
errMsg: "labelkeep action requires only 'regex', and no other fields",
}, {
filename: "labelkeep3.bad.yml",
errMsg: "labelkeep action requires only 'regex', and no other fields",
}, {
filename: "labelkeep4.bad.yml",
errMsg: "labelkeep action requires only 'regex', and no other fields",
}, {
filename: "labelkeep5.bad.yml",
errMsg: "labelkeep action requires only 'regex', and no other fields",
}, {
filename: "labeldrop.bad.yml",
errMsg: "labeldrop action requires only 'regex', and no other fields",
}, {
filename: "labeldrop2.bad.yml",
errMsg: "labeldrop action requires only 'regex', and no other fields",
}, {
filename: "labeldrop3.bad.yml",
errMsg: "labeldrop action requires only 'regex', and no other fields",
}, {
filename: "labeldrop4.bad.yml",
errMsg: "labeldrop action requires only 'regex', and no other fields",
}, {
filename: "labeldrop5.bad.yml",
errMsg: "labeldrop action requires only 'regex', and no other fields",
}, { }, {
filename: "rules.bad.yml", filename: "rules.bad.yml",
errMsg: "invalid rule file path", errMsg: "invalid rule file path",

5
config/testdata/labeldrop.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- source_labels: [abcdef]
action: labeldrop

5
config/testdata/labeldrop2.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- modulus: 8
action: labeldrop

5
config/testdata/labeldrop3.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- separator: ','
action: labeldrop

5
config/testdata/labeldrop4.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- replacement: yolo-{1}
action: labeldrop

5
config/testdata/labeldrop5.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- target_label: yolo
action: labeldrop

5
config/testdata/labelkeep.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- source_labels: [abcdef]
action: labelkeep

5
config/testdata/labelkeep2.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- modulus: 8
action: labelkeep

5
config/testdata/labelkeep3.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- separator: ','
action: labelkeep

5
config/testdata/labelkeep4.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- replacement: yolo-{1}
action: labelkeep

5
config/testdata/labelkeep5.bad.yml vendored Normal file
View file

@ -0,0 +1,5 @@
scrape_configs:
- job_name: prometheus
relabel_configs:
- target_label: yolo
action: labelkeep

View file

@ -87,13 +87,13 @@ func relabel(labels model.LabelSet, cfg *config.RelabelConfig) model.LabelSet {
} }
labels = out labels = out
case config.RelabelLabelDrop: case config.RelabelLabelDrop:
for ln, _ := range labels { for ln := range labels {
if cfg.Regex.MatchString(string(ln)) { if cfg.Regex.MatchString(string(ln)) {
delete(labels, ln) delete(labels, ln)
} }
} }
case config.RelabelLabelKeep: case config.RelabelLabelKeep:
for ln, _ := range labels { for ln := range labels {
if !cfg.Regex.MatchString(string(ln)) { if !cfg.Regex.MatchString(string(ln)) {
delete(labels, ln) delete(labels, ln)
} }