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, "template", &sc.Template)
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.getFieldBool(tbl, "influx_sort_fields", &sc.InfluxSortFields)
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
case "prefix", "template", "templates",
"csv_column_prefix", "csv_header", "csv_separator", "csv_timestamp_format",
"graphite_strict_sanitize_regex",
"graphite_tag_sanitize_mode", "graphite_tag_support", "graphite_separator",
"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/internal"
"github.com/influxdata/telegraf/plugins/serializers"
)
type Serializer struct {
@ -23,39 +24,32 @@ type Serializer struct {
writer *csv.Writer
}
func NewSerializer(timestampFormat, separator string, header, prefix bool) (*Serializer, error) {
func (s *Serializer) Init() error {
// Setting defaults
if separator == "" {
separator = ","
if s.Separator == "" {
s.Separator = ","
}
// Check inputs
if len(separator) > 1 {
return nil, fmt.Errorf("invalid separator %q", separator)
if len(s.Separator) > 1 {
return fmt.Errorf("invalid separator %q", s.Separator)
}
switch timestampFormat {
switch s.TimestampFormat {
case "":
timestampFormat = "unix"
s.TimestampFormat = "unix"
case "unix", "unix_ms", "unix_us", "unix_ns":
default:
if time.Now().Format(timestampFormat) == timestampFormat {
return nil, fmt.Errorf("invalid timestamp format %q", timestampFormat)
if time.Now().Format(s.TimestampFormat) == s.TimestampFormat {
return fmt.Errorf("invalid timestamp format %q", s.TimestampFormat)
}
}
s := &Serializer{
TimestampFormat: timestampFormat,
Separator: separator,
Header: header,
Prefix: prefix,
}
// Initialize the writer
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"
return s, nil
return nil
}
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)
}
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) {
_, err := NewSerializer("garbage", "", false, false)
require.EqualError(t, err, `invalid timestamp format "garbage"`)
s := Serializer{
TimestampFormat: "garbage",
}
require.EqualError(t, s.Init(), `invalid timestamp format "garbage"`)
}
func TestInvalidSeparator(t *testing.T) {
_, err := NewSerializer("", "garbage", false, false)
require.EqualError(t, err, `invalid separator "garbage"`)
s := Serializer{
Separator: "garbage",
}
require.EqualError(t, s.Init(), `invalid separator "garbage"`)
serializer, err := NewSerializer("", "\n", false, false)
require.NoError(t, err)
s = Serializer{
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")
}
@ -81,8 +87,13 @@ func TestSerializeTransformationNonBatch(t *testing.T) {
require.NoError(t, err)
// Serialize
serializer, err := NewSerializer(cfg.TimestampFormat, cfg.Separator, cfg.Header, cfg.Prefix)
require.NoError(t, err)
serializer := Serializer{
TimestampFormat: cfg.TimestampFormat,
Separator: cfg.Separator,
Header: cfg.Header,
Prefix: cfg.Prefix,
}
require.NoError(t, serializer.Init())
// expected results use LF endings
serializer.writer.UseCRLF = false
var actual bytes.Buffer
@ -149,8 +160,13 @@ func TestSerializeTransformationBatch(t *testing.T) {
require.NoError(t, err)
// Serialize
serializer, err := NewSerializer(cfg.TimestampFormat, cfg.Separator, cfg.Header, cfg.Prefix)
require.NoError(t, err)
serializer := Serializer{
TimestampFormat: cfg.TimestampFormat,
Separator: cfg.Separator,
Header: cfg.Header,
Prefix: cfg.Prefix,
}
require.NoError(t, serializer.Init())
// expected results use LF endings
serializer.writer.UseCRLF = false
actual, err := serializer.SerializeBatch(metrics)

View File

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