Skip to content

Commit 0f88dfa

Browse files
[chore] [pkg/stanza] test: add benchmark for File input (#38054)
This benchmark has a scope that sits between the [Stanza File consumer benchmark](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.120.0/pkg/stanza/fileconsumer/benchmark_test.go) and a File Log receiver benchmark (which currently does not exist). The major difference between the File consumer benchmark and the File input benchmark is that the File input benchmark includes measuring of the memory allocations made in the File input's [emit](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.120.0/pkg/stanza/operator/input/file/input.go#L40) function. This should allow to assess performance impact of this change: #37734, or any similar changes in the future.
1 parent bdb18ef commit 0f88dfa

File tree

12 files changed

+169
-10
lines changed

12 files changed

+169
-10
lines changed

pkg/stanza/fileconsumer/attrs/attrs_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111

1212
"github.com/stretchr/testify/assert"
1313

14-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
14+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
1515
)
1616

1717
func TestResolver(t *testing.T) {

pkg/stanza/fileconsumer/benchmark_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import (
1717
"go.opentelemetry.io/collector/component/componenttest"
1818

1919
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit"
20-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
2120
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint"
21+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
2222
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil"
2323
)
2424

pkg/stanza/fileconsumer/file_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/attrs"
2323
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit"
2424
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/emittest"
25-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
2625
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader"
2726
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/matcher"
27+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
2828
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper"
2929
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil"
3030
)

pkg/stanza/fileconsumer/internal/reader/factory_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ import (
1515

1616
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/attrs"
1717
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/emittest"
18-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
1918
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint"
2019
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/scanner"
20+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
2121
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/split"
2222
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/trim"
2323
)

pkg/stanza/fileconsumer/internal/reader/fingerprint_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import (
1111
"github.com/stretchr/testify/assert"
1212
"github.com/stretchr/testify/require"
1313

14-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
1514
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint"
1615
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/scanner"
16+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
1717
)
1818

