Skip to content

Commit

Permalink
feat: migrate form_urlencoded parser to new style (#11381)
Browse files Browse the repository at this point in the history
  • Loading branch information
sspaink authored Jun 29, 2022
1 parent bd516ae commit b638c53
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 51 deletions.
1 change: 0 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
17 changes: 13 additions & 4 deletions plugins/inputs/http_listener_v2/http_listener_v2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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())
Expand All @@ -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())
Expand Down
1 change: 1 addition & 0 deletions plugins/parsers/all/all.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
45 changes: 18 additions & 27 deletions plugins/parsers/form_urlencoded/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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}
})
}
19 changes: 0 additions & 19 deletions plugins/parsers/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit b638c53

Please sign in to comment.