Skip to content

Commit 4898f4c

Browse files
test: add microbenchmark for OTel Beat processor
1 parent cdc7276 commit 4898f4c

1 file changed

Lines changed: 113 additions & 0 deletions

File tree

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

0 commit comments

Comments
 (0)