chore(serializers)!: Remove old-style creation (#15971)

This commit is contained in:
Sven Rebhan 2024-12-05 15:32:10 +01:00 committed by GitHub
parent 598079ad64
commit 18cdb1a99e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
40 changed files with 68 additions and 483 deletions

View File

@ -87,6 +87,10 @@
delivery state update of un-parseable messages from `ACK` to `NACK` without
requeueing. This way, those messages are not lost and can optionally be
handled using a dead-letter exchange by other means.
- Removal of old-style serializer creation. This should not directly affect
users as it is an API change. All serializers in Telegraf are already ported
to the new framework. If you experience any issues with not being able to
create serializers let us know!
### Bugfixes

View File

@ -1212,15 +1212,6 @@ func (c *Config) addOutput(name string, table *ast.Table) error {
return err
}
t.SetSerializer(serializer)
} else if t, ok := output.(serializers.SerializerOutput); ok {
// Keep the old interface for backward compatibility
// DEPRECATED: Please switch your plugin to telegraf.Serializers
missThreshold = 1
serializer, err := c.addSerializer(name, table)
if err != nil {
return err
}
t.SetSerializer(serializer)
}
if t, ok := output.(telegraf.SerializerFuncPlugin); ok {

View File

@ -630,7 +630,6 @@ func TestConfig_SerializerInterfaceNewFormat(t *testing.T) {
require.NoError(t, c.LoadConfig("./testdata/serializers_new.toml"))
require.Len(t, c.Outputs, len(formats))
cfg := serializers.Config{}
override := map[string]struct {
param map[string]interface{}
mask []string
@ -638,20 +637,12 @@ func TestConfig_SerializerInterfaceNewFormat(t *testing.T) {
expected := make([]telegraf.Serializer, 0, len(formats))
for _, format := range formats {
formatCfg := &cfg
formatCfg.DataFormat = format
logger := logging.New("serializers", format, "test")
var serializer telegraf.Serializer
if creator, found := serializers.Serializers[format]; found {
t.Logf("new-style %q", format)
serializer = creator()
} else {
t.Logf("old-style %q", format)
var err error
serializer, err = serializers.NewSerializer(formatCfg)
require.NoErrorf(t, err, "No serializer for format %q", format)
}
if settings, found := override[format]; found {
@ -703,98 +694,6 @@ func TestConfig_SerializerInterfaceNewFormat(t *testing.T) {
}
}
func TestConfig_SerializerInterfaceOldFormat(t *testing.T) {
formats := []string{
"carbon2",
"csv",
"graphite",
"influx",
"json",
"msgpack",
"nowmetric",
"prometheus",
"prometheusremotewrite",
"splunkmetric",
"wavefront",
}
c := config.NewConfig()
require.NoError(t, c.LoadConfig("./testdata/serializers_old.toml"))
require.Len(t, c.Outputs, len(formats))
cfg := serializers.Config{}
override := map[string]struct {
param map[string]interface{}
mask []string
}{}
expected := make([]telegraf.Serializer, 0, len(formats))
for _, format := range formats {
formatCfg := &cfg
formatCfg.DataFormat = format
logger := logging.New("serializers", format, "test")
var serializer serializers.Serializer
if creator, found := serializers.Serializers[format]; found {
t.Logf("new-style %q", format)
serializer = creator()
} else {
t.Logf("old-style %q", format)
var err error
serializer, err = serializers.NewSerializer(formatCfg)
require.NoErrorf(t, err, "No serializer for format %q", format)
}
if settings, found := override[format]; found {
s := reflect.Indirect(reflect.ValueOf(serializer))
for key, value := range settings.param {
v := reflect.ValueOf(value)
s.FieldByName(key).Set(v)
}
}
models.SetLoggerOnPlugin(serializer, logger)
if s, ok := serializer.(telegraf.Initializer); ok {
require.NoError(t, s.Init())
}
expected = append(expected, serializer)
}
require.Len(t, expected, len(formats))
actual := make([]interface{}, 0)
for _, plugin := range c.Outputs {
output, ok := plugin.Output.(*MockupOutputPluginSerializerOld)
require.True(t, ok)
// Get the parser set with 'SetParser()'
if p, ok := output.Serializer.(*models.RunningSerializer); ok {
actual = append(actual, p.Serializer)
} else {
actual = append(actual, output.Serializer)
}
}
require.Len(t, actual, len(formats))
for i, format := range formats {
// Determine the underlying type of the serializer
stype := reflect.Indirect(reflect.ValueOf(expected[i])).Interface()
// Ignore all unexported fields and fields not relevant for functionality
options := []cmp.Option{
cmpopts.IgnoreUnexported(stype),
cmpopts.IgnoreUnexported(reflect.Indirect(reflect.ValueOf(serializers_prometheus.MetricTypes{})).Interface()),
cmpopts.IgnoreTypes(sync.Mutex{}, regexp.Regexp{}),
cmpopts.IgnoreInterfaces(struct{ telegraf.Logger }{}),
}
if settings, found := override[format]; found {
options = append(options, cmpopts.IgnoreFields(stype, settings.mask...))
}
// Do a manual comparison as require.EqualValues will also work on unexported fields
// that cannot be cleared or ignored.
diff := cmp.Diff(expected[i], actual[i], options...)
require.Emptyf(t, diff, "Difference in SetSerializer() for %q", format)
}
}
func TestConfig_ParserInterface(t *testing.T) {
formats := []string{
"collectd",
@ -1503,27 +1402,6 @@ func (m *MockupOutputPlugin) Write(_ []telegraf.Metric) error {
return nil
}
// Mockup OUTPUT plugin for serializer testing to avoid cyclic dependencies
type MockupOutputPluginSerializerOld struct {
Serializer serializers.Serializer
}
func (m *MockupOutputPluginSerializerOld) SetSerializer(s serializers.Serializer) {
m.Serializer = s
}
func (*MockupOutputPluginSerializerOld) Connect() error {
return nil
}
func (*MockupOutputPluginSerializerOld) Close() error {
return nil
}
func (*MockupOutputPluginSerializerOld) SampleConfig() string {
return "Mockup test output plugin"
}
func (*MockupOutputPluginSerializerOld) Write(_ []telegraf.Metric) error {
return nil
}
type MockupOutputPluginSerializerNew struct {
Serializer telegraf.Serializer
}
@ -1662,7 +1540,4 @@ func init() {
outputs.Add("serializer_test_new", func() telegraf.Output {
return &MockupOutputPluginSerializerNew{}
})
outputs.Add("serializer_test_old", func() telegraf.Output {
return &MockupOutputPluginSerializerOld{}
})
}

View File

@ -5,7 +5,6 @@ import (
"github.com/influxdata/telegraf"
logging "github.com/influxdata/telegraf/logger"
"github.com/influxdata/telegraf/plugins/serializers"
"github.com/influxdata/telegraf/selfstat"
)
@ -19,7 +18,7 @@ type SerializerConfig struct {
}
type RunningSerializer struct {
Serializer serializers.Serializer
Serializer telegraf.Serializer
Config *SerializerConfig
log telegraf.Logger
@ -28,7 +27,7 @@ type RunningSerializer struct {
SerializationTime selfstat.Stat
}
func NewRunningSerializer(serializer serializers.Serializer, config *SerializerConfig) *RunningSerializer {
func NewRunningSerializer(serializer telegraf.Serializer, config *SerializerConfig) *RunningSerializer {
tags := map[string]string{"type": config.DataFormat}
if config.Alias != "" {
tags["alias"] = config.Alias

View File

@ -17,7 +17,6 @@ import (
"github.com/influxdata/telegraf/plugins/common/proxy"
"github.com/influxdata/telegraf/plugins/common/tls"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -67,7 +66,7 @@ type AMQP struct {
tls.ClientConfig
proxy.TCPProxy
serializer serializers.Serializer
serializer telegraf.Serializer
connect func(*ClientConfig) (Client, error)
client Client
config *ClientConfig
@ -84,7 +83,7 @@ func (*AMQP) SampleConfig() string {
return sampleConfig
}
func (q *AMQP) SetSerializer(serializer serializers.Serializer) {
func (q *AMQP) SetSerializer(serializer telegraf.Serializer) {
q.serializer = serializer
}

View File

@ -20,7 +20,6 @@ import (
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/internal/choice"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
"github.com/influxdata/telegraf/plugins/serializers/json"
)
@ -36,7 +35,7 @@ type AzureDataExplorer struct {
TableName string `toml:"table_name"`
CreateTables bool `toml:"create_tables"`
IngestionType string `toml:"ingestion_type"`
serializer serializers.Serializer
serializer telegraf.Serializer
kustoClient *kusto.Client
metricIngestors map[string]ingest.Ingestor
}

View File

@ -18,7 +18,6 @@ import (
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -45,7 +44,7 @@ type PubSub struct {
stubTopic func(id string) topic
serializer serializers.Serializer
serializer telegraf.Serializer
publishResults []publishResult
encoder internal.ContentEncoder
}
@ -54,7 +53,7 @@ func (*PubSub) SampleConfig() string {
return sampleConfig
}
func (ps *PubSub) SetSerializer(serializer serializers.Serializer) {
func (ps *PubSub) SetSerializer(serializer telegraf.Serializer) {
ps.serializer = serializer
}

View File

@ -11,7 +11,6 @@ import (
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -62,7 +61,7 @@ type EventHubs struct {
Hub EventHubInterface
batchOptions []eventhub.BatchOption
serializer serializers.Serializer
serializer telegraf.Serializer
}
const (
@ -104,7 +103,7 @@ func (e *EventHubs) Close() error {
return nil
}
func (e *EventHubs) SetSerializer(serializer serializers.Serializer) {
func (e *EventHubs) SetSerializer(serializer telegraf.Serializer) {
e.serializer = serializer
}

View File

@ -16,7 +16,6 @@ import (
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -33,7 +32,7 @@ type Exec struct {
Log telegraf.Logger `toml:"-"`
runner Runner
serializer serializers.Serializer
serializer telegraf.Serializer
}
func (*Exec) SampleConfig() string {
@ -47,7 +46,7 @@ func (e *Exec) Init() error {
}
// SetSerializer sets the serializer for the output.
func (e *Exec) SetSerializer(serializer serializers.Serializer) {
func (e *Exec) SetSerializer(serializer telegraf.Serializer) {
e.serializer = serializer
}

View File

@ -14,7 +14,6 @@ import (
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/internal/process"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -29,14 +28,14 @@ type Execd struct {
Log telegraf.Logger
process *process.Process
serializer serializers.Serializer
serializer telegraf.Serializer
}
func (*Execd) SampleConfig() string {
return sampleConfig
}
func (e *Execd) SetSerializer(s serializers.Serializer) {
func (e *Execd) SetSerializer(s telegraf.Serializer) {
e.serializer = s
}

View File

@ -13,7 +13,6 @@ import (
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/internal/rotate"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -32,14 +31,14 @@ type File struct {
encoder internal.ContentEncoder
writer io.Writer
closers []io.Closer
serializer serializers.Serializer
serializer telegraf.Serializer
}
func (*File) SampleConfig() string {
return sampleConfig
}
func (f *File) SetSerializer(serializer serializers.Serializer) {
func (f *File) SetSerializer(serializer telegraf.Serializer) {
f.serializer = serializer
}

View File

@ -25,7 +25,6 @@ import (
common_aws "github.com/influxdata/telegraf/plugins/common/aws"
common_http "github.com/influxdata/telegraf/plugins/common/http"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -56,7 +55,7 @@ type HTTP struct {
Log telegraf.Logger `toml:"-"`
client *http.Client
serializer serializers.Serializer
serializer telegraf.Serializer
awsCfg *aws.Config
common_aws.CredentialConfig
@ -70,7 +69,7 @@ func (*HTTP) SampleConfig() string {
return sampleConfig
}
func (h *HTTP) SetSerializer(serializer serializers.Serializer) {
func (h *HTTP) SetSerializer(serializer telegraf.Serializer) {
h.serializer = serializer
}

View File

@ -21,7 +21,6 @@ import (
common_aws "github.com/influxdata/telegraf/plugins/common/aws"
common_http "github.com/influxdata/telegraf/plugins/common/http"
"github.com/influxdata/telegraf/plugins/common/oauth"
"github.com/influxdata/telegraf/plugins/serializers"
"github.com/influxdata/telegraf/plugins/serializers/influx"
"github.com/influxdata/telegraf/plugins/serializers/json"
"github.com/influxdata/telegraf/testutil"
@ -735,7 +734,7 @@ func TestBatchedUnbatched(t *testing.T) {
jsonSerializer := &json.Serializer{}
require.NoError(t, jsonSerializer.Init())
s := map[string]serializers.Serializer{
s := map[string]telegraf.Serializer{
"influx": influxSerializer,
"json": jsonSerializer,
}

View File

@ -16,7 +16,6 @@ import (
"github.com/influxdata/telegraf/plugins/common/kafka"
"github.com/influxdata/telegraf/plugins/common/proxy"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -56,7 +55,7 @@ type Kafka struct {
producerFunc func(addrs []string, config *sarama.Config) (sarama.SyncProducer, error)
producer sarama.SyncProducer
serializer serializers.Serializer
serializer telegraf.Serializer
}
type TopicSuffix struct {
@ -114,7 +113,7 @@ func (k *Kafka) GetTopicName(metric telegraf.Metric) (telegraf.Metric, string) {
return metric, topicName
}
func (k *Kafka) SetSerializer(serializer serializers.Serializer) {
func (k *Kafka) SetSerializer(serializer telegraf.Serializer) {
k.serializer = serializer
}

View File

@ -14,7 +14,6 @@ import (
"github.com/influxdata/telegraf"
common_aws "github.com/influxdata/telegraf/plugins/common/aws"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -32,7 +31,7 @@ type (
Debug bool `toml:"debug"`
Log telegraf.Logger `toml:"-"`
serializer serializers.Serializer
serializer telegraf.Serializer
svc kinesisClient
common_aws.CredentialConfig
@ -86,7 +85,7 @@ func (k *KinesisOutput) Close() error {
return nil
}
func (k *KinesisOutput) SetSerializer(serializer serializers.Serializer) {
func (k *KinesisOutput) SetSerializer(serializer telegraf.Serializer) {
k.serializer = serializer
}

View File

@ -12,7 +12,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/serializers"
"github.com/influxdata/telegraf/plugins/serializers/influx"
"github.com/influxdata/telegraf/testutil"
)
@ -566,11 +565,7 @@ func (m *mockKinesisPutRecords) AssertRequests(
}
}
func createTestMetric(
t *testing.T,
name string,
serializer serializers.Serializer,
) (telegraf.Metric, []byte) {
func createTestMetric(t *testing.T, name string, serializer telegraf.Serializer) (telegraf.Metric, []byte) {
metric := testutil.TestMetric(1, name)
data, err := serializer.Serialize(metric)
@ -579,11 +574,7 @@ func createTestMetric(
return metric, data
}
func createTestMetrics(
t *testing.T,
count uint32,
serializer serializers.Serializer,
) ([]telegraf.Metric, [][]byte) {
func createTestMetrics(t *testing.T, count uint32, serializer telegraf.Serializer) ([]telegraf.Metric, [][]byte) {
metrics := make([]telegraf.Metric, 0, count)
metricsData := make([][]byte, 0, count)

View File

@ -14,7 +14,6 @@ import (
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/plugins/common/mqtt"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -36,7 +35,7 @@ type MQTT struct {
mqtt.MqttConfig
client mqtt.Client
serializer serializers.Serializer
serializer telegraf.Serializer
generator *TopicNameGenerator
homieDeviceNameGenerator *HomieGenerator
@ -118,7 +117,7 @@ func (m *MQTT) Connect() error {
return err
}
func (m *MQTT) SetSerializer(serializer serializers.Serializer) {
func (m *MQTT) SetSerializer(serializer telegraf.Serializer) {
m.serializer = serializer
}

View File

@ -17,7 +17,6 @@ import (
"github.com/influxdata/telegraf/internal/choice"
"github.com/influxdata/telegraf/plugins/common/tls"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -39,7 +38,7 @@ type NATS struct {
conn *nats.Conn
jetstreamClient jetstream.JetStream
jetstreamStreamConfig *jetstream.StreamConfig
serializer serializers.Serializer
serializer telegraf.Serializer
}
// StreamConfig is the configuration for creating stream
@ -83,7 +82,7 @@ func (*NATS) SampleConfig() string {
return sampleConfig
}
func (n *NATS) SetSerializer(serializer serializers.Serializer) {
func (n *NATS) SetSerializer(serializer telegraf.Serializer) {
n.serializer = serializer
}

View File

@ -9,7 +9,6 @@ import (
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -21,14 +20,14 @@ type NSQ struct {
Log telegraf.Logger `toml:"-"`
producer *nsq.Producer
serializer serializers.Serializer
serializer telegraf.Serializer
}
func (*NSQ) SampleConfig() string {
return sampleConfig
}
func (n *NSQ) SetSerializer(serializer serializers.Serializer) {
func (n *NSQ) SetSerializer(serializer telegraf.Serializer) {
n.serializer = serializer
}

View File

@ -19,7 +19,6 @@ import (
"github.com/influxdata/telegraf/internal"
common_tls "github.com/influxdata/telegraf/plugins/common/tls"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -32,7 +31,7 @@ type SocketWriter struct {
common_tls.ClientConfig
Log telegraf.Logger `toml:"-"`
serializers.Serializer
serializer telegraf.Serializer
encoder internal.ContentEncoder
@ -43,8 +42,8 @@ func (*SocketWriter) SampleConfig() string {
return sampleConfig
}
func (sw *SocketWriter) SetSerializer(s serializers.Serializer) {
sw.Serializer = s
func (sw *SocketWriter) SetSerializer(s telegraf.Serializer) {
sw.serializer = s
}
func (sw *SocketWriter) Connect() error {
@ -141,7 +140,7 @@ func (sw *SocketWriter) Write(metrics []telegraf.Metric) error {
}
for _, m := range metrics {
bs, err := sw.Serialize(m)
bs, err := sw.serializer.Serialize(m)
if err != nil {
sw.Log.Debugf("Could not serialize metric: %v", err)
continue

View File

@ -19,7 +19,7 @@ func newSocketWriter(t *testing.T, addr string) *SocketWriter {
require.NoError(t, serializer.Init())
return &SocketWriter{
Address: addr,
Serializer: serializer,
serializer: serializer,
}
}
@ -79,12 +79,12 @@ func TestSocketWriter_unixgram(t *testing.T) {
func testSocketWriterStream(t *testing.T, sw *SocketWriter, lconn net.Conn) {
metrics := []telegraf.Metric{testutil.TestMetric(1, "test")}
mbs1out, err := sw.Serialize(metrics[0])
mbs1out, err := sw.serializer.Serialize(metrics[0])
require.NoError(t, err)
mbs1out, err = sw.encoder.Encode(mbs1out)
require.NoError(t, err)
metrics = append(metrics, testutil.TestMetric(2, "test"))
mbs2out, err := sw.Serialize(metrics[1])
mbs2out, err := sw.serializer.Serialize(metrics[1])
require.NoError(t, err)
mbs2out, err = sw.encoder.Encode(mbs2out)
require.NoError(t, err)
@ -104,13 +104,13 @@ func testSocketWriterStream(t *testing.T, sw *SocketWriter, lconn net.Conn) {
func testSocketWriterPacket(t *testing.T, sw *SocketWriter, lconn net.PacketConn) {
metrics := []telegraf.Metric{testutil.TestMetric(1, "test")}
mbs1out, err := sw.Serialize(metrics[0])
mbs1out, err := sw.serializer.Serialize(metrics[0])
require.NoError(t, err)
mbs1out, err = sw.encoder.Encode(mbs1out)
require.NoError(t, err)
mbs1str := string(mbs1out)
metrics = append(metrics, testutil.TestMetric(2, "test"))
mbs2out, err := sw.Serialize(metrics[1])
mbs2out, err := sw.serializer.Serialize(metrics[1])
require.NoError(t, err)
mbs2out, err = sw.encoder.Encode(mbs2out)
require.NoError(t, err)
@ -191,7 +191,7 @@ func TestSocketWriter_Write_reconnect(t *testing.T) {
wg.Wait()
require.NoError(t, lerr)
mbsout, err := sw.Serialize(metrics[0])
mbsout, err := sw.serializer.Serialize(metrics[0])
require.NoError(t, err)
buf := make([]byte, 256)
n, err := lconn.Read(buf)

View File

@ -14,7 +14,6 @@ import (
"github.com/influxdata/telegraf/config"
common_tls "github.com/influxdata/telegraf/plugins/common/tls"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -35,7 +34,7 @@ type STOMP struct {
conn net.Conn
stomp *stomp.Conn
serialize serializers.Serializer
serialize telegraf.Serializer
}
func (q *STOMP) Connect() error {
@ -71,7 +70,7 @@ func (q *STOMP) Connect() error {
return nil
}
func (q *STOMP) SetSerializer(serializer serializers.Serializer) {
func (q *STOMP) SetSerializer(serializer telegraf.Serializer) {
q.serialize = serializer
}

View File

@ -15,7 +15,6 @@ import (
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/models"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
"github.com/influxdata/telegraf/plugins/serializers/carbon2"
"github.com/influxdata/telegraf/plugins/serializers/graphite"
"github.com/influxdata/telegraf/plugins/serializers/prometheus"
@ -57,7 +56,7 @@ type SumoLogic struct {
Log telegraf.Logger `toml:"-"`
client *http.Client
serializer serializers.Serializer
serializer telegraf.Serializer
headers map[string]string
}
@ -66,7 +65,7 @@ func (*SumoLogic) SampleConfig() string {
return sampleConfig
}
func (s *SumoLogic) SetSerializer(serializer serializers.Serializer) {
func (s *SumoLogic) SetSerializer(serializer telegraf.Serializer) {
s.serializer = serializer
}
@ -82,7 +81,7 @@ func (s *SumoLogic) createClient() *http.Client {
func (s *SumoLogic) Connect() error {
s.headers = make(map[string]string)
var serializer serializers.Serializer
var serializer telegraf.Serializer
if unwrapped, ok := s.serializer.(*models.RunningSerializer); ok {
serializer = unwrapped.Serializer
} else {

View File

@ -16,7 +16,6 @@ import (
"github.com/influxdata/telegraf/plugins/common/proxy"
"github.com/influxdata/telegraf/plugins/common/tls"
"github.com/influxdata/telegraf/plugins/outputs"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -42,7 +41,7 @@ type WebSocket struct {
tls.ClientConfig
conn *ws.Conn
serializer serializers.Serializer
serializer telegraf.Serializer
}
func (*WebSocket) SampleConfig() string {
@ -50,7 +49,7 @@ func (*WebSocket) SampleConfig() string {
}
// SetSerializer implements serializers.SerializerOutput.
func (w *WebSocket) SetSerializer(serializer serializers.Serializer) {
func (w *WebSocket) SetSerializer(serializer telegraf.Serializer) {
w.serializer = serializer
}

View File

@ -15,7 +15,6 @@ import (
"github.com/influxdata/telegraf/internal/process"
"github.com/influxdata/telegraf/plugins/parsers/influx"
"github.com/influxdata/telegraf/plugins/processors"
"github.com/influxdata/telegraf/plugins/serializers"
)
//go:embed sample.conf
@ -28,7 +27,7 @@ type Execd struct {
Log telegraf.Logger
parser telegraf.Parser
serializer serializers.Serializer
serializer telegraf.Serializer
acc telegraf.Accumulator
process *process.Process
}

View File

@ -101,7 +101,7 @@ func (s *Serializer) SerializeBatch(metrics []telegraf.Metric) ([]byte, error) {
func init() {
serializers.Add("binary",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)

View File

@ -112,16 +112,8 @@ func (s *Serializer) createObject(metric telegraf.Metric) []byte {
func init() {
serializers.Add("carbon2",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.Format = cfg.Carbon2Format
s.SanitizeReplaceChar = cfg.Carbon2SanitizeReplaceChar
return nil
}

View File

@ -192,7 +192,7 @@ func (s *Serializer) createEvent(m telegraf.Metric) (*cloudevents.Event, error)
func init() {
serializers.Add("cloudevents",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)

View File

@ -238,18 +238,8 @@ func (s *Serializer) writeDataOrdered(metric telegraf.Metric) error {
func init() {
serializers.Add("csv",
func() serializers.Serializer {
func() telegraf.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

@ -355,20 +355,8 @@ func compatibleSanitize(name, value string) string {
func init() {
serializers.Add("graphite",
func() serializers.Serializer {
func() telegraf.Serializer {
return &GraphiteSerializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *GraphiteSerializer) InitFromConfig(cfg *serializers.Config) error {
s.Prefix = cfg.Prefix
s.Templates = cfg.Templates
s.StrictRegex = cfg.GraphiteStrictRegex
s.TagSupport = cfg.GraphiteTagSupport
s.TagSanitizeMode = cfg.GraphiteTagSanitizeMode
s.Separator = cfg.GraphiteSeparator
return nil
}

View File

@ -328,17 +328,8 @@ func appendStringField(buf []byte, value string) []byte {
func init() {
serializers.Add("influx",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.MaxLineBytes = cfg.InfluxMaxLineBytes
s.SortFields = cfg.InfluxSortFields
s.UintSupport = cfg.InfluxUintSupport
return nil
}

View File

@ -162,19 +162,8 @@ func (s *Serializer) transform(obj interface{}) (interface{}, error) {
func init() {
serializers.Add("json",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.TimestampUnits = config.Duration(cfg.TimestampUnits)
s.TimestampFormat = cfg.TimestampFormat
s.Transformation = cfg.Transformation
s.NestedFieldsInclude = cfg.JSONNestedFieldInclude
s.NestedFieldsExclude = cfg.JSONNestedFieldExclude
return nil
}

View File

@ -40,13 +40,8 @@ func (s *Serializer) SerializeBatch(metrics []telegraf.Metric) ([]byte, error) {
func init() {
serializers.Add("msgpack",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(_ *serializers.Config) error {
return nil
}

View File

@ -130,13 +130,8 @@ func verifyValue(v interface{}) bool {
func init() {
serializers.Add("nowmetric",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(_ *serializers.Config) error {
return nil
}

View File

@ -88,18 +88,8 @@ func (s *Serializer) SerializeBatch(metrics []telegraf.Metric) ([]byte, error) {
func init() {
serializers.Add("prometheus",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.FormatConfig.CompactEncoding = cfg.PrometheusCompactEncoding
s.FormatConfig.SortMetrics = cfg.PrometheusSortMetrics
s.FormatConfig.StringAsLabel = cfg.PrometheusStringAsLabel
s.FormatConfig.ExportTimestamp = cfg.PrometheusExportTimestamp
return nil
}

View File

@ -350,16 +350,8 @@ func (sl sortableLabels) Swap(i, j int) {
func init() {
serializers.Add("prometheusremotewrite",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.SortMetrics = cfg.PrometheusSortMetrics
s.StringAsLabel = cfg.PrometheusStringAsLabel
return nil
}

View File

@ -1,14 +1,9 @@
package serializers
import (
"fmt"
"time"
"github.com/influxdata/telegraf"
)
import "github.com/influxdata/telegraf"
// Creator is the function to create a new serializer
type Creator func() Serializer
type Creator func() telegraf.Serializer
// Serializers contains the registry of all known serializers (following the new style)
var Serializers = make(map[string]Creator)
@ -17,157 +12,3 @@ var Serializers = make(map[string]Creator)
func Add(name string, creator Creator) {
Serializers[name] = creator
}
// SerializerOutput is an interface for output plugins that are able to
// serialize telegraf metrics into arbitrary data formats.
type SerializerOutput interface {
// SetSerializer sets the serializer function for the interface.
SetSerializer(serializer Serializer)
}
// Serializer is an interface defining functions that a serializer plugin must
// satisfy.
//
// Implementations of this interface should be reentrant but are not required
// to be thread-safe.
type Serializer interface {
// Serialize takes a single telegraf metric and turns it into a byte buffer.
// separate metrics should be separated by a newline, and there should be
// a newline at the end of the buffer.
//
// New plugins should use SerializeBatch instead to allow for non-line
// delimited metrics.
Serialize(metric telegraf.Metric) ([]byte, error)
// SerializeBatch takes an array of telegraf metric and serializes it into
// a byte buffer. This method is not required to be suitable for use with
// line oriented framing.
SerializeBatch(metrics []telegraf.Metric) ([]byte, error)
}
// SerializerCompatibility is an interface for backward-compatible initialization of serializers
type SerializerCompatibility interface {
// InitFromConfig sets the serializers internal variables from the old-style config
InitFromConfig(config *Config) error
}
// Config is a struct that covers the data types needed for all serializer types,
// and can be used to instantiate _any_ of the serializers.
type Config struct {
// DataFormat can be one of the serializer types listed in NewSerializer.
DataFormat string `toml:"data_format"`
// Carbon2 metric format.
Carbon2Format string `toml:"carbon2_format"`
// Character used for metric name sanitization in Carbon2.
Carbon2SanitizeReplaceChar string `toml:"carbon2_sanitize_replace_char"`
// Separator for CSV
CSVSeparator string `toml:"csv_separator"`
// Output a CSV header for naming the columns
CSVHeader bool `toml:"csv_header"`
// Prefix the tag and field columns for CSV format
CSVPrefix bool `toml:"csv_column_prefix"`
// Support tags in graphite protocol
GraphiteTagSupport bool `toml:"graphite_tag_support"`
// Support tags which follow the spec
GraphiteTagSanitizeMode string `toml:"graphite_tag_sanitize_mode"`
// Character for separating metric name and field for Graphite tags
GraphiteSeparator string `toml:"graphite_separator"`
// Regex string
GraphiteStrictRegex string `toml:"graphite_strict_sanitize_regex"`
// Maximum line length in bytes; influx format only
InfluxMaxLineBytes int `toml:"influx_max_line_bytes"`
// Sort field keys, set to true only when debugging as it less performant
// than unsorted fields; influx format only
InfluxSortFields bool `toml:"influx_sort_fields"`
// Support unsigned integer output; influx format only
InfluxUintSupport bool `toml:"influx_uint_support"`
// Omit timestamp from output; influx format only
InfluxOmitTimestamp bool `toml:"influx_omit_timestamp"`
// Prefix to add to all measurements, only supports Graphite
Prefix string `toml:"prefix"`
// Template for converting telegraf metrics into Graphite
// only supports Graphite
Template string `toml:"template"`
// Templates same Template, but multiple
Templates []string `toml:"templates"`
// Timestamp units to use for JSON formatted output
TimestampUnits time.Duration `toml:"timestamp_units"`
// Timestamp format to use for JSON and CSV formatted output
TimestampFormat string `toml:"timestamp_format"`
// Transformation as JSONata expression to use for JSON formatted output
Transformation string `toml:"transformation"`
// Field filter for interpreting data as nested JSON for JSON serializer
JSONNestedFieldInclude []string `toml:"json_nested_fields_include"`
JSONNestedFieldExclude []string `toml:"json_nested_fields_exclude"`
// Include HEC routing fields for splunkmetric output
HecRouting bool `toml:"hec_routing"`
// Enable Splunk MultiMetric output (Splunk 8.0+)
SplunkmetricMultiMetric bool `toml:"splunkmetric_multi_metric"`
// Omit the Splunk Event "metric" tag
SplunkmetricOmitEventTag bool `toml:"splunkmetric_omit_event_tag"`
// Point tags to use as the source name for Wavefront (if none found, host will be used).
WavefrontSourceOverride []string `toml:"wavefront_source_override"`
// Use Strict rules to sanitize metric and tag names from invalid characters for Wavefront
// When enabled forward slash (/) and comma (,) will be accepted
WavefrontUseStrict bool `toml:"wavefront_use_strict"`
// Convert "_" in prefixes to "." for Wavefront
WavefrontDisablePrefixConversion bool `toml:"wavefront_disable_prefix_conversion"`
// Include the metric timestamp on each sample.
PrometheusExportTimestamp bool `toml:"prometheus_export_timestamp"`
// Sort prometheus metric families and metric samples. Useful for
// debugging.
PrometheusSortMetrics bool `toml:"prometheus_sort_metrics"`
// Output string fields as metric labels; when false string fields are
// discarded.
PrometheusStringAsLabel bool `toml:"prometheus_string_as_label"`
// Encode metrics without HELP metadata. This helps reduce the payload size.
PrometheusCompactEncoding bool `toml:"prometheus_compact_encoding"`
}
// NewSerializer a Serializer interface based on the given config.
func NewSerializer(config *Config) (Serializer, error) {
creator, found := Serializers[config.DataFormat]
if !found {
return nil, fmt.Errorf("invalid data format: %s", config.DataFormat)
}
// Try to create new-style serializers the old way...
serializer := creator()
p, ok := serializer.(SerializerCompatibility)
if !ok {
return nil, fmt.Errorf("serializer for %q cannot be created the old way", config.DataFormat)
}
err := p.InitFromConfig(config)
return serializer, err
}

View File

@ -210,17 +210,8 @@ func verifyValue(v interface{}) (value interface{}, valid bool) {
func init() {
serializers.Add("splunkmetric",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.HecRouting = cfg.HecRouting
s.MultiMetric = cfg.SplunkmetricMultiMetric
s.OmitEventTag = cfg.SplunkmetricOmitEventTag
return nil
}

View File

@ -95,7 +95,7 @@ func (s *Serializer) SerializeBatch(metrics []telegraf.Metric) ([]byte, error) {
func init() {
serializers.Add("template",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)

View File

@ -189,18 +189,8 @@ func (b *buffer) WriteFloat64(val float64) {
func init() {
serializers.Add("wavefront",
func() serializers.Serializer {
func() telegraf.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.Prefix = cfg.Prefix
s.UseStrict = cfg.WavefrontUseStrict
s.SourceOverride = cfg.WavefrontSourceOverride
s.DisablePrefixConversions = cfg.WavefrontDisablePrefixConversion
return nil
}