feat: migrate form_urlencoded parser to new style (#11381)

This commit is contained in:
Sebastian Spaink 2022-06-29 14:08:12 -05:00 committed by GitHub
parent bd516ae587
commit b638c5353f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 32 additions and 51 deletions

View File

@ -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",

View File

@ -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())

View File

@ -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"

View File

@ -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}
})
}

View File

@ -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,