Skip to content

Commit 98c2810

Browse files
[chore] [receiver/filelog] test: add benchmark for File Log receiver
Related to open-telemetry#38054. The File Log receiver benchmark has a scope that is larger than both the [FIle consumer benchmark](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a826350bab9388e7ab8179f1e02c68177d83f0b4/pkg/stanza/fileconsumer/benchmark_test.go) and the [File input benchmark](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a826350bab9388e7ab8179f1e02c68177d83f0b4/pkg/stanza/operator/input/file/benchmark_test.go). Compared to the File input benchmark, the File Log receiver benchmark includes: - translating of Stanza entries to pdata logs ([converter.ConvertEntries](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a826350bab9388e7ab8179f1e02c68177d83f0b4/pkg/stanza/adapter/converter.go#L20)). - batching of logs in [LogEmitter](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a826350bab9388e7ab8179f1e02c68177d83f0b4/pkg/stanza/operator/helper/emitter.go#L103). This new benchmark should be useful when comparing performance with and without batching in LogEmitter, see open-telemetry#35456.
1 parent a826350 commit 98c2810

File tree

2 files changed

+136
-0
lines changed

2 files changed

+136
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package filelogreceiver
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"testing"
10+
"time"
11+
12+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/file"
13+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver/internal/metadata"
14+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver/internal/testutil"
15+
"github.com/stretchr/testify/require"
16+
"go.opentelemetry.io/collector/component/componenttest"
17+
"go.opentelemetry.io/collector/consumer/consumertest"
18+
"go.opentelemetry.io/collector/receiver/receivertest"
19+
)
20+
21+
func BenchmarkReadSingleStaticFile(b *testing.B) {
22+
testCases := []struct {
23+
numLines int
24+
}{
25+
{
26+
numLines: 0,
27+
},
28+
{
29+
numLines: 1,
30+
},
31+
{
32+
numLines: 10,
33+
},
34+
{
35+
numLines: 20,
36+
},
37+
{
38+
numLines: 100,
39+
},
40+
{
41+
numLines: 200,
42+
},
43+
{
44+
numLines: 1_000,
45+
},
46+
{
47+
numLines: 10_000,
48+
},
49+
}
50+
51+
for _, tc := range testCases {
52+
b.Run(fmt.Sprintf("%d-lines", tc.numLines), func(b *testing.B) {
53+
benchmarkReadSingleStaticFile(b, tc.numLines)
54+
})
55+
}
56+
}
57+
58+
func benchmarkReadSingleStaticFile(b *testing.B, numLines int) {
59+
logFileGenerator := testutil.NewLogFileGenerator(b)
60+
logFilePath := logFileGenerator.GenerateLogFile(numLines, 999)
61+
62+
cfg := &FileLogConfig{
63+
InputConfig: func() file.Config {
64+
c := file.NewConfig()
65+
c.Include = []string{logFilePath}
66+
c.PollInterval = time.Microsecond
67+
c.StartAt = "beginning"
68+
return *c
69+
}(),
70+
}
71+
sink := new(consumertest.LogsSink)
72+
f := NewFactory()
73+
74+
b.ResetTimer()
75+
for range b.N {
76+
rcvr, err := f.CreateLogs(context.Background(), receivertest.NewNopSettingsWithType(metadata.Type), cfg, sink)
77+
require.NoError(b, err)
78+
require.NoError(b, rcvr.Start(context.Background(), componenttest.NewNopHost()))
79+
80+
require.Eventually(b, expectNLogs(sink, numLines), 2*time.Second, 2*time.Microsecond)
81+
sink.Reset()
82+
83+
require.NoError(b, rcvr.Shutdown(context.Background()))
84+
}
85+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package testutil
5+
6+
import (
7+
"math/rand/v2"
8+
"os"
9+
"testing"
10+
11+
"github.com/stretchr/testify/require"
12+
)
13+
14+
type LogFileGenerator struct {
15+
tb testing.TB
16+
charset []byte
17+
logLines [][]byte
18+
}
19+
20+
func NewLogFileGenerator(tb testing.TB) *LogFileGenerator {
21+
logFileGenerator := &LogFileGenerator{
22+
tb: tb,
23+
charset: []byte("abcdefghijklmnopqrstuvwxyz"),
24+
}
25+
logFileGenerator.logLines = logFileGenerator.generateLogLines(8, 999)
26+
return logFileGenerator
27+
}
28+
29+
func (g *LogFileGenerator) generateLogLines(numLines, lineLength int) (logLines [][]byte) {
30+
logLines = make([][]byte, numLines)
31+
for i := range numLines {
32+
logLines[i] = make([]byte, lineLength)
33+
for j := range lineLength {
34+
logLines[i][j] = g.charset[rand.IntN(len(g.charset))]
35+
}
36+
}
37+
return logLines
38+
}
39+
40+
func (g *LogFileGenerator) GenerateLogFile(numLines, lineLength int) (logFilePath string) {
41+
f, err := os.CreateTemp(g.tb.TempDir(), "")
42+
require.NoError(g.tb, err)
43+
g.tb.Cleanup(func() { _ = f.Close() })
44+
for range numLines {
45+
_, err := f.Write(g.logLines[rand.IntN(len(g.logLines))])
46+
require.NoError(g.tb, err)
47+
_, err = f.WriteString("\n")
48+
require.NoError(g.tb, err)
49+
}
50+
return f.Name()
51+
}

0 commit comments

Comments
 (0)