Skip to content

Commit aa6b6b0

Browse files
committed
audit: avoid extra byte slice to string convertion
1 parent ab4b869 commit aa6b6b0

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,23 +68,23 @@ func (b *backend) ProcessEvents(events ...*auditinternal.Event) bool {
6868
}
6969

7070
func (b *backend) logEvent(ev *auditinternal.Event) bool {
71-
line := ""
71+
var err error
72+
var line []byte
7273
switch b.format {
7374
case FormatLegacy:
74-
line = audit.EventString(ev) + "\n"
75+
line = []byte(audit.EventString(ev) + "\n")
7576
case FormatJson:
76-
bs, err := runtime.Encode(b.encoder, ev)
77+
line, err = runtime.Encode(b.encoder, ev)
7778
if err != nil {
7879
audit.HandlePluginError(PluginName, err, ev)
7980
return false
8081
}
81-
line = string(bs[:])
8282
default:
8383
audit.HandlePluginError(PluginName, fmt.Errorf("log format %q is not in list of known formats (%s)",
8484
b.format, strings.Join(AllowedFormats, ",")), ev)
8585
return false
8686
}
87-
if _, err := fmt.Fprint(b.out, line); err != nil {
87+
if _, err := b.out.Write(line); err != nil {
8888
audit.HandlePluginError(PluginName, err, ev)
8989
return false
9090
}

staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package log
1818

1919
import (
2020
"bytes"
21+
"fmt"
2122
"reflect"
2223
"regexp"
2324
"testing"
@@ -162,3 +163,56 @@ func TestLogEventsJson(t *testing.T) {
162163
}
163164
}
164165
}
166+
167+
func BenchmarkLogEvents(b *testing.B) {
168+
sampleEvents := []*auditinternal.Event{
169+
{
170+
AuditID: types.UID(uuid.New().String()),
171+
},
172+
{
173+
AuditID: types.UID(uuid.New().String()),
174+
Level: auditinternal.LevelMetadata,
175+
ObjectRef: &auditinternal.ObjectReference{
176+
Resource: "foo",
177+
APIVersion: "v1",
178+
Subresource: "bar",
179+
},
180+
},
181+
{
182+
ResponseStatus: &metav1.Status{
183+
Code: 200,
184+
},
185+
RequestURI: "/apis/rbac.authorization.k8s.io/v1/roles",
186+
SourceIPs: []string{
187+
"127.0.0.1",
188+
},
189+
RequestReceivedTimestamp: metav1.NewMicroTime(time.Now()),
190+
AuditID: types.UID(uuid.New().String()),
191+
Stage: auditinternal.StageRequestReceived,
192+
Verb: "get",
193+
User: authnv1.UserInfo{
194+
Username: "admin",
195+
Groups: []string{
196+
"system:masters",
197+
"system:authenticated",
198+
},
199+
},
200+
UserAgent: "kube-admin",
201+
ObjectRef: &auditinternal.ObjectReference{
202+
Namespace: "default",
203+
},
204+
},
205+
}
206+
var buf bytes.Buffer
207+
backend := NewBackend(&buf, FormatJson, auditv1.SchemeGroupVersion)
208+
for index, event := range sampleEvents {
209+
b.Run(fmt.Sprintf("sample=%d", index), func(b *testing.B) {
210+
b.ReportAllocs()
211+
b.ResetTimer()
212+
for i := 0; i < b.N; i++ {
213+
backend.ProcessEvents(event)
214+
}
215+
b.StopTimer()
216+
})
217+
}
218+
}

0 commit comments

Comments
 (0)