1919
func TestReaderUpdateFingerprint(t *testing.T) {

pkg/stanza/fileconsumer/internal/reader/reader_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import (
1919

2020
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/attrs"
2121
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit"
22-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
2322
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint"
2423
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/scanner"
24+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
2525
internaltime "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/time"
2626
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/split"
2727
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/trim"

pkg/stanza/fileconsumer/internal/reader/split_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import (
1414
"go.uber.org/zap/zaptest"
1515

1616
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/textutils"
17-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
1817
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint"
1918
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/header"
19+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
2020
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator"
2121
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/parser/regex"
2222
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/split"

pkg/stanza/fileconsumer/internal/reader/validate_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"github.com/stretchr/testify/assert"
1313
"github.com/stretchr/testify/require"
1414

15-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
15+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
1616
)
1717

1818
// When a file it moved, we should detect that our old handle is still valid.

pkg/stanza/fileconsumer/rotation_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"go.uber.org/zap"
2020
"go.uber.org/zap/zaptest/observer"
2121

22-
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
22+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
2323
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil"
2424
)
2525

pkg/stanza/fileconsumer/internal/filetest/filetest.go renamed to pkg/stanza/internal/filetest/filetest.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4-
package filetest // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest"
4+
package filetest // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
55

66
import (
77
"math/rand/v2"
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package file
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"testing"
10+
"time"
11+
12+
"github.com/stretchr/testify/require"
13+
"go.opentelemetry.io/collector/component/componenttest"
14+
"go.uber.org/zap"
15+
16+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry"
17+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/filetest"
18+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator"
19+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil"
20+
)
21+
22+
func BenchmarkReadExistingLogs(b *testing.B) {
23+
testCases := []struct {
24+
numLines int
25+
}{
26+
{
27+
numLines: 0,
28+
},
29+
{
30+
numLines: 1,
31+
},
32+
{
33+
numLines: 2,
34+
},
35+
{
36+
numLines: 10,
37+
},
38+
{
39+
numLines: 20,
40+
},
41+
{
42+
numLines: 100,
43+
},
44+
{
45+
numLines: 1000,
46+
},
47+
}
48+
49+
for _, tc := range testCases {
50+
b.Run(fmt.Sprintf("%d-lines", tc.numLines), func(b *testing.B) {
51+
benchmarkReadExistingLogs(b, tc.numLines)
52+
})
53+
}
54+
}
55+
56+
func benchmarkReadExistingLogs(b *testing.B, lines int) {
57+
logFilePath := generateLogFile(b, lines)
58+
59+
config := NewConfig()
60+
config.Include = []string{
61+
logFilePath,
62+
}
63+
// Use aggressive poll interval so we're not measuring excess sleep time
64+
config.PollInterval = time.Microsecond
65+
config.StartAt = "beginning"
66+
67+
op, err := config.Build(componenttest.NewNopTelemetrySettings())
68+
require.NoError(b, err)
69+
op.SetOutputIDs([]string{benchmarkOutputID})
70+
71+
doneChan := make(chan struct{})
72+
require.NoError(b, op.SetOutputs([]operator.Operator{newBenchmarkOutput(lines, doneChan)}))
73+
74+
b.ResetTimer()
75+
for range b.N {
76+
require.NoError(b, op.Start(testutil.NewUnscopedMockPersister()))
77+
78+
// Wait until all logs are read
79+
if lines > 0 {
80+
<-doneChan
81+
}
82+
require.NoError(b, op.Stop())
83+
}
84+
}
85+
86+
func generateLogFile(tb testing.TB, numLines int) string {
87+
f := filetest.OpenTemp(tb, tb.TempDir())
88+
for range numLines {
89+
_, err := f.Write(filetest.TokenWithLength(999))
90+
require.NoError(tb, err)
91+
_, err = f.WriteString("\n")
92+
require.NoError(tb, err)
93+
}
94+
return f.Name()
95+
}
96+
97+
type benchmarkOutput struct {
98+
totalLogs int
99+
logsReceived int
100+
doneChan chan<- struct{}
101+
}
102+
103+
// Assert that benchmarkOutput implements the operator.Operator interface
104+
var _ operator.Operator = (*benchmarkOutput)(nil)
105+
106+
func newBenchmarkOutput(totalLogs int, doneChan chan<- struct{}) *benchmarkOutput {
107+
return &benchmarkOutput{
108+
totalLogs: totalLogs,
109+
doneChan: doneChan,
110+
}
111+
}
112+
113+
// CanOutput implements operator.Operator.
114+
func (o *benchmarkOutput) CanOutput() bool { return false }
115+
116+
// CanProcess implements operator.Operator.
117+
func (o *benchmarkOutput) CanProcess() bool { return true }
118+
119+
// GetOutputIDs implements operator.Operator.
120+
func (o *benchmarkOutput) GetOutputIDs() []string { return nil }
121+
122+
const benchmarkOutputID = "benchmark"
123+
124+
// ID implements operator.Operator.
125+
func (o *benchmarkOutput) ID() string { return benchmarkOutputID }
126+
127+
// Logger implements operator.Operator.
128+
func (o *benchmarkOutput) Logger() *zap.Logger { return nil }
129+
130+
// Outputs implements operator.Operator.
131+
func (o *benchmarkOutput) Outputs() []operator.Operator { return nil }
132+
133+
// SetOutputIDs implements operator.Operator.
134+
func (o *benchmarkOutput) SetOutputIDs([]string) {}
135+
136+
// SetOutputs implements operator.Operator.
137+
func (o *benchmarkOutput) SetOutputs([]operator.Operator) error { return nil }
138+
139+
// Start implements operator.Operator.
140+
func (o *benchmarkOutput) Start(operator.Persister) error {
141+
return nil
142+
}
143+
144+
// Stop implements operator.Operator.
145+
func (o *benchmarkOutput) Stop() error {
146+
return nil
147+
}
148+
149+
// Type implements operator.Operator.
150+
func (o *benchmarkOutput) Type() string { return "benchmark_output" }
151+
152+
func (o *benchmarkOutput) Process(_ context.Context, _ *entry.Entry) error {
153+
o.logsReceived++
154+
if o.logsReceived == o.totalLogs {
155+
o.doneChan <- struct{}{}
156+
o.logsReceived = 0
157+
}
158+
return nil
159+
}

0 commit comments

Comments
 (0)