diff --git a/config/config.go b/config/config.go index c04aa0b65..6eb60e1d4 100644 --- a/config/config.go +++ b/config/config.go @@ -1428,7 +1428,6 @@ func (c *Config) missingTomlField(_ reflect.Type, key string) error { // "templates", // shared with serializers "dropwizard_metric_registry_path", "dropwizard_tags_path", "dropwizard_tag_paths", "dropwizard_time_format", "dropwizard_time_path", - "form_urlencoded_tag_keys", "grok_custom_pattern_files", "grok_custom_patterns", "grok_named_patterns", "grok_patterns", "grok_timezone", "grok_unique_timestamp", "influx_parser_type", diff --git a/plugins/inputs/http_listener_v2/http_listener_v2_test.go b/plugins/inputs/http_listener_v2/http_listener_v2_test.go index ddbb5be64..fda803ef2 100644 --- a/plugins/inputs/http_listener_v2/http_listener_v2_test.go +++ b/plugins/inputs/http_listener_v2/http_listener_v2_test.go @@ -18,6 +18,7 @@ import ( "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/plugins/parsers" + "github.com/influxdata/telegraf/plugins/parsers/form_urlencoded" "github.com/influxdata/telegraf/testutil" ) @@ -592,10 +593,14 @@ func TestWriteHTTPTransformHeaderValuesToTagsBulkWrite(t *testing.T) { } func TestWriteHTTPQueryParams(t *testing.T) { - parser, _ := parsers.NewFormUrlencodedParser("query_measurement", nil, []string{"tagKey"}) + parser := form_urlencoded.Parser{ + MetricName: "query_measurement", + TagKeys: []string{"tagKey"}, + } + listener := newTestHTTPListenerV2() listener.DataSource = "query" - listener.Parser = parser + listener.Parser = &parser acc := &testutil.Accumulator{} require.NoError(t, listener.Init()) @@ -615,9 +620,13 @@ func TestWriteHTTPQueryParams(t *testing.T) { } func TestWriteHTTPFormData(t *testing.T) { - parser, _ := parsers.NewFormUrlencodedParser("query_measurement", nil, []string{"tagKey"}) + parser := form_urlencoded.Parser{ + MetricName: "query_measurement", + TagKeys: []string{"tagKey"}, + } + listener := newTestHTTPListenerV2() - listener.Parser = parser + listener.Parser = &parser acc := &testutil.Accumulator{} require.NoError(t, listener.Init()) diff --git a/plugins/parsers/all/all.go b/plugins/parsers/all/all.go index 5807c717f..715748b0a 100644 --- a/plugins/parsers/all/all.go +++ b/plugins/parsers/all/all.go @@ -4,6 +4,7 @@ import ( //Blank imports for plugins to register themselves _ "github.com/influxdata/telegraf/plugins/parsers/collectd" _ "github.com/influxdata/telegraf/plugins/parsers/csv" + _ "github.com/influxdata/telegraf/plugins/parsers/form_urlencoded" _ "github.com/influxdata/telegraf/plugins/parsers/json" _ "github.com/influxdata/telegraf/plugins/parsers/json_v2" _ "github.com/influxdata/telegraf/plugins/parsers/wavefront" diff --git a/plugins/parsers/form_urlencoded/parser.go b/plugins/parsers/form_urlencoded/parser.go index f26740709..ced162149 100644 --- a/plugins/parsers/form_urlencoded/parser.go +++ b/plugins/parsers/form_urlencoded/parser.go @@ -9,19 +9,16 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/parsers" ) -var ( - // ErrNoMetric is returned when no metric is found in input line - ErrNoMetric = fmt.Errorf("no metric in line") -) +var ErrNoMetric = fmt.Errorf("no metric in line") // Parser decodes "application/x-www-form-urlencoded" data into metrics type Parser struct { - MetricName string - DefaultTags map[string]string - TagKeys []string - AllowedKeys []string + MetricName string `toml:"-"` + TagKeys []string `toml:"form_urlencoded_tag_keys"` + DefaultTags map[string]string `toml:"-"` } // Parse converts a slice of bytes in "application/x-www-form-urlencoded" format into metrics @@ -36,10 +33,6 @@ func (p Parser) Parse(buf []byte) ([]telegraf.Metric, error) { return nil, err } - if len(p.AllowedKeys) > 0 { - values = p.filterAllowedKeys(values) - } - tags := p.extractTags(values) fields := p.parseFields(values) @@ -71,21 +64,6 @@ func (p *Parser) SetDefaultTags(tags map[string]string) { p.DefaultTags = tags } -func (p Parser) filterAllowedKeys(original url.Values) url.Values { - result := make(url.Values) - - for _, key := range p.AllowedKeys { - value, exists := original[key] - if !exists { - continue - } - - result[key] = value - } - - return result -} - func (p Parser) extractTags(values url.Values) map[string]string { tags := make(map[string]string) for _, key := range p.TagKeys { @@ -120,3 +98,16 @@ func (p Parser) parseFields(values url.Values) map[string]interface{} { return fields } + +func (p *Parser) InitFromConfig(config *parsers.Config) error { + p.MetricName = config.MetricName + p.TagKeys = config.FormUrlencodedTagKeys + return nil +} + +func init() { + parsers.Add("form_urlencoded", + func(defaultMetricName string) telegraf.Parser { + return &Parser{MetricName: defaultMetricName} + }) +} diff --git a/plugins/parsers/registry.go b/plugins/parsers/registry.go index 510eba2ce..8cc207054 100644 --- a/plugins/parsers/registry.go +++ b/plugins/parsers/registry.go @@ -5,7 +5,6 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/parsers/dropwizard" - "github.com/influxdata/telegraf/plugins/parsers/form_urlencoded" "github.com/influxdata/telegraf/plugins/parsers/graphite" "github.com/influxdata/telegraf/plugins/parsers/grok" "github.com/influxdata/telegraf/plugins/parsers/influx" @@ -238,12 +237,6 @@ func NewParser(config *Config) (Parser, error) { config.GrokUniqueTimestamp) case "logfmt": parser, err = NewLogFmtParser(config.MetricName, config.DefaultTags, config.LogFmtTagKeys) - case "form_urlencoded": - parser, err = NewFormUrlencodedParser( - config.MetricName, - config.DefaultTags, - config.FormUrlencodedTagKeys, - ) case "prometheus": parser, err = NewPrometheusParser( config.DefaultTags, @@ -349,18 +342,6 @@ func NewLogFmtParser(metricName string, defaultTags map[string]string, tagKeys [ return parser, err } -func NewFormUrlencodedParser( - metricName string, - defaultTags map[string]string, - tagKeys []string, -) (Parser, error) { - return &form_urlencoded.Parser{ - MetricName: metricName, - DefaultTags: defaultTags, - TagKeys: tagKeys, - }, nil -} - func NewPrometheusParser(defaultTags map[string]string, ignoreTimestamp bool) (Parser, error) { return &prometheus.Parser{ DefaultTags: defaultTags,