chore(serializers.csv): Migrate to new-style framework (#13319)

This commit is contained in:
Sven Rebhan 2023-05-23 16:18:48 +02:00 committed by GitHub
parent fb3cd61579
commit 66988b81cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 41 deletions

View File

@ -1452,10 +1452,6 @@ func (c *Config) buildSerializerOld(tbl *ast.Table) (telegraf.Serializer, error)
c.getFieldString(tbl, "prefix", &sc.Prefix) c.getFieldString(tbl, "prefix", &sc.Prefix)
c.getFieldString(tbl, "template", &sc.Template) c.getFieldString(tbl, "template", &sc.Template)
c.getFieldStringSlice(tbl, "templates", &sc.Templates) c.getFieldStringSlice(tbl, "templates", &sc.Templates)
c.getFieldBool(tbl, "csv_column_prefix", &sc.CSVPrefix)
c.getFieldBool(tbl, "csv_header", &sc.CSVHeader)
c.getFieldString(tbl, "csv_separator", &sc.CSVSeparator)
c.getFieldString(tbl, "csv_timestamp_format", &sc.TimestampFormat)
c.getFieldInt(tbl, "influx_max_line_bytes", &sc.InfluxMaxLineBytes) c.getFieldInt(tbl, "influx_max_line_bytes", &sc.InfluxMaxLineBytes)
c.getFieldBool(tbl, "influx_sort_fields", &sc.InfluxSortFields) c.getFieldBool(tbl, "influx_sort_fields", &sc.InfluxSortFields)
c.getFieldBool(tbl, "influx_uint_support", &sc.InfluxUintSupport) c.getFieldBool(tbl, "influx_uint_support", &sc.InfluxUintSupport)
@ -1550,7 +1546,6 @@ func (c *Config) missingTomlField(_ reflect.Type, key string) error {
// Serializer options to ignore // Serializer options to ignore
case "prefix", "template", "templates", case "prefix", "template", "templates",
"csv_column_prefix", "csv_header", "csv_separator", "csv_timestamp_format",
"graphite_strict_sanitize_regex", "graphite_strict_sanitize_regex",
"graphite_tag_sanitize_mode", "graphite_tag_support", "graphite_separator", "graphite_tag_sanitize_mode", "graphite_tag_support", "graphite_separator",
"influx_max_line_bytes", "influx_sort_fields", "influx_uint_support", "influx_max_line_bytes", "influx_sort_fields", "influx_uint_support",

View File

@ -0,0 +1,7 @@
//go:build !custom || serializers || serializers.csv
package all
import (
_ "github.com/influxdata/telegraf/plugins/serializers/csv" // register plugin
)

View File

@ -11,6 +11,7 @@ import (
"github.com/influxdata/telegraf" "github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/plugins/serializers"
) )
type Serializer struct { type Serializer struct {
@ -23,39 +24,32 @@ type Serializer struct {
writer *csv.Writer writer *csv.Writer
} }
func NewSerializer(timestampFormat, separator string, header, prefix bool) (*Serializer, error) { func (s *Serializer) Init() error {
// Setting defaults // Setting defaults
if separator == "" { if s.Separator == "" {
separator = "," s.Separator = ","
} }
// Check inputs // Check inputs
if len(separator) > 1 { if len(s.Separator) > 1 {
return nil, fmt.Errorf("invalid separator %q", separator) return fmt.Errorf("invalid separator %q", s.Separator)
} }
switch timestampFormat { switch s.TimestampFormat {
case "": case "":
timestampFormat = "unix" s.TimestampFormat = "unix"
case "unix", "unix_ms", "unix_us", "unix_ns": case "unix", "unix_ms", "unix_us", "unix_ns":
default: default:
if time.Now().Format(timestampFormat) == timestampFormat { if time.Now().Format(s.TimestampFormat) == s.TimestampFormat {
return nil, fmt.Errorf("invalid timestamp format %q", timestampFormat) return fmt.Errorf("invalid timestamp format %q", s.TimestampFormat)
} }
} }
s := &Serializer{
TimestampFormat: timestampFormat,
Separator: separator,
Header: header,
Prefix: prefix,
}
// Initialize the writer // Initialize the writer
s.writer = csv.NewWriter(&s.buffer) s.writer = csv.NewWriter(&s.buffer)
s.writer.Comma = []rune(separator)[0] s.writer.Comma = []rune(s.Separator)[0]
s.writer.UseCRLF = runtime.GOOS == "windows" s.writer.UseCRLF = runtime.GOOS == "windows"
return s, nil return nil
} }
func (s *Serializer) Serialize(metric telegraf.Metric) ([]byte, error) { func (s *Serializer) Serialize(metric telegraf.Metric) ([]byte, error) {
@ -174,3 +168,21 @@ func (s *Serializer) writeData(metric telegraf.Metric) error {
return s.writer.Write(columns) return s.writer.Write(columns)
} }
func init() {
serializers.Add("csv",
func() serializers.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.TimestampFormat = cfg.TimestampFormat
s.Separator = cfg.CSVSeparator
s.Header = cfg.CSVHeader
s.Prefix = cfg.CSVPrefix
return nil
}

View File

@ -15,18 +15,24 @@ import (
) )
func TestInvalidTimestampFormat(t *testing.T) { func TestInvalidTimestampFormat(t *testing.T) {
_, err := NewSerializer("garbage", "", false, false) s := Serializer{
require.EqualError(t, err, `invalid timestamp format "garbage"`) TimestampFormat: "garbage",
}
require.EqualError(t, s.Init(), `invalid timestamp format "garbage"`)
} }
func TestInvalidSeparator(t *testing.T) { func TestInvalidSeparator(t *testing.T) {
_, err := NewSerializer("", "garbage", false, false) s := Serializer{
require.EqualError(t, err, `invalid separator "garbage"`) Separator: "garbage",
}
require.EqualError(t, s.Init(), `invalid separator "garbage"`)
serializer, err := NewSerializer("", "\n", false, false) s = Serializer{
require.NoError(t, err) Separator: "\n",
}
require.NoError(t, s.Init())
_, err = serializer.Serialize(testutil.TestMetric(42.3, "test")) _, err := s.Serialize(testutil.TestMetric(42.3, "test"))
require.EqualError(t, err, "writing data failed: csv: invalid field or comment delimiter") require.EqualError(t, err, "writing data failed: csv: invalid field or comment delimiter")
} }
@ -81,8 +87,13 @@ func TestSerializeTransformationNonBatch(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// Serialize // Serialize
serializer, err := NewSerializer(cfg.TimestampFormat, cfg.Separator, cfg.Header, cfg.Prefix) serializer := Serializer{
require.NoError(t, err) TimestampFormat: cfg.TimestampFormat,
Separator: cfg.Separator,
Header: cfg.Header,
Prefix: cfg.Prefix,
}
require.NoError(t, serializer.Init())
// expected results use LF endings // expected results use LF endings
serializer.writer.UseCRLF = false serializer.writer.UseCRLF = false
var actual bytes.Buffer var actual bytes.Buffer
@ -149,8 +160,13 @@ func TestSerializeTransformationBatch(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// Serialize // Serialize
serializer, err := NewSerializer(cfg.TimestampFormat, cfg.Separator, cfg.Header, cfg.Prefix) serializer := Serializer{
require.NoError(t, err) TimestampFormat: cfg.TimestampFormat,
Separator: cfg.Separator,
Header: cfg.Header,
Prefix: cfg.Prefix,
}
require.NoError(t, serializer.Init())
// expected results use LF endings // expected results use LF endings
serializer.writer.UseCRLF = false serializer.writer.UseCRLF = false
actual, err := serializer.SerializeBatch(metrics) actual, err := serializer.SerializeBatch(metrics)

View File

@ -6,7 +6,6 @@ import (
"time" "time"
"github.com/influxdata/telegraf" "github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/serializers/csv"
"github.com/influxdata/telegraf/plugins/serializers/graphite" "github.com/influxdata/telegraf/plugins/serializers/graphite"
"github.com/influxdata/telegraf/plugins/serializers/json" "github.com/influxdata/telegraf/plugins/serializers/json"
"github.com/influxdata/telegraf/plugins/serializers/msgpack" "github.com/influxdata/telegraf/plugins/serializers/msgpack"
@ -166,8 +165,6 @@ func NewSerializer(config *Config) (Serializer, error) {
var err error var err error
var serializer Serializer var serializer Serializer
switch config.DataFormat { switch config.DataFormat {
case "csv":
serializer, err = NewCSVSerializer(config)
case "graphite": case "graphite":
serializer, err = NewGraphiteSerializer( serializer, err = NewGraphiteSerializer(
config.Prefix, config.Prefix,
@ -216,10 +213,6 @@ func NewSerializer(config *Config) (Serializer, error) {
return serializer, err return serializer, err
} }
func NewCSVSerializer(config *Config) (Serializer, error) {
return csv.NewSerializer(config.TimestampFormat, config.CSVSeparator, config.CSVHeader, config.CSVPrefix)
}
func NewPrometheusRemoteWriteSerializer(config *Config) Serializer { func NewPrometheusRemoteWriteSerializer(config *Config) Serializer {
sortMetrics := prometheusremotewrite.NoSortMetrics sortMetrics := prometheusremotewrite.NoSortMetrics
if config.PrometheusExportTimestamp { if config.PrometheusExportTimestamp {