From 02473069f48293ca9500e0f6e5382ea1826505af Mon Sep 17 00:00:00 2001 From: Joshua Powers Date: Mon, 13 Nov 2023 01:30:19 -0700 Subject: [PATCH] chore: Add metric and batch benchmark to serializers (#14277) --- plugins/serializers/carbon2/carbon2_test.go | 24 ++++++++++ .../cloudevents/cloudevents_test.go | 44 +++++++++---------- plugins/serializers/csv/csv_test.go | 24 ++++++++++ plugins/serializers/graphite/graphite_test.go | 24 ++++++++++ plugins/serializers/influx/influx_test.go | 24 ++++++++++ plugins/serializers/json/json_test.go | 24 ++++++++++ plugins/serializers/msgpack/msgpack_test.go | 22 ++++++++++ .../serializers/nowmetric/nowmetric_test.go | 24 ++++++++++ .../serializers/prometheus/prometheus_test.go | 24 ++++++++++ .../prometheusremotewrite_test.go | 22 ++++++++++ .../splunkmetric/splunkmetric_test.go | 22 ++++++++++ plugins/serializers/template/template_test.go | 24 ++++++++++ plugins/serializers/test_benchmark.go | 31 +++++++++++++ .../serializers/wavefront/wavefront_test.go | 28 ++---------- 14 files changed, 312 insertions(+), 49 deletions(-) create mode 100644 plugins/serializers/test_benchmark.go diff --git a/plugins/serializers/carbon2/carbon2_test.go b/plugins/serializers/carbon2/carbon2_test.go index 43777e6f0..21c408236 100644 --- a/plugins/serializers/carbon2/carbon2_test.go +++ b/plugins/serializers/carbon2/carbon2_test.go @@ -9,6 +9,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" ) func TestSerializeMetricFloat(t *testing.T) { @@ -416,3 +417,26 @@ func TestSerializeMetricIsProperlySanitized(t *testing.T) { }) } } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/cloudevents/cloudevents_test.go b/plugins/serializers/cloudevents/cloudevents_test.go index a5b3e65c9..435ac1c8d 100644 --- a/plugins/serializers/cloudevents/cloudevents_test.go +++ b/plugins/serializers/cloudevents/cloudevents_test.go @@ -10,7 +10,6 @@ import ( "path/filepath" "strings" "testing" - "time" cloudevents "github.com/cloudevents/sdk-go/v2" "github.com/gofrs/uuid/v5" @@ -19,10 +18,10 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/config" - "github.com/influxdata/telegraf/metric" "github.com/influxdata/telegraf/models" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/parsers/influx" + "github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/testutil" ) @@ -235,28 +234,25 @@ func (*dummygen) NewV7() (uuid.UUID, error) { return uuid.UUID([16]byte{}), errors.New("wrong type") } -/* Benchmarks */ -func BenchmarkSerializer(b *testing.B) { - m := metric.New( - "test", - map[string]string{ - "source": "somehost.company.com", - "host": "localhost", - "status": "healthy", - }, - map[string]interface{}{ - "temperature": 23.5, - "operating_hours": 4242, - "connections": 123, - "standby": true, - "SN": "DC5423DE4CE/2", - }, - time.Now(), - ) - - serializer := &Serializer{} - for n := 0; n < b.N; n++ { - _, err := serializer.Serialize(m) +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) require.NoError(b, err) } } diff --git a/plugins/serializers/csv/csv_test.go b/plugins/serializers/csv/csv_test.go index ade0c10cf..62c21cc92 100644 --- a/plugins/serializers/csv/csv_test.go +++ b/plugins/serializers/csv/csv_test.go @@ -11,6 +11,7 @@ import ( "github.com/stretchr/testify/require" "github.com/influxdata/telegraf/plugins/parsers/influx" + "github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/testutil" ) @@ -201,3 +202,26 @@ func loadTestConfiguration(filename string) (*Config, []string, error) { func loadCSV(filename string) ([]byte, error) { return os.ReadFile(filename) } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/graphite/graphite_test.go b/plugins/serializers/graphite/graphite_test.go index 2882587ca..f4ad3501d 100644 --- a/plugins/serializers/graphite/graphite_test.go +++ b/plugins/serializers/graphite/graphite_test.go @@ -11,6 +11,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" ) var defaultTags = map[string]string{ @@ -1216,3 +1217,26 @@ func TestSerializeBatchWithTagsSupport(t *testing.T) { }) } } + +func BenchmarkSerialize(b *testing.B) { + s := &GraphiteSerializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &GraphiteSerializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/influx/influx_test.go b/plugins/serializers/influx/influx_test.go index 7bf3e60f8..36371f2f5 100644 --- a/plugins/serializers/influx/influx_test.go +++ b/plugins/serializers/influx/influx_test.go @@ -9,6 +9,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" ) var tests = []struct { @@ -531,3 +532,26 @@ func TestSerialize_SerializeBatch(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte("cpu value=42 0\ncpu value=42 0\n"), output) } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/json/json_test.go b/plugins/serializers/json/json_test.go index 34ea8dea6..d562ca79f 100644 --- a/plugins/serializers/json/json_test.go +++ b/plugins/serializers/json/json_test.go @@ -17,6 +17,7 @@ import ( "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/metric" "github.com/influxdata/telegraf/plugins/parsers/influx" + "github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/testutil" ) @@ -488,3 +489,26 @@ func loadJSON(filename string) (interface{}, error) { err = json.Unmarshal(buf, &data) return data, err } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/msgpack/msgpack_test.go b/plugins/serializers/msgpack/msgpack_test.go index a8ec169e5..fe9f706a3 100644 --- a/plugins/serializers/msgpack/msgpack_test.go +++ b/plugins/serializers/msgpack/msgpack_test.go @@ -7,6 +7,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/testutil" ) @@ -130,3 +131,24 @@ func TestSerializeBatch(t *testing.T) { testutil.RequireMetricEqual(t, m, toTelegrafMetric(*decodeM)) } } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/nowmetric/nowmetric_test.go b/plugins/serializers/nowmetric/nowmetric_test.go index 8eb6956ec..167963d46 100644 --- a/plugins/serializers/nowmetric/nowmetric_test.go +++ b/plugins/serializers/nowmetric/nowmetric_test.go @@ -10,6 +10,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" ) func TestSerializeMetricFloat(t *testing.T) { @@ -248,3 +249,26 @@ func TestSerializeInvalidFormat(t *testing.T) { s := &Serializer{Format: "foo"} require.Error(t, s.Init()) } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/prometheus/prometheus_test.go b/plugins/serializers/prometheus/prometheus_test.go index a7b2b8f9d..ca643c920 100644 --- a/plugins/serializers/prometheus/prometheus_test.go +++ b/plugins/serializers/prometheus/prometheus_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" + "github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/testutil" ) @@ -760,3 +761,26 @@ rpc_duration_seconds_count 2693 }) } } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/prometheusremotewrite/prometheusremotewrite_test.go b/plugins/serializers/prometheusremotewrite/prometheusremotewrite_test.go index d8eab63dc..60b524420 100644 --- a/plugins/serializers/prometheusremotewrite/prometheusremotewrite_test.go +++ b/plugins/serializers/prometheusremotewrite/prometheusremotewrite_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" + "github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/testutil" ) @@ -734,3 +735,24 @@ func protoToSamples(req *prompb.WriteRequest) model.Samples { } return samples } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/splunkmetric/splunkmetric_test.go b/plugins/serializers/splunkmetric/splunkmetric_test.go index e2cd7471f..df9193d7d 100644 --- a/plugins/serializers/splunkmetric/splunkmetric_test.go +++ b/plugins/serializers/splunkmetric/splunkmetric_test.go @@ -8,6 +8,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" ) func TestSerializeMetricFloat(t *testing.T) { @@ -266,3 +267,24 @@ func TestSerializeOmitEvent(t *testing.T) { expS := `{"time":0,"fields":{"metric_name:cpu.system":8,"metric_name:cpu.usage":42}}` require.Equal(t, expS, string(buf)) } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/template/template_test.go b/plugins/serializers/template/template_test.go index 1ee3bd6b6..fa0ae16ca 100644 --- a/plugins/serializers/template/template_test.go +++ b/plugins/serializers/template/template_test.go @@ -8,6 +8,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" ) func TestSerializer(t *testing.T) { @@ -179,3 +180,26 @@ func TestSerializeBatch(t *testing.T) { require.NoError(t, err) require.Equal(t, "0: cpu 42\n", string(singleBuf)) } + +func BenchmarkSerialize(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + metrics := serializers.BenchmarkMetrics(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.Serialize(metrics[i%len(metrics)]) + require.NoError(b, err) + } +} + +func BenchmarkSerializeBatch(b *testing.B) { + s := &Serializer{} + require.NoError(b, s.Init()) + m := serializers.BenchmarkMetrics(b) + metrics := m[:] + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := s.SerializeBatch(metrics) + require.NoError(b, err) + } +} diff --git a/plugins/serializers/test_benchmark.go b/plugins/serializers/test_benchmark.go new file mode 100644 index 000000000..ce4e8487e --- /dev/null +++ b/plugins/serializers/test_benchmark.go @@ -0,0 +1,31 @@ +package serializers + +import ( + "testing" + "time" + + "github.com/influxdata/telegraf" + "github.com/influxdata/telegraf/metric" +) + +func BenchmarkMetrics(b *testing.B) [4]telegraf.Metric { + b.Helper() + now := time.Now() + tags := map[string]string{ + "cpu": "cpu0", + "host": "realHost", + } + newMetric := func(v interface{}) telegraf.Metric { + fields := map[string]interface{}{ + "usage_idle": v, + } + m := metric.New("cpu", tags, fields, now) + return m + } + return [4]telegraf.Metric{ + newMetric(91.5), + newMetric(91), + newMetric(true), + newMetric(false), + } +} diff --git a/plugins/serializers/wavefront/wavefront_test.go b/plugins/serializers/wavefront/wavefront_test.go index a14174256..6d9aa03bf 100755 --- a/plugins/serializers/wavefront/wavefront_test.go +++ b/plugins/serializers/wavefront/wavefront_test.go @@ -9,8 +9,8 @@ import ( "github.com/stretchr/testify/require" - "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" + "github.com/influxdata/telegraf/plugins/serializers" ) func TestBuildTags(t *testing.T) { @@ -285,31 +285,9 @@ func TestSerializeMetricPrefix(t *testing.T) { require.Equal(t, expS, mS) } -func benchmarkMetrics(b *testing.B) [4]telegraf.Metric { - b.Helper() - now := time.Now() - tags := map[string]string{ - "cpu": "cpu0", - "host": "realHost", - } - newMetric := func(v interface{}) telegraf.Metric { - fields := map[string]interface{}{ - "usage_idle": v, - } - m := metric.New("cpu", tags, fields, now) - return m - } - return [4]telegraf.Metric{ - newMetric(91.5), - newMetric(91), - newMetric(true), - newMetric(false), - } -} - func BenchmarkSerialize(b *testing.B) { s := &Serializer{} - metrics := benchmarkMetrics(b) + metrics := serializers.BenchmarkMetrics(b) b.ResetTimer() for i := 0; i < b.N; i++ { _, err := s.Serialize(metrics[i%len(metrics)]) @@ -319,7 +297,7 @@ func BenchmarkSerialize(b *testing.B) { func BenchmarkSerializeBatch(b *testing.B) { s := &Serializer{} - m := benchmarkMetrics(b) + m := serializers.BenchmarkMetrics(b) metrics := m[:] b.ResetTimer() for i := 0; i < b.N; i++ {