diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend.go b/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend.go index 2ef2cc6ece92d..25742a07ec681 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend.go +++ b/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend.go @@ -68,23 +68,23 @@ func (b *backend) ProcessEvents(events ...*auditinternal.Event) bool { } func (b *backend) logEvent(ev *auditinternal.Event) bool { - line := "" + var err error + var line []byte switch b.format { case FormatLegacy: - line = audit.EventString(ev) + "\n" + line = []byte(audit.EventString(ev) + "\n") case FormatJson: - bs, err := runtime.Encode(b.encoder, ev) + line, err = runtime.Encode(b.encoder, ev) if err != nil { audit.HandlePluginError(PluginName, err, ev) return false } - line = string(bs[:]) default: audit.HandlePluginError(PluginName, fmt.Errorf("log format %q is not in list of known formats (%s)", b.format, strings.Join(AllowedFormats, ",")), ev) return false } - if _, err := fmt.Fprint(b.out, line); err != nil { + if _, err := b.out.Write(line); err != nil { audit.HandlePluginError(PluginName, err, ev) return false } diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend_test.go b/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend_test.go index 65b64052fd2ef..976331425b2ff 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend_test.go +++ b/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend_test.go @@ -18,6 +18,7 @@ package log import ( "bytes" + "fmt" "reflect" "regexp" "testing" @@ -162,3 +163,56 @@ func TestLogEventsJson(t *testing.T) { } } } + +func BenchmarkLogEvents(b *testing.B) { + sampleEvents := []*auditinternal.Event{ + { + AuditID: types.UID(uuid.New().String()), + }, + { + AuditID: types.UID(uuid.New().String()), + Level: auditinternal.LevelMetadata, + ObjectRef: &auditinternal.ObjectReference{ + Resource: "foo", + APIVersion: "v1", + Subresource: "bar", + }, + }, + { + ResponseStatus: &metav1.Status{ + Code: 200, + }, + RequestURI: "/apis/rbac.authorization.k8s.io/v1/roles", + SourceIPs: []string{ + "127.0.0.1", + }, + RequestReceivedTimestamp: metav1.NewMicroTime(time.Now()), + AuditID: types.UID(uuid.New().String()), + Stage: auditinternal.StageRequestReceived, + Verb: "get", + User: authnv1.UserInfo{ + Username: "admin", + Groups: []string{ + "system:masters", + "system:authenticated", + }, + }, + UserAgent: "kube-admin", + ObjectRef: &auditinternal.ObjectReference{ + Namespace: "default", + }, + }, + } + var buf bytes.Buffer + backend := NewBackend(&buf, FormatJson, auditv1.SchemeGroupVersion) + for index, event := range sampleEvents { + b.Run(fmt.Sprintf("sample=%d", index), func(b *testing.B) { + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + backend.ProcessEvents(event) + } + b.StopTimer() + }) + } +}