Skip to content

Commit dadedb8

Browse files
test: add benchmark for OTel Beat processor (#48407) (#48409)
(cherry picked from commit 03fff9b) Co-authored-by: Andrzej Stencel <andrzej.stencel@elastic.co>
1 parent 09b3917 commit dadedb8

1 file changed

Lines changed: 114 additions & 0 deletions

File tree

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
2+
// or more contributor license agreements. Licensed under the Elastic License;
3+
// you may not use this file except in compliance with the Elastic License.
4+
5+
package beatprocessor
6+
7+
import (
8+
"context"
9+
"fmt"
10+
"testing"
11+
12+
"github.com/elastic/beats/v7/libbeat/beat"
13+
14+
"go.opentelemetry.io/collector/pdata/plog"
15+
"go.uber.org/zap"
16+
)
17+
18+
// Runs the OTel Beat processor with a no-op processor inside
19+
// to measure the overhead of the OTel processor itself.
20+
func BenchmarkBeatProcessor(b *testing.B) {
21+
testCases := []testCase{
22+
{
23+
name: "empty log record",
24+
logRecord: func() plog.LogRecord {
25+
logRecord := plog.NewLogRecord()
26+
logRecord.Body().SetEmptyMap()
27+
return logRecord
28+
},
29+
},
30+
{
31+
name: "message",
32+
logRecord: func() plog.LogRecord {
33+
logRecord := plog.NewLogRecord()
34+
logRecord.Body().SetEmptyMap()
35+
logRecord.Body().Map().PutStr("message", "test log message")
36+
return logRecord
37+
},
38+
},
39+
{
40+
name: "Kubernetes log",
41+
logRecord: func() plog.LogRecord {
42+
logRecord := plog.NewLogRecord()
43+
logRecord.Body().SetEmptyMap()
44+
logRecord.Body().Map().PutStr("time", "2026-01-13T13:01:05.551185505Z")
45+
logRecord.Body().Map().PutStr("stream", "stderr")
46+
logRecord.Body().Map().PutStr("log", "W0113 13:01:05.550863 1 warnings.go:70] v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice")
47+
return logRecord
48+
},
49+
},
50+
{
51+
name: "Nginx access log",
52+
logRecord: func() plog.LogRecord {
53+
logRecord := plog.NewLogRecord()
54+
logRecord.Body().SetEmptyMap()
55+
logRecord.Body().Map().PutStr("timestamp", "2025-10-05T13:33:14+00:00")
56+
logRecord.Body().Map().PutStr("pid", "30")
57+
logRecord.Body().Map().PutStr("client_ip", "172.19.0.1")
58+
logRecord.Body().Map().PutStr("request_id", "72e5a0eeb44b6608d161254a5eaf1662")
59+
logRecord.Body().Map().PutStr("http_method", "GET")
60+
logRecord.Body().Map().PutStr("http_path", "/")
61+
logRecord.Body().Map().PutStr("protocol", "HTTP/1.1")
62+
logRecord.Body().Map().PutStr("host", "localhost")
63+
logRecord.Body().Map().PutStr("user_agent", "curl/8.5.0")
64+
logRecord.Body().Map().PutStr("referer", "")
65+
logRecord.Body().Map().PutInt("status_code", 200)
66+
logRecord.Body().Map().PutInt("bytes_sent", 615)
67+
logRecord.Body().Map().PutDouble("request_time_secs", 0.01)
68+
return logRecord
69+
},
70+
},
71+
}
72+
73+
benchmarkBeatProcessor(b, 0, testCases[0])
74+
75+
for _, tc := range testCases {
76+
for _, logCount := range []int{1, 1000} {
77+
benchmarkBeatProcessor(b, logCount, tc)
78+
}
79+
}
80+
}
81+
82+
func benchmarkBeatProcessor(b *testing.B, logCount int, tc testCase) {
83+
b.Run(fmt.Sprintf("%s/%d_logs", tc.name, logCount), func(b *testing.B) {
84+
// Prepare logs.
85+
logs := plog.NewLogs()
86+
resourceLogs := logs.ResourceLogs().AppendEmpty()
87+
scopeLogs := resourceLogs.ScopeLogs().AppendEmpty()
88+
for range logCount {
89+
logRecord := scopeLogs.LogRecords().AppendEmpty()
90+
tc.logRecord().CopyTo(logRecord)
91+
}
92+
93+
// Create Beat processor with a no-op processor inside.
94+
beatProcessor := &beatProcessor{
95+
logger: zap.NewNop(),
96+
processors: []beat.Processor{
97+
mockProcessor{
98+
runFunc: func(event *beat.Event) (*beat.Event, error) {
99+
return event, nil
100+
},
101+
},
102+
},
103+
}
104+
105+
for b.Loop() {
106+
_, _ = beatProcessor.ConsumeLogs(context.Background(), logs)
107+
}
108+
})
109+
}
110+
111+
type testCase struct {
112+
name string
113+
logRecord func() plog.LogRecord
114+
}

0 commit comments

Comments
 (0)