feat: migrate form_urlencoded parser to new style (#11381)
This commit is contained in:
parent
bd516ae587
commit
b638c5353f
|
|
@ -1428,7 +1428,6 @@ func (c *Config) missingTomlField(_ reflect.Type, key string) error {
|
||||||
// "templates", // shared with serializers
|
// "templates", // shared with serializers
|
||||||
"dropwizard_metric_registry_path", "dropwizard_tags_path", "dropwizard_tag_paths",
|
"dropwizard_metric_registry_path", "dropwizard_tags_path", "dropwizard_tag_paths",
|
||||||
"dropwizard_time_format", "dropwizard_time_path",
|
"dropwizard_time_format", "dropwizard_time_path",
|
||||||
"form_urlencoded_tag_keys",
|
|
||||||
"grok_custom_pattern_files", "grok_custom_patterns", "grok_named_patterns", "grok_patterns",
|
"grok_custom_pattern_files", "grok_custom_patterns", "grok_named_patterns", "grok_patterns",
|
||||||
"grok_timezone", "grok_unique_timestamp",
|
"grok_timezone", "grok_unique_timestamp",
|
||||||
"influx_parser_type",
|
"influx_parser_type",
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ import (
|
||||||
|
|
||||||
"github.com/influxdata/telegraf/config"
|
"github.com/influxdata/telegraf/config"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers"
|
"github.com/influxdata/telegraf/plugins/parsers"
|
||||||
|
"github.com/influxdata/telegraf/plugins/parsers/form_urlencoded"
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -592,10 +593,14 @@ func TestWriteHTTPTransformHeaderValuesToTagsBulkWrite(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWriteHTTPQueryParams(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 := newTestHTTPListenerV2()
|
||||||
listener.DataSource = "query"
|
listener.DataSource = "query"
|
||||||
listener.Parser = parser
|
listener.Parser = &parser
|
||||||
|
|
||||||
acc := &testutil.Accumulator{}
|
acc := &testutil.Accumulator{}
|
||||||
require.NoError(t, listener.Init())
|
require.NoError(t, listener.Init())
|
||||||
|
|
@ -615,9 +620,13 @@ func TestWriteHTTPQueryParams(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWriteHTTPFormData(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 := newTestHTTPListenerV2()
|
||||||
listener.Parser = parser
|
listener.Parser = &parser
|
||||||
|
|
||||||
acc := &testutil.Accumulator{}
|
acc := &testutil.Accumulator{}
|
||||||
require.NoError(t, listener.Init())
|
require.NoError(t, listener.Init())
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import (
|
||||||
//Blank imports for plugins to register themselves
|
//Blank imports for plugins to register themselves
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/collectd"
|
_ "github.com/influxdata/telegraf/plugins/parsers/collectd"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/csv"
|
_ "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"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/json_v2"
|
_ "github.com/influxdata/telegraf/plugins/parsers/json_v2"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/wavefront"
|
_ "github.com/influxdata/telegraf/plugins/parsers/wavefront"
|
||||||
|
|
|
||||||
|
|
@ -9,19 +9,16 @@ import (
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/metric"
|
"github.com/influxdata/telegraf/metric"
|
||||||
|
"github.com/influxdata/telegraf/plugins/parsers"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var ErrNoMetric = fmt.Errorf("no metric in line")
|
||||||
// ErrNoMetric is returned when no metric is found in input line
|
|
||||||
ErrNoMetric = fmt.Errorf("no metric in line")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Parser decodes "application/x-www-form-urlencoded" data into metrics
|
// Parser decodes "application/x-www-form-urlencoded" data into metrics
|
||||||
type Parser struct {
|
type Parser struct {
|
||||||
MetricName string
|
MetricName string `toml:"-"`
|
||||||
DefaultTags map[string]string
|
TagKeys []string `toml:"form_urlencoded_tag_keys"`
|
||||||
TagKeys []string
|
DefaultTags map[string]string `toml:"-"`
|
||||||
AllowedKeys []string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse converts a slice of bytes in "application/x-www-form-urlencoded" format into metrics
|
// 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
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(p.AllowedKeys) > 0 {
|
|
||||||
values = p.filterAllowedKeys(values)
|
|
||||||
}
|
|
||||||
|
|
||||||
tags := p.extractTags(values)
|
tags := p.extractTags(values)
|
||||||
fields := p.parseFields(values)
|
fields := p.parseFields(values)
|
||||||
|
|
||||||
|
|
@ -71,21 +64,6 @@ func (p *Parser) SetDefaultTags(tags map[string]string) {
|
||||||
p.DefaultTags = tags
|
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 {
|
func (p Parser) extractTags(values url.Values) map[string]string {
|
||||||
tags := make(map[string]string)
|
tags := make(map[string]string)
|
||||||
for _, key := range p.TagKeys {
|
for _, key := range p.TagKeys {
|
||||||
|
|
@ -120,3 +98,16 @@ func (p Parser) parseFields(values url.Values) map[string]interface{} {
|
||||||
|
|
||||||
return fields
|
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}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import (
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/dropwizard"
|
"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/graphite"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/grok"
|
"github.com/influxdata/telegraf/plugins/parsers/grok"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
||||||
|
|
@ -238,12 +237,6 @@ func NewParser(config *Config) (Parser, error) {
|
||||||
config.GrokUniqueTimestamp)
|
config.GrokUniqueTimestamp)
|
||||||
case "logfmt":
|
case "logfmt":
|
||||||
parser, err = NewLogFmtParser(config.MetricName, config.DefaultTags, config.LogFmtTagKeys)
|
parser, err = NewLogFmtParser(config.MetricName, config.DefaultTags, config.LogFmtTagKeys)
|
||||||
case "form_urlencoded":
|
|
||||||
parser, err = NewFormUrlencodedParser(
|
|
||||||
config.MetricName,
|
|
||||||
config.DefaultTags,
|
|
||||||
config.FormUrlencodedTagKeys,
|
|
||||||
)
|
|
||||||
case "prometheus":
|
case "prometheus":
|
||||||
parser, err = NewPrometheusParser(
|
parser, err = NewPrometheusParser(
|
||||||
config.DefaultTags,
|
config.DefaultTags,
|
||||||
|
|
@ -349,18 +342,6 @@ func NewLogFmtParser(metricName string, defaultTags map[string]string, tagKeys [
|
||||||
return parser, err
|
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) {
|
func NewPrometheusParser(defaultTags map[string]string, ignoreTimestamp bool) (Parser, error) {
|
||||||
return &prometheus.Parser{
|
return &prometheus.Parser{
|
||||||
DefaultTags: defaultTags,
|
DefaultTags: defaultTags,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue