From 5c89cec65cfb4b83e10fff63a5085ac88724c02c Mon Sep 17 00:00:00 2001 From: Goutham Veeramachaneni Date: Sun, 19 Mar 2017 03:02:08 +0530 Subject: [PATCH] Stricter Relabel Config Checking for Labeldrop/keep (#2510) * Minor code cleanup * Labeldrop/Labelkeep Now *Only* Support Regex Ref promtheus/prometheus#2368 --- config/config.go | 16 +++++++++++++++- config/config_test.go | 30 ++++++++++++++++++++++++++++++ config/testdata/labeldrop.bad.yml | 5 +++++ config/testdata/labeldrop2.bad.yml | 5 +++++ config/testdata/labeldrop3.bad.yml | 5 +++++ config/testdata/labeldrop4.bad.yml | 5 +++++ config/testdata/labeldrop5.bad.yml | 5 +++++ config/testdata/labelkeep.bad.yml | 5 +++++ config/testdata/labelkeep2.bad.yml | 5 +++++ config/testdata/labelkeep3.bad.yml | 5 +++++ config/testdata/labelkeep4.bad.yml | 5 +++++ config/testdata/labelkeep5.bad.yml | 5 +++++ relabel/relabel.go | 4 ++-- 13 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 config/testdata/labeldrop.bad.yml create mode 100644 config/testdata/labeldrop2.bad.yml create mode 100644 config/testdata/labeldrop3.bad.yml create mode 100644 config/testdata/labeldrop4.bad.yml create mode 100644 config/testdata/labeldrop5.bad.yml create mode 100644 config/testdata/labelkeep.bad.yml create mode 100644 config/testdata/labelkeep2.bad.yml create mode 100644 config/testdata/labelkeep3.bad.yml create mode 100644 config/testdata/labelkeep4.bad.yml create mode 100644 config/testdata/labelkeep5.bad.yml diff --git a/config/config.go b/config/config.go index 05559f62c2..73db94977c 100644 --- a/config/config.go +++ b/config/config.go @@ -584,7 +584,7 @@ func (c *AlertingConfig) UnmarshalYAML(unmarshal func(interface{}) error) error 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 { // We cannot do proper Go type embedding below as the parser will then parse // 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 } +// KubernetesRole is role of the service in Kubernetes. type KubernetesRole string +// The valid options for KubernetesRole. const ( KubernetesRoleNode = "node" KubernetesRolePod = "pod" @@ -958,6 +960,7 @@ const ( KubernetesRoleEndpoint = "endpoints" ) +// UnmarshalYAML implements the yaml.Unmarshaler interface. func (c *KubernetesRole) UnmarshalYAML(unmarshal func(interface{}) error) error { if err := unmarshal((*string)(c)); err != nil { return err @@ -1226,6 +1229,17 @@ func (c *RelabelConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { if c.Action == RelabelHashMod && !model.LabelName(c.TargetLabel).IsValid() { 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 } diff --git a/config/config_test.go b/config/config_test.go index 4be6989b7b..54acb4dae0 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -538,6 +538,36 @@ var expectedErrors = []struct { }, { filename: "modulus_missing.bad.yml", 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", errMsg: "invalid rule file path", diff --git a/config/testdata/labeldrop.bad.yml b/config/testdata/labeldrop.bad.yml new file mode 100644 index 0000000000..b71c1e8a84 --- /dev/null +++ b/config/testdata/labeldrop.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - source_labels: [abcdef] + action: labeldrop diff --git a/config/testdata/labeldrop2.bad.yml b/config/testdata/labeldrop2.bad.yml new file mode 100644 index 0000000000..f703169750 --- /dev/null +++ b/config/testdata/labeldrop2.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - modulus: 8 + action: labeldrop diff --git a/config/testdata/labeldrop3.bad.yml b/config/testdata/labeldrop3.bad.yml new file mode 100644 index 0000000000..5bed5d0afe --- /dev/null +++ b/config/testdata/labeldrop3.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - separator: ',' + action: labeldrop diff --git a/config/testdata/labeldrop4.bad.yml b/config/testdata/labeldrop4.bad.yml new file mode 100644 index 0000000000..52877d2b4a --- /dev/null +++ b/config/testdata/labeldrop4.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - replacement: yolo-{1} + action: labeldrop diff --git a/config/testdata/labeldrop5.bad.yml b/config/testdata/labeldrop5.bad.yml new file mode 100644 index 0000000000..36f282751d --- /dev/null +++ b/config/testdata/labeldrop5.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - target_label: yolo + action: labeldrop diff --git a/config/testdata/labelkeep.bad.yml b/config/testdata/labelkeep.bad.yml new file mode 100644 index 0000000000..709da0595e --- /dev/null +++ b/config/testdata/labelkeep.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - source_labels: [abcdef] + action: labelkeep diff --git a/config/testdata/labelkeep2.bad.yml b/config/testdata/labelkeep2.bad.yml new file mode 100644 index 0000000000..734e537cf4 --- /dev/null +++ b/config/testdata/labelkeep2.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - modulus: 8 + action: labelkeep diff --git a/config/testdata/labelkeep3.bad.yml b/config/testdata/labelkeep3.bad.yml new file mode 100644 index 0000000000..407a0f7c11 --- /dev/null +++ b/config/testdata/labelkeep3.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - separator: ',' + action: labelkeep diff --git a/config/testdata/labelkeep4.bad.yml b/config/testdata/labelkeep4.bad.yml new file mode 100644 index 0000000000..4e7799415c --- /dev/null +++ b/config/testdata/labelkeep4.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - replacement: yolo-{1} + action: labelkeep diff --git a/config/testdata/labelkeep5.bad.yml b/config/testdata/labelkeep5.bad.yml new file mode 100644 index 0000000000..689399fc70 --- /dev/null +++ b/config/testdata/labelkeep5.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - target_label: yolo + action: labelkeep diff --git a/relabel/relabel.go b/relabel/relabel.go index be9fa6d82f..49e134c131 100644 --- a/relabel/relabel.go +++ b/relabel/relabel.go @@ -87,13 +87,13 @@ func relabel(labels model.LabelSet, cfg *config.RelabelConfig) model.LabelSet { } labels = out case config.RelabelLabelDrop: - for ln, _ := range labels { + for ln := range labels { if cfg.Regex.MatchString(string(ln)) { delete(labels, ln) } } case config.RelabelLabelKeep: - for ln, _ := range labels { + for ln := range labels { if !cfg.Regex.MatchString(string(ln)) { delete(labels, ln) }