chore(serializers.csv): Migrate to new-style framework (#13319)
This commit is contained in:
parent
fb3cd61579
commit
66988b81cf
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
//go:build !custom || serializers || serializers.csv
|
||||||
|
|
||||||
|
package all
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/influxdata/telegraf/plugins/serializers/csv" // register plugin
|
||||||
|
)
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue