204 lines
4.4 KiB
Go
204 lines
4.4 KiB
Go
package buffer
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
"testing"
|
|
|
|
"github.com/influxdata/telegraf"
|
|
"github.com/influxdata/telegraf/testutil"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var metricList = []telegraf.Metric{
|
|
testutil.TestMetric(2, "mymetric1"),
|
|
testutil.TestMetric(1, "mymetric2"),
|
|
testutil.TestMetric(11, "mymetric3"),
|
|
testutil.TestMetric(15, "mymetric4"),
|
|
testutil.TestMetric(8, "mymetric5"),
|
|
}
|
|
|
|
func makeBench5(b *testing.B, freq, batchSize int) {
|
|
const k = 1000
|
|
var wg sync.WaitGroup
|
|
buf := NewBuffer(10000)
|
|
m := testutil.TestMetric(1, "mymetric")
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
buf.Add(m, m, m, m, m)
|
|
if i%(freq*k) == 0 {
|
|
wg.Add(1)
|
|
go func() {
|
|
buf.Batch(batchSize * k)
|
|
wg.Done()
|
|
}()
|
|
}
|
|
}
|
|
// Flush
|
|
buf.Batch(b.N)
|
|
wg.Wait()
|
|
|
|
}
|
|
func makeBenchStrict(b *testing.B, freq, batchSize int) {
|
|
const k = 1000
|
|
var count uint64
|
|
var wg sync.WaitGroup
|
|
buf := NewBuffer(10000)
|
|
m := testutil.TestMetric(1, "mymetric")
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
buf.Add(m)
|
|
if i%(freq*k) == 0 {
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
l := len(buf.Batch(batchSize * k))
|
|
atomic.AddUint64(&count, uint64(l))
|
|
}()
|
|
}
|
|
}
|
|
// Flush
|
|
wg.Add(1)
|
|
go func() {
|
|
l := len(buf.Batch(b.N))
|
|
atomic.AddUint64(&count, uint64(l))
|
|
wg.Done()
|
|
}()
|
|
|
|
wg.Wait()
|
|
if count != uint64(b.N) {
|
|
b.Errorf("not all metrics came out. %d of %d", count, b.N)
|
|
}
|
|
}
|
|
func makeBench(b *testing.B, freq, batchSize int) {
|
|
const k = 1000
|
|
var wg sync.WaitGroup
|
|
buf := NewBuffer(10000)
|
|
m := testutil.TestMetric(1, "mymetric")
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
buf.Add(m)
|
|
if i%(freq*k) == 0 {
|
|
wg.Add(1)
|
|
go func() {
|
|
buf.Batch(batchSize * k)
|
|
wg.Done()
|
|
}()
|
|
}
|
|
}
|
|
wg.Wait()
|
|
// Flush
|
|
buf.Batch(b.N)
|
|
}
|
|
|
|
func BenchmarkBufferBatch5Add(b *testing.B) {
|
|
makeBench5(b, 100, 101)
|
|
}
|
|
func BenchmarkBufferBigInfrequentBatchCatchup(b *testing.B) {
|
|
makeBench(b, 100, 101)
|
|
}
|
|
func BenchmarkBufferOftenBatch(b *testing.B) {
|
|
makeBench(b, 1, 1)
|
|
}
|
|
func BenchmarkBufferAlmostBatch(b *testing.B) {
|
|
makeBench(b, 10, 9)
|
|
}
|
|
func BenchmarkBufferSlowBatch(b *testing.B) {
|
|
makeBench(b, 10, 1)
|
|
}
|
|
func BenchmarkBufferBatchNoDrop(b *testing.B) {
|
|
makeBenchStrict(b, 1, 4)
|
|
}
|
|
func BenchmarkBufferCatchup(b *testing.B) {
|
|
buf := NewBuffer(10000)
|
|
m := testutil.TestMetric(1, "mymetric")
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
buf.Add(m)
|
|
}
|
|
buf.Batch(b.N)
|
|
}
|
|
|
|
func BenchmarkAddMetrics(b *testing.B) {
|
|
buf := NewBuffer(10000)
|
|
m := testutil.TestMetric(1, "mymetric")
|
|
for n := 0; n < b.N; n++ {
|
|
buf.Add(m)
|
|
}
|
|
}
|
|
|
|
func TestNewBufferBasicFuncs(t *testing.T) {
|
|
b := NewBuffer(10)
|
|
MetricsDropped.Set(0)
|
|
MetricsWritten.Set(0)
|
|
|
|
assert.True(t, b.IsEmpty())
|
|
assert.Zero(t, b.Len())
|
|
assert.Zero(t, MetricsDropped.Get())
|
|
assert.Zero(t, MetricsWritten.Get())
|
|
|
|
m := testutil.TestMetric(1, "mymetric")
|
|
b.Add(m)
|
|
assert.False(t, b.IsEmpty())
|
|
assert.Equal(t, b.Len(), 1)
|
|
assert.Equal(t, int64(0), MetricsDropped.Get())
|
|
assert.Equal(t, int64(1), MetricsWritten.Get())
|
|
|
|
b.Add(metricList...)
|
|
assert.False(t, b.IsEmpty())
|
|
assert.Equal(t, b.Len(), 6)
|
|
assert.Equal(t, int64(0), MetricsDropped.Get())
|
|
assert.Equal(t, int64(6), MetricsWritten.Get())
|
|
}
|
|
|
|
func TestDroppingMetrics(t *testing.T) {
|
|
b := NewBuffer(10)
|
|
MetricsDropped.Set(0)
|
|
MetricsWritten.Set(0)
|
|
|
|
// Add up to the size of the buffer
|
|
b.Add(metricList...)
|
|
b.Add(metricList...)
|
|
assert.False(t, b.IsEmpty())
|
|
assert.Equal(t, b.Len(), 10)
|
|
assert.Equal(t, int64(0), MetricsDropped.Get())
|
|
assert.Equal(t, int64(10), MetricsWritten.Get())
|
|
|
|
// Add 5 more and verify they were dropped
|
|
b.Add(metricList...)
|
|
assert.False(t, b.IsEmpty())
|
|
assert.Equal(t, b.Len(), 10)
|
|
assert.Equal(t, int64(5), MetricsDropped.Get())
|
|
assert.Equal(t, int64(15), MetricsWritten.Get())
|
|
}
|
|
|
|
func TestGettingBatches(t *testing.T) {
|
|
b := NewBuffer(20)
|
|
MetricsDropped.Set(0)
|
|
MetricsWritten.Set(0)
|
|
|
|
// Verify that the buffer returned is smaller than requested when there are
|
|
// not as many items as requested.
|
|
b.Add(metricList...)
|
|
batch := b.Batch(10)
|
|
assert.Len(t, batch, 5)
|
|
|
|
// Verify that the buffer is now empty
|
|
assert.True(t, b.IsEmpty())
|
|
assert.Zero(t, b.Len())
|
|
assert.Zero(t, MetricsDropped.Get())
|
|
assert.Equal(t, int64(5), MetricsWritten.Get())
|
|
|
|
// Verify that the buffer returned is not more than the size requested
|
|
b.Add(metricList...)
|
|
batch = b.Batch(3)
|
|
assert.Len(t, batch, 3)
|
|
|
|
// Verify that buffer is not empty
|
|
assert.False(t, b.IsEmpty())
|
|
assert.Equal(t, b.Len(), 2)
|
|
assert.Equal(t, int64(0), MetricsDropped.Get())
|
|
assert.Equal(t, int64(10), MetricsWritten.Get())
|
|
}
|