Skip to content

Commit 1fdcbd7

Browse files
[chore] [receiver/filelog] test: add benchmark for File Log receiver (#38171)
#### Description Related to #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 scope of 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 help us measure the performance impact of [removing batching from LogEmitter](#35456) after it is [added in File consumer](#35455). #### Link to tracking issue - Needed for #35456
1 parent 3b2390a commit 1fdcbd7

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed
+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package filelogreceiver
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"math"
10+
"testing"
11+
"time"
12+
13+
"github.com/stretchr/testify/require"
14+
"go.opentelemetry.io/collector/component/componenttest"
15+
"go.opentelemetry.io/collector/consumer/consumertest"
16+
"go.opentelemetry.io/collector/receiver/receivertest"
17+
18+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/file"
19+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver/internal/metadata"
20+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver/internal/testutil"
21+
)
22+
23+
func BenchmarkReadSingleStaticFile(b *testing.B) {
24+
for n := range 6 {
25+
numLines := int(math.Pow(10, float64(n)))
26+
b.Run(fmt.Sprintf("%d-lines", numLines), func(b *testing.B) {
27+
benchmarkReadSingleStaticFile(b, numLines)
28+
})
29+
}
30+
}
31+
32+
func benchmarkReadSingleStaticFile(b *testing.B, numLines int) {
33+
logFileGenerator := testutil.NewLogFileGenerator(b)
34+
logFilePath := logFileGenerator.GenerateLogFile(numLines)
35+
36+
cfg := &FileLogConfig{
37+
InputConfig: func() file.Config {
38+
c := file.NewConfig()
39+
c.Include = []string{logFilePath}
40+
c.PollInterval = time.Microsecond
41+
c.StartAt = "beginning"
42+
return *c
43+
}(),
44+
}
45+
sink := new(consumertest.LogsSink)
46+
f := NewFactory()
47+
48+
b.ResetTimer()
49+
for range b.N {
50+
rcvr, err := f.CreateLogs(context.Background(), receivertest.NewNopSettings(metadata.Type), cfg, sink)
51+
require.NoError(b, err)
52+
require.NoError(b, rcvr.Start(context.Background(), componenttest.NewNopHost()))
53+
54+
require.Eventually(b, expectNLogs(sink, numLines), 2*time.Second, 2*time.Microsecond)
55+
sink.Reset()
56+
57+
require.NoError(b, rcvr.Shutdown(context.Background()))
58+
}
59+
}
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 // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver/internal/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 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)